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 }
  • 相关阅读:
    由typedef和函数指针引起的危机
    从JVM角度看Java多态
    C语言中判断字符串str1是否以str2开始或结束
    Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组
    C语言中的条件编译
    学会 Python 到底能干嘛?我们整理出了 7 大工作方向……
    新手指南:我应该学哪种编程语言?
    盘点:2019年最赚钱的10种编程语言
    11个提升编程能力的小方法
    收好这份 Vue 升级图,假期偷偷上个钻
  • 原文地址:https://www.cnblogs.com/ICE_Inspire/p/5150170.html
Copyright © 2011-2022 走看看