一、请求响应过程图
二、生命周期各个阶段
1、创建和初始化阶段
当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象(有可能随着应用的启动而创建),如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。
2、运行阶段
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。
3、销毁阶段
当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。
三、演示Servlet生命周期方法的执行
1、拷贝上面的Servlet,改为HelloWorldServlet,增加生命周期方法
package cn.itcast.firstapp.servlet;
import javax.servlet.*;
public class HelloWorldServlet extends GenericServlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init methed is called");
}
public void service(ServletRequest request, ServletResponse response) throws ServletException {
System.out.println("Hello World");
}
public void destroy() {
System.out.println("destroy method is called");
}
}
2、编译HelloWorldServlet.java
3、拷贝HelloWorldServlet.class到tomcat,位置同上
4、在web.xml配置HelloWorldServlet
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>cn.itcast.firstapp.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorldServlet</url-pattern>
</servlet-mapping>
5、重新启动tomcat 然后发送如下请求
http://localhost:8080/chapter03/HelloWorldServlet
刷新浏览器,多次访问
四、自动加载servlet
在实际开发时,有时候会希望某些Servlet可以在Tomcat启动时随即启动。例如,当启动一个Web项目时,首先需要对数据库信息进行初始化。这时,只需要使用web.xml文件中<load-on-startup>元素,将初始化数据库的Servlet配置为随着web应用启动而启动的Servlet即可。
<load-on-startup>元素是<servlet>元素的一个子元素,它用于指定Servlet被加载的时机和顺序。在<load-on-startup>元素中,设置的值必须是一个整数。如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正整数或0,Servlet容器将在Web应用启动时加载并初始化Servlet,并且<load-on-startup>的值越小,它对应的Servlet就越先被加载。
在web.xml中增加<load-on-startup>元素,如下:
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>cn.itcast.firstapp.servlet.HelloWorldServlet</servlet-class>
<!--设置servlet在web应用启动时初始化-->
<load-on-startup>1</load-on-startup>
</servlet>
再重新启动tomcat,就能看到初始化方法被调用,如下: