Servlet编程专题1之Servlet生命周期

时间:2022-06-13 21:05:11

1、Servlet初步认识:

-  通常来说,Servlet是宏观上Servlet规范中的一个具体的接口,Servlet规范中包含一套接口。而Servlet接口仅仅是其中之一。

-  从微观地角度上讲,Servlet是Servlet接口实现类的一个实例对象,是运行在服务器上的一段Java小程序,即Server Applet,也就是Servlet这个单词的由来。Servlet的主要功能是根据客户端提交的请求,调用服务器端相关java代码,完成对请求的处理和运算。


2、Servlet生命周期:

a、所谓Servlet生命周期是指:Servlet对象的创建、Servlet对象的初始化、Servlet对象服务的执行以及最后Servlet对象被销毁的整个过程。

Servlet编程专题1之Servlet生命周期

-  Servlet的整个生命周期过程的执行,均由Web服务器负责管理,即Servlet从创建到服务到销毁的整个过程中方法的调用,都是由Web服务器负责调用执行,程序员无法控制其执行流程。

-  但是程序员可以获取到Servlet的这些生命周期时间点(实例化、初始化、服务以及销毁时间点),并可以指定让Servlet做一些具体业务相关的事情。


b、Servlet生命周期具体方法执行流程:

Servlet编程专题1之Servlet生命周期


-  说明:

a、当请求发送到Web容器后,Web容器会解析请求URL,并从中分离出Servlet对应的URI。

b、根据分离出来的URI,通过web.xml中配置的URI和Servlet的映射关系,找到要执行的Servlet,即找到用于处理该请求的Servlet。

-  web.xml中配置的URI和Servlet的映射关系表示如下:

Servlet编程专题1之Servlet生命周期


c、若该Servlet不存在,则调用该Servlet的无参数构造器,init()方法,实例化该Servlet,然后执行service()方法。

d、若该Servlet已经被创建,则直接调用service方法。

e、当web容器被关闭,或者该应用被关闭,则调用执行destroy()方法,销毁该Servlet实例。


3、Servlet特征:

a、Servlet是单例多线程的。

b、一个Servlet实例只会执行一次无参数构造器与init()方法,并且是在第一次访问时执行。

c、用户每提交一次对当前Servlet的请求,就会执行一次service()方法。

d、一个Servlet实例只会执行一次destroy()方法,在应用停止时执行。

e、由于Servlet是单例多线程的,所以为了保证其线程安全性,一般情况下是不为Servlet类定义可修改的成员变量。因为每个线程均可修改这个成员变量,会出现线程安全问题。

f、默认情况下,Servlet在Web容器启动时是不会被实例化的。


3、在web.xml文件中注册Servlet时,如果希望Servlet在Web容器启动时创建Servlet需要在<servlet>标签中设置<load-on-startup>标签。

Servlet编程专题1之Servlet生命周期


4、Web容器中的两个Map:

-  当Servlet实例被创建好后放在了哪里?web.xml中URI和Servlet的映射关系反映到内存中是以什么样的形式存在的呢?

-  当Servlet实例被创建好之后,会将该Servlet实例的引用放入到一个Map集合中。该Map集合的key为URI,而value则为Servlet实例的引用,即Map<String,Servlet>。当Web容器从用户请求中分离出URI后,会首先到这个Map中查找是否存在其所对应的value。若存在,则直接调用其service()方法。若不存在,则需要创建该Servlet实例。

-   若请求的Servlet实例不存在,Web容器又是根据什么创建这个Servlet实例的呢?在Web容器的内存中,还存在一个Map集合。该Map集合的key为URI,而value则为web.xml中配置的与之对应的Servlet的全限定性类名,即Map<String, String>。

-   当Web容器从用户请求中分离出URI后,到第一个Map中查找没有找到其所对应的Servlet实例,则会马上查找这第二个Map,从中找到其所对应的类名,再根据反射机制,创建这个Servlet实例。然后再将这个创建好的Servlet的引用放入到第一个Map中。


5、关于getServletInfo()方法:

-  Servlet接口中的方法getServletInfo(),是由程序自己定义的有关当前Servlet的一些基本信息,不属于Servlet生命周期中的方法。对程序的运行没有任何影响和作用,仅仅是返回一些让他人阅读的信息而已。

javax.servlet.Servlet接口中getServletInfo()的方法描述说明:

Servlet编程专题1之Servlet生命周期


6、附:需要注意,同一个URI只能够映射一个Servlet。

Servlet编程专题1之Servlet生命周期


本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1972458