8.1 Servlet生命周期
Servlet程序是运行在服务器端的一段Java程序,其生命周期将受到Web容器的控制,生命周期包括:加载程序、初始化、服务、销毁、卸载五个部分。
8.2 Servlet生命周期对应的方法
各个生命周期的作用
• 加载Servlet
• WEB容器负责加载Servlet,当WEB容器启动的时候或者是在第一次使用这个Servlet的时候,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载之后,WEB容器会通过反射的方式对Servlet进行实例化。• 初始化
• 当一个Servlet被实例化之后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,例如:建立数据库连接、读取资源文件信息等,如果初始化失败,则此Servlet将被直接卸载。
• 处理服务
• 当有请求提交时,Servlet将调用service()方法(常用的是doGet()或doPost())进行处理,在service()方法中,Servlet可以通过ServletRequest接收客户的请求,也可以利用ServletResponse设置响应信息。
• 销毁
• 当WEB容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
• 卸载
• 当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet的时候,会重新调用init()方法初始化。
如果觉得Servlet生命周期不好理解的话,读者可以按照人的生命周期进行对照,每个人的一生都要经历如下步骤:孕育生命、出生、成长、死亡、销毁。
LifeCycleServlet.java
package com.org; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LifeCycleServlet extends HttpServlet { // 继承HttpServlet public void init() throws ServletException { // 初始化操作System.out.println("** 1、Servlet初始化 --> init()"); } public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { // 处理服务System.out.println("** 2、Servlet服务 --> doGet()、doPost()"); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { // 处理服务this.doGet(req, resp); // 调用doGet() } public void destroy() { // Servlet销毁System.out.println("** 3、Servlet销毁 --> destroy()"); } }
在web.xml中配置Servlet
<servlet> <!-- 定义servlet --> <servlet-name>life</servlet-name> <!-- 与servlet-mapping对应--><servlet-class> <!-- 定义包.类名称-->com.org.LifeCycleServlet </servlet-class> </servlet> <servlet-mapping> <!-- 映射路径--> <servlet-name>life</servlet-name> <!-- 与servlet相对应--><url-pattern>/LifeServlet</url-pattern> <!-- 页面的映射路径--></servlet-mapping>
配置启动选项
<servlet> <!-- 定义servlet --> <servlet-name>life</servlet-name> <!-- 与servlet-mapping对应 --> <servlet-class> <!-- 定义包.类名称 --> org.lxh.servletdemo.LifeCycleServlet </servlet-class> <load-on-startup>1</load-on-startup><!-- 自动加载 --> </servlet>
8.3 Servlet的多线程机制
• Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。
• 当客户端第一次请求某个Servlet时,Servlet 容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有 多个线程在使用这个实例。• Servlet容器会自动使用线程池等技术来支持系统的运行