《Servlet与JSP核心编程》读书笔记——servlet生命周期

时间:2022-04-07 16:51:20

servlet的生命周期

服务器只创建每个servlet的 单一实例,每个用户请求都会引发新的线程——将用户请求交付给相应的doGet或doPost进行处理。servlet单一实例,减少了产生servlet的开销,在一个面向模块化开发的过程中,常常一个点击操作就被定义为一个servlet的实现,而如果servlet的每一次被访问,都创建一个新的实例的话,服务器的可用资源消耗量将是一个相当重要的问题。退一步,一般servlet的访问是很快的,每一个实例被快速的创建,又被快速的回收,GC的回收速度也跟不上,频繁的内存操作也将可能带来次生的问题。
首次创建servlet时,它的init方法会得到调用,因此init是放置一次性设置代码的地方,在这之后,针对每个用户请求,都会创建一个线程,该线程调用前面创建的实例的service方法。多个并发请求会导致多个线程同时调用service方法。之后,由service方法依据接收到的HTTP请求的类型,调用doGet,doPost或其他doXxx方法,最后如果服务器决定卸载某个servlet,他会首先调用servlet的destory方法。

service方法

如果在servlet中同等地处理POST和GET请求,可以让doPost方法调用doGet方法,或者相反,不要覆盖service方法,原因有三点:

  • service方法中还支持其他HTTP请求的方法
  • getLastModified由默认的service方法调用

PS:HTTP请求头中有If-Modified-Since,仅当页面在指定的日期之后发生改变的情况下,客户程序才希望获取该页面,如果没有更新的结果,则服务器发送304报头(No Modified)。

HTTP响应报头中有Last-Modified,表明文件的最后修改时间,只有在Last-Modified日期比If-Modified-Since指定的日期要晚时才会返回新的页面,否则客户程序使用缓存中的页面。

  • service提供对HEAD、OPTION和TRACE请求的自动支持

init方法

init方法在servlet初次创建时被调用,之后处理每个用户请求时,则不再调用这个方法。init初始化有两种类型:常规初始化,以及由初始化参数控制的初始化。
servlet一般在用户首次调用对应servlet的URL时创建,但也可以指定servlet在服务器启动后自动载入。
如:
<servlet>  
	<servlet-name>StartServlet</servlet-name>  
	<servlet-class>com.web.StartServlet</servlet-class>  
	<load-on-startup>1</load-on-startup>  
</servlet>  
这里当load-on-startup值为0或者大于0时,表示服务器在启动时就加载这个servlet;当是一个负数时或者没有指定时,则指示服务器在该servlet被访问时才加载。正数的值越小,启动该servlet的优先级越高。
init初始化中常规初始化只是在创建或载入servlet的生命期内用到的一些数据,或者执行某些一次性计算。
初始化参数控制的初始化是在web.xml中配置,向web.xml文件中servlet元素添加init-param子元素,可以指定初始化参数的名称和值,在servlet的init方法中,获取ServletConfig对象的引用,以init参数的名称为参数,调用ServletConfig的geInitParameter方法,返回参数值或者null——如果web.xml文件中没有找到这个init参数。
两种方法获取初始化参数
<servlet>  
    <servlet-name>InitParamServlet</servlet-name>  
    <servlet-class>InitParamServlet</servlet-class>  
    <init-param>  
        <param-name>test</param-name>  
        <param-value>test</param-value>  
    </init-param>  
 </servlet>
第一种:
    public void init(ServletConfig config) throws ServletException {  
        String initParam=config.getInitParameter("test");  
    } 
第二种:
String test = this.getInitParameter("test");
从上面的方法可以看出,他们都是调用的getInitParameter方法,在查看了Servlet文档后,发现HttpServlet继承自GenericServlet,而GenericServlet实现ServletConfig,getInitParameter方法是在ServletConfig中的,所以其实他们都是调用的同一个方法,只是写法不同罢了。

destory方法

在服务器移除servlet之前,它会调用servlet的destory方法,关闭数据库连接、停止后台运行的线程等等。