Servlet的生命周期

Servlet生命分为四个阶段:

1.加载

这个阶段由Servlet容器完成。例如tomcat,jetty等。当容器加载一个Servlet后不会立刻实例化它。通常是在用户第一次请求时完成实例化操作。

2.实例化和初始化

在Servlet实例化之后它会调用它的init()方法,在这个方法里可以写上所需的初始化参数,并且该方法只会被调用一次。

*需要注意的是容器创建Servlet实例是通过java反射机制创建的,调用的是默认构造函数,所以编写Servlet类时通常不应提供带参数的构造方法。

3.请求处理

所有的请求都会走service()方法,无论是get请求还是post请求。但是通常情况下你不必关心service方法,你只需要重写HttpServlet类的doGet方法或者doPost方法处理对应的请求。在HttpServlet类中它实现了判断用户请求类型并交给对应的方法进一步处理。

service()方法是主要的方法来执行实际的任务。 servlet容器(如Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并写格式化响应返回给客户端。

每次服务器接收到一个servlet请求时,服务器产生一个新的线程并调用服务。 service()方法检查HTTP请求类型(GET,POST,PUT,DELETE等),并调用doGet,doPost方法,doPut,doDelete,等适当的方法。

由容器和服务方法service()方法被调用时调用doGet,doPost方法,doPut,doDelete等适当的方法。所以,service()方法什么都不用做,但你只需要重写doGet()或doPost()方法,但取决于你是什么类型的请求从客户端接收。

4.服务终止

当容器检测到Servlet实例被销毁时,就会调用destroy()方法。

一个servlet的生命周期结束时,destroy()方法只会被调用一次。这种方法可以让你的servlet关闭数据库连接,停止后台线程,写入Cookie列表,或打计数到磁盘,并执行其他类似的清理活动的机会。

clip_image001

*注意:上图中的第2和第3步都是处理用户请求,其实可算做一步。每个request请求都会调用service方法,service方法再解析报头,将请求交给doGet或doPost方法处理。


一、创建Servlet对象的时机

1、Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

2、在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会 判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的service方法。

3、Servlet的类文件被更新后,重新创建Servlet

      Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

二、销毁Servlet对象的时机

1、Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。以上所讲的就是Servlet对象的生命周期。那么Servlet容器如何知道创建哪一个Servlet对象?


Servlet根据配置文件启动流程:

Servlet对象如何配置?实际上这些信息是通过读取web.xml配置文件来实现的。

Servlet容器启动的时候读取<servlet>配置节信息,根据<servlet-class>配置节信息创建 Servlet对象,同时根据<init-param>配置节信息创建HttpServletConfig对象,然后执行Servlet对象 的init方法,并且根据<load-on-startup>配置节信息来决定创建Servlet对象的顺序,如果此配置节信息为负数或者没 有配置,那么在Servlet容器启动时,将不加载此Servlet对象。当客户访问Servlet容器时,Servlet容器根据客户访问的URL地 址,通过<servlet-mapping>配置节中的<url-pattern>配置节信息找到指定的Servlet对象,并 调用此Servlet对象的service方法。


架构图:

下图显示了一个典型的servlet的生命周期的情况。

  • 第一个到服务器的HTTP请求被委派到servlet容器。
  • servlet容器装载,然后再调用这个servlet的service()方法。
  • 然后servlet容器产生多个线程,每个线程执行一个单一的servlet实例的service()方法的处理多个请求。

clip_image001


    Servlet工作原理:

    首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应 的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层 的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或 doPost等这些方法。

    每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到 Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此 HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

    Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以 HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为 HttpRequest和HttpResponse。


    参考:

    http://5181028.blog.51cto.com/5171028/1243443

    http://www.yiibai.com/servlets/servlets_life_cycle.html

    http://sunnylocus.iteye.com/blog/342996

    http://www.cnblogs.com/cuiliang/archive/2011/10/21/2220671.html

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值