JavaWeb技术是当今主流的互联网Web应用技术之一,而Servlet是JavaWeb技术的核心基础。
一、Servlet的层次结构
实现Servlet有三种方式:
实现Servlet接口;
继承GenericServlet类;
继承HttpServlet类(最佳选择)。
二、Servlet的生命周期
上图表示了Servlet的声明周期,但是其中的某些步骤是在什么时候执行的呢
1、在Tomcat容器启动时,便会加载所有的Servlet。
2、服务器 在创建Servlet实例有两种情况
a、没有配置load-on-startup这个设置,在请求到达这个Servlet时服务器才会创建Servlet实例
b、配置了load-on-startup这个选项大于等于0时,服务器会在Tomcat容器启动时创建Servlet的实例
3、当Servlet收到请求时,便会调用service方法去处理请求
4、当容器关闭时,Servlet会调用destory方法卸载Servlet
三、Servlet的映射规则
a、将/<URLName>为上下文路径的请求映射到某一Servlet类(/URLName)
<servlet>
<servlet-name>ServletDemo</servletname>
<servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/demo</url-pattern>
</url-mapping>
上述就是将以/demo的请求交给project.ServletDemo类来处理
b、映射所有以<path>为上下文路径的请求到某一Servlet类(/path/*)
<servlet>
<servlet-name>ServletDemo</servletname>
<servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/demo/*</url-pattern>
</url-mapping>
上述就是将所有以/demo为起始路径的请求都交给project.ServletDemo类来处理
c 、映射所有以.<ext>为扩展名的请求到某一Servlet类(*.ext)
<servlet>
<servlet-name>ServletDemo</servletname>
<servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>*.do</url-pattern>
</url-mapping>
上述就是将所有以*.do结尾的请求都交给project.servletDemo类处理
d、/*和/
<servlet>
<servlet-name>ServletDemo</servletname>
<servlet-class>project.ServletDemo</servlet-class>
</servlet>
<url-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/</url-pattern>
</url-mapping>
这两个是有区别的,/*会拦截所有的请求,因为/*可以匹配到所有的url路径。配置为/时,意为缺省匹配。即当所有url都匹配不到时,才会选中/,比如请求为.jsp结尾的。
e、不支持如下映射
<url-pattern>/*.do</url-pattern>
<url-pattern>/bim/*.action</url-pattern>
f、当使用Servlet3.0及以上是时
Serlvet3.0以后,不用在web.xml中配置servlet和servlet-mapping,只需在类中添加:
@WebServlet(displayName = "UserServlet", name = "UserServlet",
urlPatterns = { "/user" }, loadOnStartup = 1, //启动项
initParams = { @WebInitParam(name = "username", value = "张三") })
四、Servlet的域对象
Servlet三大域对象:
ServletContext:范围最大,应用范围!
HttpSession :会话范围!
HttpServletRequest:请求范围!
a、ServletContext的生命周期
在容器启动时ServletContext就已经创建了
当容器关闭时ServletContext会被卸载
一个项目只有一个ServletContext对象
b、ServletContext的获取
通过ServletConfig的getServletContext,ServletConfig是init方法的参数,所以这种方式只能在init方法中获取
GenericServlet代理了ServletConfig的所有方法。所以在GenericServlet的子类中可以使用如下方式获取:
this.getServletContext来获取
this.getServletConfig().getServletContext()来获取
HttpSession也有getServletContext方法,所以也可以使用session.getServletContext获取ServletContext对象
c、ServletContext对属性的操作
void setAttribute(String name,Object value)来存储属性
Object getAttribute(String name)来获取属性
void removeAttribute(String name)来移除属性
五、Servlet细节
1、Servlet是单例的、并且是线程不安全的。所以尽可能的不创建成员变量。
2、Servlet的创建默认是第一次请求时创建。配置load-on-startup大于等于0的整数时会在容器启动时创建。
3、url-pattern可以使用*表示所以字符,但是不匹配/,使用要求为
a、要么在头,要么在尾。不能在中间
b、如果不使用通配符,必须使用/开头
c、如果一个请求路径匹配了多个url-pattern,那么匹配更加明确的哪一个。