zoukankan      html  css  js  c++  java
  • Servlet生命周期中的service方法分析

    问题
    ServletLifeCycle中的service方法内,有super.service(request, response); 会执行this.doGet(HttpServletRequest request, HttpServletResponse response);
    没有super.service(request, response);,则不执行this.doGet(...). 是怎么实现的?

    举一反三:
    一个子类,覆写的方法内,如果调用了父类的该方法,会执行子类内的另一个方法;
    覆写的方法内,如果没有调用父类的该方法,就不会执行子类内的另一个方法;

    分析 ----->符号是关键注释

      1 public class ServletLifeCycle extends HttpServlet {
      2     private static final long serialVersionUID = 1L;
      3     
      4     @Override
      5     public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
      6         // TODO Auto-generated method stub
      7         //this.doGet((HttpServletRequest)request, (HttpServletResponse)response);
      8         super.service(request, response);//------------------->执行父类的service(ServletRequest request, ServletResponse response)方法
      9          
     10         System.out.println("处理客户端请求");
     11     }
     12 
     13     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     14         // TODO Auto-generated method stub
     15         System.out.println("处理过程");
     16         response.getWriter().append("Served at: ").append(request.getContextPath());
     17     }
     18 
     19 }
     20 
     21 
     22 
     23 
     24 public abstract class HttpServlet extends GenericServlet {
     25 public void service(ServletRequest req, ServletResponse res)
     26     throws ServletException, IOException {
     27 
     28     HttpServletRequest  request;
     29     HttpServletResponse response;
     30 
     31     try {
     32         request = (HttpServletRequest) req;
     33         response = (HttpServletResponse) res;
     34     } catch (ClassCastException e) {
     35         throw new ServletException("non-HTTP request or response");
     36     }
     37     service(request, response);//------------------->父类的方法的重载执行父类的service(HttpServletRequest request, HttpServletResponse response)方法
     38     //------------------->我的理解是,如果没有重载,会出现死循环.   走到此处又执行子类ServletLifeCycle的service方法,子类又调用父类service方法,循环嵌套.
     39 }
     40 
     41 
     42 protected void service(HttpServletRequest req, HttpServletResponse resp)
     43         throws ServletException, IOException {
     44 
     45         String method = req.getMethod();
     46 
     47         if (method.equals(METHOD_GET)) {
     48             long lastModified = getLastModified(req);
     49             if (lastModified == -1) {
     50                 // servlet doesn't support if-modified-since, no reason
     51                 // to go through further expensive logic
     52                 doGet(req, resp);//------------------->调用子类ServletLifeCycle的doGet方法
     53             } else {
     54                 long ifModifiedSince;
     55                 try {
     56                     ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
     57                 } catch (IllegalArgumentException iae) {
     58                     // Invalid date header - proceed as if none was set
     59                     ifModifiedSince = -1;
     60                 }
     61                 if (ifModifiedSince < (lastModified / 1000 * 1000)) {
     62                     // If the servlet mod time is later, call doGet()
     63                     // Round down to the nearest second for a proper compare
     64                     // A ifModifiedSince of -1 will always be less
     65                     maybeSetLastModified(resp, lastModified);
     66                     doGet(req, resp);
     67                 } else {
     68                     resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
     69                 }
     70             }
     71 
     72         } else if (method.equals(METHOD_HEAD)) {
     73             long lastModified = getLastModified(req);
     74             maybeSetLastModified(resp, lastModified);
     75             doHead(req, resp);
     76 
     77         } else if (method.equals(METHOD_POST)) {
     78             doPost(req, resp);
     79 
     80         } else if (method.equals(METHOD_PUT)) {
     81             doPut(req, resp);
     82 
     83         } else if (method.equals(METHOD_DELETE)) {
     84             doDelete(req, resp);
     85 
     86         } else if (method.equals(METHOD_OPTIONS)) {
     87             doOptions(req,resp);
     88 
     89         } else if (method.equals(METHOD_TRACE)) {
     90             doTrace(req,resp);
     91 
     92         } else {
     93             //
     94             // Note that this means NO servlet supports whatever
     95             // method was requested, anywhere on this server.
     96             //
     97 
     98             String errMsg = lStrings.getString("http.method_not_implemented");
     99             Object[] errArgs = new Object[1];
    100             errArgs[0] = method;
    101             errMsg = MessageFormat.format(errMsg, errArgs);
    102 
    103             resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    104         }
    105     }
    106 
    107 
    108 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
    109     throws ServletException, IOException
    110 {
    111     String protocol = req.getProtocol();
    112     String msg = lStrings.getString("http.method_get_not_supported");
    113     if (protocol.endsWith("1.1")) {
    114         resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
    115     } else {
    116         resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
    117     }
    118 }
    119 }
  • 相关阅读:
    Balanced Binary Tree
    Swap Nodes in Pairs
    Reverse Nodes in k-Group
    Reverse Linked List II
    Remove Nth Node From End of List
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Partition List
    Merge Two Sorted Lists
    【Yii2.0】1.2 Apache检查配置文件语法
  • 原文地址:https://www.cnblogs.com/ICE_Inspire/p/5150170.html
Copyright © 2011-2022 走看看