【servlet】Servlet工作原理

一、Servlet工作原理

     Servlet是运行在Servlet容器中的,由Servlet容器来负责Servlet实例的查找、创建以及整个生命周期的管理,Servlet整个生命周期可以分为四个阶段:类装载及实例创建阶段、实例初始化阶段、服务阶段以及实例销毁阶段。

类装载及实例创建阶段

      默认情况下,Servlet实例是在接受到第一个请求时进行创建并且以后的请求进行复用,如果有Servlet实例需要进行一些复杂的操作,需要在初始 化时就完成,比如打开文件、初始化网络连接等,可以配置在服务器启动时就创建实例,具体配置方法为在声明servlet标签中添加<load- on-startup>1</load-on-startup>标签。

初始化 init(ServletConfig config)

     一旦Servlet实例被创建,将会调用Servlet的inint方法,同时传入ServletConfig实例,传入Servlet的相关配置信息,init方法在整个Servlet生命周期中只会调用一次。

服务 services()

     为了提高效率,Servlet规范要求一个Servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,Servlet开发者必须保证该方法的线程安全性。    

销毁 destory()

      当Servlet容器将决定结束某个Servlet时,将会调用destory()方法,在destory方法中进行资源释放,一旦destory方法 被调用,Servlet容器将不会再发送任何请求给这个实例,若Servlet容器需再次使用该Servlet,需重新再实例化该Servlet实例。

二、Servlet执行流程

web服务器接受到一个http请求后,web服务器会将请求 移交给servlet容器,servlet容器首先对所请求的URL进行解析并根据web.xml 配置文件找到相应的处理servlet,同时将request、response对象传递给它,servlet通过request对象可知道客户端的请求 者、请求信息以及其他的信息等,servlet在处理完请求后会把所有需要返回的信息放入response对象中并返回到客户端,servlet一旦处理 完请求,servlet容器就会刷新response对象,并把控制权重新返回给web服务器。

三、与其它技术的比较

   与其它服务相比servlet有以下的一些优点:

1、运行速度上比CGI快,因为使用了多线程

2、servlet使用了标准的api,可被许多web服务支持

3、与系统无关性,一次编译多次使用

四、Servlet容器、

Servlet是对支持Java的服务器的一般扩充。它最常见的用途是扩展Web服务器,提供非常安全的、可移植的、易于使用的CGI替代品。它是 一种动态加载的模块,为来自Web服务器的请求提供服务。它完全运行在Java虚拟机上。由于它在服务器端运行,因此它不依赖于浏览器的兼容性。

Servlet容器:

负责处理客户请求、把请求传送给Servlet并把结果返回给客户。不同程序的容器实际实现可能有所变化,但容器与Servlet之间的接口是由 Servlet API定义好的,这个接口定义了Servlet容器在Servlet上要调用的方法及传递给Servlet的对象类。

Servlet生命周期:

1、Servlet容器创建Servlet的一个实例

2、容器调用该实例的init()方法

3、如果容器对该Servlet有请求,则调用此实例的service()方法

4、容器在销毁本实例前调用它的destroy()方法

5、销毁并标记该实例以供作为垃圾收集

一旦请求了一个Servlet,就没有办法阻止容器执行一个完整的生命周期。
容器在Servlet首次被调用时创建它的一个实例,并保持该 实例在内存中,让它对所有的请求进行处理。容器可以决定在任何时候把这个实例从内存中移走。在典型的模型中,容器为每个Servlet创建一个单独的实 例,容器并不会每接到一个请求就创建一个新线程,而是使用一个线程池来动态的将线程分配给到来的请求,但是这从Servlet的观点来看,效果和为每个请 求创建一个新线程的效果相同。

五、Servlet初始化

  ①Servlet在初始化的时候,是通过init(ServletConfig config) 或 init() 来执行的。

  ServletConfig 是一个接口,它怎样传递给他一格对象来进行初始化呢?其实,是这个对象是由 servlet 容器来实例化的,由容器产生一格 ServletConfig 的实现类的对象,然后传递给 Servlet。

  ②我们有些时候可能在 Servlet 初始化时给它一些固定的配置参数,那么这些参数是怎样传递到 Servlet呢?其实,我们在 web.xml 中给 servlet 配置启动参数,在容器对 servlet 进行初始化的时候,会收集你所配置的参数,记录在 ServletConfig 的实现类中。

  ③我们来看一个 Servlet 的配置 

<servlet>

  <servlet-name>index</servlet-name>

  <servlet-class>org.zy.pro.sw.servlet.IndexServlet</se rvlet-class>

  <init-param>

  <param-name>dbconfig</param-name>

  <param-value>/WEB-INF/dbconfig.xml</param-value>

  </init-param>

</servlet>

  在 web.xml 中对 Servlet 的初始化,只能传递字符串类型的数据

  ④ ServletContext

  ServletContext 是负责和 Servlet 的上文和下文交互,下面和 Servlet 容器交互,下面和 Servlet 中的请求

  和相应进行交互。在 ServletConfig 中,public ServletContext getServletContext(); 方法实现取得当前 ServletContext 的对象。 你可能要问, ServletContext 是一个接口,那么你如何取得他的对象呢?

  其实这个问题和 ServletConfig 相同,都是在 Servlet 进行初始化的时候产生的对象,是由容器来初始化的。

参考:

http://persevere.iteye.com/blog/952866

http://developer.51cto.com/art/200907/135095.htm

原文地址:https://www.cnblogs.com/549294286/p/3020612.html