问题
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 }

转载于:https://www.cnblogs.com/ICE_Inspire/p/5150170.html

Servlet生命周期中的service方法分析相关推荐

  1. Vue生命周期中的created和mounted的区别

    之前大部分时候都是用angular开发项目,vue写的很少,最近有必要把vue和webpack重新整理一下了.下面我们先看一下Vue生命周期中的created和mounted的区别. 我们先看一张图( ...

  2. Activity生命周期中onStart()和onResume()的区别

    Activity生命周期中onStart()和onResume()的区别 在讲onStart()和onResume()的区别之前,必须清楚Activity的四种状态: 1.Running状态:一个新的 ...

  3. Vue生命周期中对mounted、beforeUpdate、updated的理解

    Vue生命周期中对mounted.beforeUpdate.updated的理解 前言 mounted.beforeUpdate.updated 前言 以下文章纯为个人理解,如有错误,请求评论区指正呀 ...

  4. Vue生命周期中mounted、created、methods、computed、watched等的区别

    1.Vue生命周期中mounted和created的区别 https://blog.csdn.net/xdnloveme/article/details/78035065. 2.[Vue] 生命周期, ...

  5. [javaweb] servlet介绍与servlet的继承关系 和 service 方法 (一)

    Servlet servlet是Server Applet的简称,servlet是运行在服务器上的一个小程序,用来处理服务器请求的.一般的网页程序,是通过浏览器访问来实现的,在这个过程中,浏览器发送访 ...

  6. servlet生命周期/init/核心service/destory

    Servlet的生命周期一般可以用三个方法来表示: init():仅执行一次,负责在装载Servlet时初始化Servlet对象 service() :核心方法,一般HttpServlet中会有get ...

  7. adf开发_了解ADF生命周期中的ADF绑定

    adf开发 在这篇文章中,我将重点介绍ADF绑定层,并探讨当最初从浏览器请求带有一些数据的ADF页面时它如何工作. Oracle ADF提供了自己的JSF生命周期扩展版. 实际上,ADF扩展了标准的J ...

  8. 了解ADF生命周期中的ADF绑定

    在本文中,我将重点介绍ADF绑定层,并探讨当最初从浏览器请求带有某些数据的ADF页面时,它如何工作. Oracle ADF提供了自己的JSF生命周期扩展版. 实际上,ADF扩展了标准JSF生命周期实现 ...

  9. 【vue其他相关】欢迎讨论!异步请求放在生命周期中的created还是mounted,已填坑

    文章目录 前言 两个生命周期 场景1 场景2 场景3 结论 如何处理场景一和场景二的问题 最后 前言 曾经在百度上搜这个问题,看到的答案都是相互复制粘贴的,而且个人觉得并没具体场景举例说明,并没有好的 ...

最新文章

  1. springboot多数据源动态切换和自定义mybatis分页插件
  2. 如何使用 API 的方式给 SAP service cloud Registered product 上传图片
  3. MongoDB 去重(distinct)查询后求总数(count)
  4. SpringMVC与Struts2区别与比较总结
  5. Rabbit MQ windows下安装
  6. java 抽象类对象_Java基础___面向对象__抽象类
  7. Java™ 教程(常见问题及其解决方案)
  8. C++基础与深度解析第五章: 语句
  9. python中copy和deepcopy的区别_python里shadowcopy和deepcopy的区别
  10. 基于javaWEB技术的SSM音乐网站设计与实现(含论文+程序设计+PPT答辩)
  11. [模拟]JZOJ 2499 东风谷早苗
  12. Oracle 工具篇+Oracle Remote Diagnostic Agent(RDA)
  13. 基于SSM整合阿里直播服务----java代码实现
  14. 5和6 objbc oracle_《Oracle Database 12c完全参考手册(第7版)(试读版)》
  15. android 小白点代码,Android实现小圆点显示未读功能
  16. 区块链10年兴衰录:中国是最好的发展土壤
  17. 计算机驱动安装的几个方法,不会安装驱动有福了,2个方法教你安装驱动程序,非常实用的知识...
  18. Unix/Linux下的Curses库开发指南——第三章curses库窗口
  19. 某预约系统分析 某区公共自行车租车卡在线预约,关于如何提高成功概率
  20. ListView 联动 SideBar ,根据数据首字母进行排序

热门文章

  1. Java面试题之有没有有顺序的Map实现类,如果有,他们是怎么实现有序的?
  2. java resourcebundle_Java - Properties和ResourceBundle类学习
  3. Win11系统各个版本之间的比较,看完你就懂了!
  4. 后端:spring提供的钩子,你知道哪些?
  5. 算法基础:常用的查找算法知识笔记
  6. 汇总jQuery的61种选择器及示例
  7. 真正聪明的人,为什么从不去社交?
  8. 帧同步_微信小游戏接入“熊孩子噩梦”健康系统 帧同步能力上线
  9. java logging api_Java Logging API - Tutorial
  10. [python进阶]11接口:从协议到抽象基类