Servlet生命周期探寻

来源:互联网 发布:vb.net get set 编辑:程序博客网 时间:2024/06/06 04:23

     Servlet的生命周期:

        首先创建一个原生的Servlet,实现Servlet接口的TestServlet,共有5个方法void init(ServletConfig sc),void destory(),ServletConfig getServletConfig(),String getServletInfo()

,void service(ServletRequest servletRequest,ServletResponse response),为了方便测试,我们添加一个Servlet空参构造器,来查看Servlet什么时候被构造。其中真正在调用Servlet是被调用的是构造器,init(),service(),当服务器被关闭前调用destory方法。我们可以测试一下

package com.servlet.test;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 TestServlet implements Servlet{public TestServlet() {System.out.println("TestServlet Constructor...");}@Overridepublic void destroy() {System.out.println("TestServlet Destory...");}@Overridepublic ServletConfig getServletConfig() {// TODO Auto-generated method stubreturn null;}@Overridepublic String getServletInfo() {// TODO Auto-generated method stubreturn null;}@Overridepublic void init(ServletConfig arg0) throws ServletException {// TODO Auto-generated method stub    System.out.println("TestServlet init...");}@Overridepublic void service(ServletRequest arg0, ServletResponse arg1)throws ServletException, IOException {// TODO Auto-generated method stubSystem.out.println("TestServlet Service...");}}
其中web.xml如下配置:

 <servlet>      <servlet-name>TestServlet</servlet-name>      <servlet-class>com.servlet.test.TestServlet</servlet-class>  </servlet>  <servlet-mapping>      <servlet-name>TestServlet</servlet-name>      <url-pattern>/*</url-pattern>  </servlet-mapping>
在第一次发送请求时会有如下结果

TestServlet Constructor...
TestServlet init...
TestServlet Service...

然后没发送一次请求会调用一次Service方法,不会待用构造器,从这里可以看出Servlet在服务器端可能是单例的。

如果配置文件做如下修改

  <servlet>      <servlet-name>TestServlet</servlet-name>      <servlet-class>com.servlet.test.TestServlet</servlet-class>      <load-on-startup>1</load-on-startup>  </servlet>
则会在启动服务器的时候调动构造器,init方法

在发送请求时才会调用Service()方法。

在关闭服务器前调用destory方法。

    所以可得知创建Servlet对象的时机:

  1. Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。
  2. 在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet 对象的service方法。
  3. Servlet Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

另外说一句题外话,Servlet容器是通过web.xml中的全类名反射创建实例的,如果在TestServlet中的空参构造修改有有参数的构造器,在第一次初始化Servlet是会发生InstantiationException异常,实例化异常。如要要进一步理解Servlet如何被创建则需要查看Tomcat等服务器的源码实现,楼主还是菜鸟一枚,也正在努力中。

0 0
原创粉丝点击