A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© heshiwei 高级黑马   /  2015-9-27 13:01  /  169 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Servlet生命周期分为三个阶段:

  1,初始化阶段  调用init()方法

  2,响应客户请求阶段  调用service()方法

  3,终止阶段  调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:
  1. <loadon-startup>1</loadon-startup>
复制代码


    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

Servlet工作原理:
  首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

  Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。
  1. public void service(ServletRequest req,ServletResponse res)
  2.   throws ServletException,IOException
  3. {
  4.       HttpRequest request;
  5.       HttpResponse response;

  6.      try
  7.      {
  8.          req = (HttpRequest)request;
  9.          res = (HttpResponse)response;
  10.       }catch(ClassCastException e)
  11.       {
  12.          throw new ServletException("non-HTTP request response");
  13.       }
  14.       service(request,response);
  15. }
  16.     代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误信息,

  17. protected void doGet(HttpServletRequest res,HttpServletResponse resp)
  18.   throws ServletException,IOException
  19. {
  20.    String protocol = req.getProtocol();
  21.    String msg = IStrings.getString("http.method_get_not_supported");
  22.    if(protocol.equals("1.1"))
  23.    {
  24.       resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);
  25.     }
  26.    esle
  27.     {
  28.       resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);
  29.     }
  30. }
复制代码





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马