A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zzj123 黑马粉丝团   /  2017-6-13 11:31  /  2328 人查看  /  1 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

一、Servlet概述
1、Servlet是SUN制定的一套开发动态Web页面的规范。它是JavaEE技术中的一种
2、Tomcat服务器实现了Servlet规范。XX容器:实现了什么技术的服务器就称之为什么容器。
二、如何编写一个Servlet:编写步骤
1、建立标准的JavaWeb应用的目录结构
FirstApp
        WEB-INF
                classes
                lib
                web.xml
2、进入WEB-INF/classes目录下,编写一个类
package com.itheima.servlet;
import javax.servlet.*;
import java.io.*;
public class HelloServlet extends GenericServlet{
        public void service(ServletRequest req,
                             ServletResponse res)
                      throws ServletException,
                             java.io.IOException{
                String data = "Hello World";
                res.getOutputStream().write(data.getBytes());
        }

}
3、编译该类。不要忘记设置classpath,把servlet-api.jar加进来
set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
javac -d . HelloServlet.java
4、映射Servlet。修改web.xml文件
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
        <servlet>
        <servlet-name>fuck</servlet-name>
        <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
   </servlet>
        <servlet-mapping>
        <servlet-name>fuck</servlet-name>
        <url-pattern>/fuck</url-pattern>
    </servlet-mapping>
</web-app>
5、部署当前web应用,拷贝到Tomcat\webapps目录下,并启动Tomcat
6、访问:http://localhost:8080/FirstApp/fuck

三、GenericServlet和HttpServlet抽象类
1、如果直接实现了Servlet接口或者继承GenericServlet,需要实现service方法。
2、如果是继承HttpServlet,不要覆盖service方法。
原因:在HttpServlet的service方法中,有标准的HTTP请求处理。会根据用户的请求方式,分发给doXXX方法。(模板方法设计模式)
而doXXX方法,给了一个错误的输出,且是protected类型的。
所以:在继承HttpServlet编写Servlet时,应该覆盖掉doXXX方法。
3、修改MyEclipse生成Servlet的模板
a、关闭MyEclipse
b、在MyEclipse的安装目录下搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
c、打开该jar包,templates目录下找Servlet.java的文件,该文件就是模板
d、修改前先 备份

细节:
1、同一个Servlet可以被映射到多个地址上
2、可以使用通配符*进行映射
有两种写法:
以"/"开头,以*结尾
以"*"开头

多个通配符匹配的原则:"/"开头的优先级高,找最匹配的。
3、如果某个Servlet的映射为"/",那么该Servlet就是缺省Servlet,它负责在web.xml没有对应的url请求时的处理。

四、Servlet的生命周期
Servlet对象在创建时会执行init方法,第一次被访问时。
destory方法会在释放对象时执行。
service方法:每一次请求都会调用该方法。
在web.xml中,注册Servlet时,如果配置了以下标签<load-on-startup>1</load-on-startup>(取值为一个正整数)
那么Tomcat在加载该应用时,就会完成对该Servlet的实例化和初始化。

出现的问题:线程安全
1、尽量使用局部变量;实在是必须使用实例变量时,做同步处理,尽量包含少的代码。
SingleThreadModel:实现该接口能解决资源竞争问题。具体处理办法,由服务器决定。
a、把代码做了同步处理
b、搞了一个对象池:Tomcat采取该方式

五、ServletConfig接口
代表某个Servlet的初始化参数。每个Servlet都有自己对应的ServletConfig对象。
getInitParameterNames() :获取所有的参数名称
getInitParameter(java.lang.String name) :获取指定参数的取值。

参数和取值对应<init-param>标签
<servlet>
    <servlet-name>ServletDemo5</servlet-name>
    <servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
    <init-param>
            <param-name>xxx</param-name>
            <param-value>yyy</param-value>
    </init-param>
    <init-param>
            <param-name>aaa</param-name>
            <param-value>bbb</param-value>
    </init-param>
  </servlet>

六、ServletContext接口
1、相当重要。代表当前JavaWeb应用。每一个JavaWeb应用都有自己的ServletContext对象。
2、是一个域对象。(Map<String,Object>)可以通过以下方法存取该域
Object getAttribute(String name)
void setAttribute(String name,Object obj)
void removeAttribute(String name)
3、可以读取当前应用的全局参数
web.xml
<web-app>
        <context-param>
                <!-- 全局参数配置 -->
                <param-name>encoding</param-name>
                <param-value>ISO-8859-1</param-value>
        </context-param>
</web-app>
4、getRealPath(String path)
获取当前JavaWeb应用中的任何资源。path必须以/开头,代表当前应用。
5、实现请求转发
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo6");
rd.forward(request, response);//转发

a、转发前,会清空response的缓存。因此,转发前所有的response输出都无效。
b、转发后,所有的输出也无效。

注:转发前不要清空response对象的缓存。

只有目标资源的输出才会显示。
七、读取配置文件的三种方式
xml、properties
1、ServletContext.getRealPath(String path)
可以读取当前应用中的任何资源。
2、ResourceBundle读取*.properties的文件。
只能读取类路径下的properties的配置文件。
3、类加载器加载配置文件
只能读取类路径下的所有的资源文件。

1 个回复

正序浏览
棒棒棒的啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马