Servlet运行原理及其生命周期

来源:互联网 发布:注册域名能赚钱吗 编辑:程序博客网 时间:2024/05/22 03:49

神马是Servlet?

  --如何访问静态页面?

        通过浏览器发送请求,访问服务端的HTML。

  --那么如何访问动态页面呢?

        通过Servlet可以动态生成HTML页面;Servlet必须部署在服务器上(容器);Servlet必须满足相应的规范。

  --其实Servlet是web应用中,服务器端满足特定规范的组件,是用来访问动态页面过程中动态生成HTML页面的组件(需要满足一定规范)。

那么Servlet是如何动态生成HTML页面的呢?

   简单来说Servlet工作原理就是:   

  1. 浏览器依据IP建立与容器的连接
  2. 浏览器将请求数据打包
  3. 容器解析请求数据包,封装request和response对象
  4. 容器依据请求资源路径找到Servlet创建对象
  5. 容器将request和response对象作为参数传入service方法,并调用
  6. 容器将响应数据打包发给浏览器
  7. 浏览器取出结果,生成页面
还是看图吧(容器以TomCat为例):

             

Servlet的生命周期:

  1.servlet运行在servlet的容器中,其生命周期由容器进行管理;通过javax.servlet.Servlet接口的init()、service()、destroy()方法来实现;

  2.servlet的生命周期包括下面几个阶段:

     (1)加载和实例化servlet容器负责servlet的加载和实例化。

         当servlet容器启动时,或者servlet容器检测到需要这个servlet服务的第一个请求时,servlet容器会加载这个servlet,并生成servlet实例。(注:servlet容器在启动后,必须知道这些servlet类所在的位置,servlet容器可以通过本地文件系统、远程文件系统或者其他网络服务中,通过类加载器加载servlet类,加载成功后才能创建servlet实例;servlet容器通过java的反射API,来进行实例化,容器调用的是servlet的无参构造方法­即默认的构造方法,所以我们在编写servlet类时,不要写带参的构造方法)

     (2)初始化当servlet实例化后,容器将调用这个对象的init()方法进行初始化,初始化的目的是在这个实例为请求提供服务前完成初始化工作,如建立配置连接,获取配置信息等。

      每个servlet实例,容器只调用一次init()方法。servlet实例可以使用容器为其提供的ServletConfig对象,从web应用程序的配置信息中(即web.xml文件),获取初始化的参数信息。如果初始化期间发生错误,则会抛出ServletException异常或者unavailableException异常,来通知容器。           ServletException异常是一般的初始化失败,如没能找到初始化参数;UnavailableException异常是通知容器此实例不可用,如数据库未启动,数据连接不成功,servlet就会向容器抛出UnvailableException异常,提示他暂时或永久不可用。

    (3)请求处理Servlet容器调用servlet实例的service()方法来对请求进行处理。需要强调的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,servlet实例通过ServletRequest对象,来获取客户端的相关信息和请求信息;处理完成后,servlet实例通过ServletResponse对象来设置相应信息。

        service()方法自动运行与请求对应的doXXX方法,如果请求是get方式的,则调用doGet()方法;

        果请求是post方式的,则调用doPost()方法。

        当处理过程中出现异常,则servlet实例会抛出ServletException异常或者UnavailableException异常。

        如果抛出的UnvailableException异常显示此实例永久不可用,则容器将调用servlet实例的destroy()方法,释放该实例,释放后对此实例的所有请求,都将得到HTTP404的响应(请求的资源不可用);

         如果抛出的UnavailableExceptio异常显示此实例暂时不可用,则在暂时不可用的时间段内,对此实例的请求,都将得到HTTP503的响应(服务暂时忙,不能处理请求)。

    (4)服务结束当容器检测到某个servlet实例需要在服务中移除时,则容器将调用servlet实例的destroy()方法,以便释放实例所使用的资源,并将数据存储到持久存储设备中。当调用destroy()方法后,容器将释放此servlet实例,该实例随后将由垃圾回收器进行垃圾回收处理。


如果再有对此实例的服务请求时,容器将重新创建一个新的servlet实例。

 

 



0 0