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