Servlet的生命周期可以控制的只是初始化、服务、销毁。其它的操作都会由容器来负责完成。
在HttpServlet类里面提供有以下的几个方法来负责生命周期的处理: 1、初始化:public void init() throws ServletException |————默认情况下是在Servlet第一次使用的时候初始化; 2、服务(主要是处理GET与POST请求): (1)处理GET请求:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException (2)处理POST请求:protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException 3、销毁:public void destroy() |————一个Servlet长时间不使用,为了保证资源的节约,自动销毁; |————当容器关闭的时候,自动调用销毁操作; |————当Tomcat自动重新加载的时候也会销毁。 范例:观察生命周期
package org.lks.demo; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class LifeServlet extends HttpServlet { public void init() throws ServletException { System.out.println("[LifeServlet] init..."); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("[LifeServlet] get..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("[LifeServlet] post..."); } public void destroy() { System.out.println("[LifeServlet] destory..."); } } <servlet> <servlet-name>LifeServlet</servlet-name> <servlet-class>org.lks.servlet.LifeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LifeServlet</servlet-name> <url-pattern>/lift.servlet<url-pattern> </servlet-mapping>对于初始化的控制方法,也可以在容器启动的时候设置为默认初始化,那么需要在web.xml文件里面增加如下配置:
<load-on-startup>1</load-on-startup>加入以上的配置之后,Servlet会在容器启动的时候自动进行初始化的操作。
以上给出的几个操作方法,严格来讲是使用最多的几个方法,但是对于初始化和服务的方法在HttpServlet类里面还是有其他定义的: (1)初始化方法:public void init(ServletConfig config) throws ServletException |————可以读取初始化的配置参数数据; (2)服务方法: |————GenericServlet:public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException |————HttpServlet:protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
HttpServlet类中的service()方法是一个普通方法,已经实现好的方法。 范例:观察扩展生命周期
package org.lks.demo; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class LifeServlet extends HttpServlet { public void init() throws ServletException { System.out.println("[LifeServlet] init..."); } @Override public void init(ServletConfig config) throws ServletException { System.out.println("[LifeServlet] init, parameter: " + config.getInitParameter("data")); } @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("[LifeServlet] service..."); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("[LifeServlet] get..."); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("[LifeServlet] post..."); } public void destroy() { System.out.println("[LifeServlet] destory..."); } } <servlet> <servlet-name>LifeServlet</servlet-name> <servlet-class>org.lks.demo.LifeServlet</servlet-class> <init-param> <param-name>data</param-name> <param-value>HELLO</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>LifeServlet</servlet-name> <url-pattern>/lift.servlet<url-pattern> </servlet-mapping>此时可以发现无参的初始化方法将不再起作用,而变为了可以读取初始化配置参数的方法执行。同时可以发现,一旦覆写了service()方法之后,doGet()和doPost()两个方法将不再执行了。因为在HttpServlet类中的service()方法里面会接收用户的请求类型,如果发现这个请求类型是GET请求,这个方法自动调用doGet()方法(此方法是交给子类覆写的),也就是说整个Servlet之中如果子类要想处理GET请求就必须覆写doGet()方法,如果要想处理POST请求,就必须按照要求覆写doPost()方法,那么这就是一个最典型的模板设计模式。
