Servlet的生命周期的定义:
Servlet是使用java Servlet应用程序设计接口及相关类和方法的java程序。
Servlet的生命周期过程:
Servlet的生命周期主要分为3个阶段;
- 初始化阶段:检测web服务器中是否存在Servlet实例,若不存在,则装载Servlet类并创建Servlet实例,调用Servlet的init(ServletConfig config)初始化方法;
- 服务阶段:初始化完毕,调用Servlet的service(ServletRequest req, ServletResponse res)方法响应客户端的请求;
- 销毁阶段:服务器调用Servlet的destroy()方法移除servlet对象;
注意:init()方法只有在Servlet第一次被请求加载的时候被调用一次,当有客户发出请求Servlet服务时,Web服务器将启动一个新的线程,在该线程中,调用service方法响应客户的请求;在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
若对Servlet生命周期有啥不懂的可以参考以下图片:
接下来举一个简单的描述Servlet生命周期的实例,下面是代码:
分为两步:第一步编写Servlet的java程序;
package cn.itcast.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletLifeDemo implements Servlet {
/**
* Servlet实例被创建后,调用init方法进行初始化
* Servlet什么时候被创建呢?
* *并不是服务器一启动,实例就创建,第一次访问的时候,实例才被创建。
* init方法调用几次?
* *只被调用一次
*/
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("调用了init方法");
}
/**
* Servlet服务什么时候被调用呢?
*有一次请求调用一次
*/
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("调用了service方法");
}
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("调用了destroy方法");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/**
* Servlet实例什么时候被销毁呢?
* *服务器关闭,手动移除。
* destroy调用几次?
* *一次
*/
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
}
第二步:配置Servlet的web.xml配置文件;
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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">
<!-- 先配置Servlet信息 -->
<servlet>
<!-- 配置Servlet名称,名称必须唯一 -->
<servlet-name>ServletLifeDemo</servlet-name>
<!-- 配置Servlet的完全路径(包名+类名) -->
<servlet-class>cn.itcast.servlet.ServletLifeDemo</servlet-class>
</servlet>
<!-- 配置Servlet映射(访问路径) -->
<servlet-mapping>
<!-- 配置Servlet名称,和上面的名称相同 -->
<servlet-name>ServletLifeDemo</servlet-name>
<!-- 配置虚拟路径 (访问路径) 可以是/hello,也可以是/helloservlet,也可以是其他虚拟路径,随便定义-->
<!-- 但在浏览器访问的时候必须加上这个虚拟路径 -->
<url-pattern>/servletLife</url-pattern>
</servlet-mapping>
</web-app>
Servlet虚拟路径的三种配置方法:
*以完全路径开头
*以/开头 格式是“*.扩展名” 可以命名为 /demo 也可以命名为 /servlet/demo ,然后通过虚拟路径访问
*目录匹配
*以/开头 格式是以正斜杠(/)开头并以“/*”结尾。可以命名为 /* 也可以命名为 /aa/* 然后可以通过 /demo或者 /servlet/demo都能访问
*扩展名匹配
*不能以/开头 可以命名为 *.do 也可以命名为 *.action 然后可以通过 demo.do或者 /servlet/demo.do都能访问,但必须以.do结尾
*虚拟路径优先级:完全优先级>目录匹配>扩展名匹配
如果想更深刻的理解虚拟文件路径的优先级顺序:
对于如下的一些映射关系:
Servlet1 映射到 /abc/* Servlet2 映射到 /* Servlet3 映射到 /abc Servlet4 映射到 *.do 问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应 Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2.
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应 Servlet引擎将调用Servlet2。
参考:传智播客 www.itcast.cn