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 }
时间: 2024-08-09 14:44:38

Servlet生命周期中的service方法分析的相关文章

在Activity的生命周期中,会被系统回调的方法

onCreate(Bundle savedStatus):创建Activity时被回调.onStart():启动Activity时被回调.onRestart():重新启动Activity时被回调.onResume():恢复Activity时被回调.onPause():暂停Activity时被回调.onStop():停止Activity时被回调.onDestroy():销毁Activity时被回调.

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

首先了解Activity的四种状态 Running状态:一个新的Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态.Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态.此时它依然与窗口管理器保持连接,系统继续维护其内部状态,它仍然可见,但它已经失去了焦点,故不可与用户交互.Stopped状态:当Activity不可见时,Activity处于Stopped状态.当Activity处于此状态时,一定要保存

vue生命周期中created和mounted的区别

created在渲染页面之前使用,通常是用来渲染页面 mounted通常是在渲染页面之后,用来操作dom节点 通常情况下使用created比较多,使用mounted相对少一些,一些情况使用mounted可能会报错. vue周期函数: 原文地址:https://www.cnblogs.com/pearl-/p/9900727.html

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

用通俗的语言来说,就是Vue中实例或者组件从创建到消灭中间经过的一系列过程.虽然不太严谨,但是也基本上可以理解. 通过一系列实践,现在把所有遇到的问题整理一遍,今天记录一下created和mounted的区别: 二.created和mounted区别? 官方图解如下: 我们从图中看两个节点: created:在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图. mounted:在模板渲染成html后调用,通常是初始化页面完成后,再对html的dom节点进行一些需要的操作. 其实

Java Servlet系列之Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(): 2. service()方法 它是Servlet的核心,每当

Servlet中service方法

在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏?? 正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像H

Servlet 生命周期、工作原理

一. Servlet 生命周期 servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Servlet时执行的,负责初始化Servlet对象.可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(). service():它是Servlet的核心,负责响应客户的请求.每当一个客户请求一个HttpServlet

Servlet生命周期+工作原理

Servlet生命周期+工作原理 1.Servlet的生命周期: ????Servlet加载,加载,服务,销毁. 2.典型函数解释: ????Init():这个函数是用来初始化Servlet对象的.在Servlet的生命周期中,仅仅执行一次Servlet函数. ????Destroy():这个函数是用来销毁Servlet对象的,同样的,在Servlet的生命周期中,仅仅执行一次Servlet函数. ????Service():这个函数是Servlet对象响应客户请求时候使用的.是Servlet的

servlet生命周期、工作原理

Servlet 生命周期:Servlet 加载--->实例化并初始化--->服务--->销毁. servlet加载:当容器启动的时候加载(或第一次访问servlet时加载):可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet init():在Servlet的生命周期中,仅执行一次init()方法.在服务器装入Servlet时,实例化servlet,并调用init()方法初始化. service():它是Servlet的核心,负责响应客户的请求.每当一个客户请