servlet 和 jsp的生命周期 工作原理

来源:互联网 发布:淘宝优惠券的公众号 编辑:程序博客网 时间:2024/05/17 21:39

一、Servlet生命周期

      Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应。常用的tomcat、jboss、weblogic都是Servlet容器)中的,其生命周期是由容器来管理。Servlet的生命周期通过java.servlet.Servlet接口中的init()、service()、和destroy()方法表示。Servlet的生命周期有四个阶段:加载并实例化、初始化、请求处理、销毁。

 

加载并实例化

      Servlet容器负责加载和实例化Servelt。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,Servlet通过类加载器来加载Servlet类,加载完成后再new一个Servlet对象来完成实例化。

 

初始化

      在Servlet实例化之后,容器将调用init()方法,并传递实现ServletConfig接口的对象。在init()方法中,Servlet可以部署描述符中读取配置参数,或者执行任何其他一次性活动。在Servlet的整个生命周期类,init()方法只被调用一次。

 

请求处理

      当Servlet初始化后,容器就可以准备处理客户机请求了。当容器收到对这一Servlet的请求,就调用Servlet的service()方法,并把请求和响应对象作为参数传递。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。通过分析ServletRequest或者HttpServletRequest对象,service()方法处理用户的请求,并调用ServletResponse或者HttpServletResponse对象来响应。

 

销毁

      一旦Servlet容器检测到一个Servlet要被卸载,这可能是因为要回收资源或者因为它正在被关闭,容器会在所有Servlet的service()线程之后,调用Servlet的destroy()方法。然后,Servlet就可以进行无用存储单元收集清理。这样Servlet对象就被销毁了。这四个阶段共同决定了Servlet的生命周期。

 

 

二、Jsp生命周期

      Jsp页必须转换成Servlet,才能对请求进行服务,因此Jsp的底层完全是Servlet。这样看来Jsp的生命周期就包括六个阶段:转换、编译、加载并实例化、jspInit()调用(即初始化)、_jspService()调用(即请求处理)、jspDestroy()调用(即销毁)。

 

转换:就是web容器将Jsp文件转换成一个包含了Servlet类定义的java源文件。

编译:把在转换阶段创建的java源文件编译成类文件。

Jsp生命周期其他的四个阶段跟Servlet生命周期相同。

 

  现在来具体讲一下:

     前一部分:

            1.创建:就是创建一个JSP源文件

            2.部署:将JSP安装到服务器上(JaveEE服务器或单机运行的JSP服务器)

            3.解释和编译:将JSP源文件解释成java源代码文件,然后将该源文件编译成可在服务器上运行的java类,这个类成为JSP页面的实现类。(这一步可能在以后多个地方都会遇到)

     后一部分:

            1.装载和实例化:前提是完成了前一部分的几步得到了一个实现类。服务器端会为JSP页面查找已有的实现类,如果没有,就把这个实现类载入JVM中;载入JVM后就立刻产生一个该类的实例,或者在第一次请求时执行。

             2.初始化:初始化JSP页面对象。如果你希望在初始化期间执行某些代码,那么你可以向页面中增加一个初始化方法(method),在初始化的时候就会调用该方法。

            3.请求处理:由页面对象响应客户端的请求。需要注意的是,单个对象实例将处理所有的请求。在执行完处理之后,服务器将一个响应(response)返回给客户端。这个响应完全是由HTML标签和其他数据构成的,并不会把任何Java源码返回给客户端。
              4.生命周期终止服务器不再把客户端的请求发给JSP。在所有的请求处理完成之后,会释放掉这个类的所有实例。一般这种情况会发生在服务器关闭的时候,但是也有其他的可能性,比如服务器需要保存资源、检测到有JSP文件更新,或者由于其他某些原因需要终止实例等情况。如果想让代码执行清除工作,那么可以实现一个方法,并且在这个类实例释放之前调用该方法。