“Servlet”的生命周期

来源:百度文库 编辑:神马文学网 时间:2024/04/28 23:55:23
    

当客户端通过网络访问服务器时:

① 加载Servlet的实现类(ClassLoader) → ② 创建一个Servlet实例(new) → ③ 调用Servlet类中的init方法 → ④ 执行service方法(doGet、doPost) → ⑤ 服务器关闭,即销毁Servlet对象(destroy)

  重点提示:Servlet类只在客户端访问服务器时加载、创建、初始化一次,即Servlet容器中仅持有一个该Servlet对象。

阶段一:Servlet实现类的加载

  所有的web-server加载Servlet实现类的时候,都将搜索web-app根目录下WEB-NF目录的子目录lib和classes,在lib目录中搜索*.jar文件(lib目录存放本web-app中用到的所有jar包),在classes目录中搜索*.class文件(为打包的的字节码文件);它将遍历WEB-INF目录下的web.xml配置文件,根据文件中的Servlet标签下Servlet-class子标签的内容加载相应的class文件;创建Servlet对象,可以通过服务器反射机制创建Servlet对象,Class.forName("Servlet实现类的类名");tomcat安装的根目录下的common目录的子目录lib中存放webapps目录下所有web-app的公共jar包,当web-app使用jar包时首先搜索本app中的lib,如果没有找到需要的jar包,将在common目录的lib中找jar包;common主要存放大多数web-app用到的jar包。

阶段二:Servlet对象的创建和初始化

  大多数web-server会在客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法,(如果设置服务器启动时加载,则服务器启动时创建对象并执行初始化方法,客户端第一次访问服务器时,直接进入service阶段执行service方法);以后每个客户端在发送请求就不会再调用init方法,也就是说它只能被调用一次。一个Servlet对象的初始化方法只执行一次;当Servlet对象初始化失败,即执行init()方法抛出ServletException异常,Servlet对象将会被垃圾回收器回收,当客户端第一次访问服务器时加载Servlet实现类,创建对象并执行初始化方法。

  Tomcat对Servlet对象初始化时,会自动调用javax.servlet包中Servlet接口定义的init(ServletConfig config)方法,该方法在实现Servlet接口的GenericServlet类中被实现,并同时调用了GenericServlet类中由该类重新定义的init()方法,该方法为一个空实现,方便继承自GenericServlet类的子类重写。因此GenericServlet的子类需要在初始化过程中定义相关操作,只需在该子类中重写init()方法即可。

  如果对上述类不熟悉,可查看Servlet Api。

  GenericServlet类中定义了public ServletConfig getServletConfig()方法,用于得到在web.xml中对Servlet对象的配置信息。

  
    参数名
    参数值
  

  得到参数值可以用ServletConfig类中的getInitParameter("参数名")

阶段三:Servlet对象根据客户端的请求提供service

  Service方法(doGet、doPost、doHead等方法)会在服务器被访问时调用,当网络中的不同主机(客户端)并发访问服务器中的同一资源时,服务器将开设多个线程处理不同的请求,由于多用户的并发访问,采用多线程降低资源消耗,加快处理速度。  

  多线程同时处理同一变量时(如:对同一文件进行写操作),且有读写操作时,必须考虑是否加上同步(synchronized),同步添加时,不要添加范围过大,有可能使程序变为纯粹的单线程,大大削弱了系统性能。在servlet中需要同步的有:成员变量,网络资源,文件,静态变量,数据库连接等,用到这些一定要考虑线程同步,安全的问题。

  Tomcat会建立以个线程池,即首先启动N个线程,以应对多用户的并发访问。

阶段四:Servlet对象的销毁(destroy()方法)

  当web-server关闭或重新加载时,该Servlet对象将被销毁,一个Servlet对象的销毁(destroy()方法)只执行一次,不同的web-server销毁时机不同。  注: 本文转载至 http://singo107.blog.sohu.com/101821158.html   仅供参考