Servlet运行原理以及生命周期

Servlet运行原理  java

  

 

Servlet生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求,提供服务。在讨论Servlet生命周期以前,先让咱们来看一下这几个方法:web

1. init()方法数据库

      在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,能够配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。不管有多少客户机访问Servlet,都不会重复执行init();安全

2. service()方法服务器

      它是Servlet的核心,每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,并且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象做为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。网络

3. destroy()方法多线程

      仅执行一次,在服务器端中止且卸载Servlet时执行该方法,有点相似于C++的delete方法。一个Servlet在运行service()方法时可能会产生其余的线程,所以须要确认在调用destroy()方法时,这些线程已经终止或完成。并发

     下面来谈谈Servlet的生命周期,Servlet的生命周期是由Servlet容器来控制的,它始于装入Web服务器的内存时,并在终止或从新装入Servlet时结束。这项操做通常是动态执行的。然而,Server一般会提供一个管理的选项,用于在Server启动时强制装载和初始化特定的Servlet。性能

     在代码中,Servlet生命周期由接口javax.servlet.Servlet定义。全部的Java Servlet 必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet Engine上运行。javax.servlet.Servlet接口定义了一些方法,在Servlet 的生命周期中,这些方法会在特定时间按照必定的顺序被调用。.net

Servlet生命周期

加载和实例化Servlet

咱们来看一下Tomcat是如何加载的:

     1. 若是已配置自动装入选项,则在启动时自动载入。

     2. 在服务器启动时,客户机首次向Servlet发出请求。

     3. 从新装入Servlet时。

      当启动Servlet容器时,容器首先查找一个配置文件web.xml,这个文件中记录了能够提供服务的Servlet。每一个Servlet被指定一个Servlet名,也就是这个Servlet实际对应的Java的完整class文件名。Servlet容器会为每一个自动装入选项的Servlet建立一个实例。因此,每一个Servlet类必须有一个公共的无参数的构造器。

初始化

      当Servlet被实例化后,Servlet容器将调用每一个Servlet的init方法来实例化每一个实例,执行完init方法以后,Servlet处于“已初始化”状态。因此说,一旦Servlet被实例化,那么必将调用init方法。经过Servlet在启动后不当即初始化,而是收到请求后进行。在web.xml文件中用<load-on-statup> ...... </load-on-statup>对Servlet进行预先初始化。

      初始化失败后,执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,建立对象并执行初始化方法。

请求处理

      Servlet 被初始化之后,就处于能响应请求的就绪状态。每一个对Servlet 的请求由一个Servlet Request 对象表明。Servlet 给客户端的响应由一个Servlet Response对象表明。对于到达客户机的请求,服务器建立特定于请求的一个“请求”对象和一个“响应”对象。调用service方法,这个方法能够调用其余方法来处理请求。

      Service方法会在服务器被访问时调用,Servlet对象的生命周期中service方法可能被屡次调用,因为web-server启动后,服务器中公开的部分资源将处于网络中,当网络中的不一样主机(客户端)并发访问服务器中的同一资源,服务器将开设多个线程处理不一样的请求,多线程同时处理同一对象时,有可能出现数据并发访问的错误。

      另外注意,多线程不免同时处理同一变量时(如:对同一文件进行写操做),且有读写操做时,必须考虑是否加上同步,同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能;只须要作到多个线程安全的访问相同的对象就能够了。

卸载Servlet

      当服务器再也不须要Servlet实例或从新装入时,会调用destroy方法,使用这个方法,Servlet能够释放掉全部在init方法申请的资源。一个Servlet实例一旦终止,就不容许再次被调用,只能等待被卸载。

      Servlet一旦终止,Servlet实例便可被垃圾回收,处于“卸载”状态,若是Servlet容器被关闭,Servlet也会被卸载,一个Servlet实例只能初始化一次,但能够建立多个相同的Servlet实例。如相同的Servlet能够在根据不一样的配置参数链接不一样的数据库时建立多个实例。

 

 

摘自-fifiyong

相关文章
相关标签/搜索