您的位置:首页 > 编程语言

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

2017-10-15 10:27 302 查看
1、Servlet初步认识:
- 通常来说,Servlet是宏观上Servlet规范中的一个具体的接口,Servlet规范中包含一套接口。而Servlet接口仅仅是其中之一。
- 从微观地角度上讲,Servlet是Servlet接口实现类的一个实例对象,是运行在服务器上的一段Java小程序,即Server Applet,也就是Servlet这个单词的由来。Servlet的主要功能是根据客户端提交的请求,调用服务器端相关java代码,完成对请求的处理和运算。

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




- Servlet的整个生命周期过程的执行,均由Web服务器负责管理,即Servlet从创建到服务到销毁的整个过程中方法的调用,都是由Web服务器负责调用执行,程序员无法控制其执行流程。
- 但是程序员可以获取到Servlet的这些生命周期时间点(实例化、初始化、服务以及销毁时间点),并可以指定让Servlet做一些具体业务相关的事情。

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




- 说明:
a、当请求发送到Web容器后,Web容器会解析请求URL,并从中分离出Servlet对应的URI。
b、根据分离出来的URI,通过web.xml中配置的URI和Servlet的映射关系,找到要执行的Servlet,即找到用于处理该请求的Servlet。
- web.xml中配置的URI和Servlet的映射关系表示如下:
<!-- 注册Servlet -->
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>com.geeklicreed.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my-serlvet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>


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 -->
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>com.geeklicreed.servlet.MyServlet</servlet-class>
<!-- 设置0的优先级最高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>my-serlvet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>

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()的方法描述说明:



6、附:需要注意,同一个URI只能够映射一个Servlet。
The servlets named [some-servlet] and [some-servlet2] are both mapped to the url-pattern [/some] which is not permitted
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息