`
zhaolei415
  • 浏览: 166483 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet的生命周期

阅读更多
我们之前使用的都是javax.servlet.http.HttpServlet,这个类实现了javax.servlet.Servlet接口,而这个接口中定义的三个方法是所有servlet都必须实现的。
package javax.servlet;

public interface Servlet {

    void init(ServletConfig config);

    void service(ServletRequest request, ServletResponse response);

    void destroy();

}


       

如图所示,tomcat之类的服务器首先根据web.xml中的定义实例化servlet,然后调用它的init()方法进行初始化,init()方法的ServletConfig参数是服务器传递进servlet的,其中包含web.xml配置的初始化信息和 ServletContext对象等共享内容。

初始化后的servlet实例便进入等待请求的状态,当有与servlet-mapping匹配的请求进入时,服务器会调用servlet实例的service方法,传入ServletRequest与ServletResponse两个参数等待servlet处理完毕。

注意一点,对于每个web应用,内存中只存在一个servlet实例,所有请求都是调用这个servlet实例,所以我们说 servlet不是线程安全的,所有操作都要限制在service()方法中进行,不要在servlet中定义类变量。(doGet()和 doPost()是HttpServlet覆盖service()方法后分支出来的辅助方法,实际上服务器调用的还是service()。)

当web应用卸载时,服务器会调用每个已经初始化的servlet的destroy(),然后销毁这些servlet实例,如果你需要在servlet销毁时释放什么资源的话,可以写在destory()方法中。

那么servlet是在什么时候进行初始化的呢?我们可以通过web.xml中的load-on-startup标签。

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>anni.TestServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
    

load-on-startup的值是一个整数,当它大于等于零的时候服务器会在web发布的时候初始化servlet。当它小于零或者我们没有设置load-on-startup的时候,服务器会在用户第一次访问servlet的时候才去初始化servlet。

或许你对load-on-startup为什么是一个整数存有疑问,为什么不是true和false呢?这是因为如果我们在 web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load- on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。

回头看看javax.servlet.Filter中也有init()和destroy()方法,它的声明周期与servlet基本一致,服务器使用init()对Filter初始化,销毁Filter的时候调用destroy()方法,只是过滤器就不在有load-on- startup设置了,它总是会在服务器启动的时候进行初始化,然后按照web.xml定义的顺序依次执行。
分享到:
评论
1 楼 pouyang 2011-02-11  
谢谢你的分享。
我觉得servlet有三个用处:
1、普通servlet业务处理,输出html脚本。
2、过滤器,例如权限,编码过滤等。
3、监听器,实现相应的监听接口,例如对session的监听等。

相关推荐

Global site tag (gtag.js) - Google Analytics