SpringMVC源码方法执行流程

SpringMVC源码方法执行流程

DispatcherServlet 类图

在这里插入图片描述

方法调用流程

  1. servlet接口定义的方法
    在这里插入图片描述

  2. 当用户请求到时,servlet容器调用servlet的service方法

  3. 看DispatchServlet类图,GenericServlet(抽象类)实现了Servlet接口,service()方法无方法体。HttpServlet(抽象类)继承了GenericServlet类实现了service()方法,HttpServletBean(抽象类)继承了HttpServlet类,FrameworkServlet继承了HttpServletBean类并重写了service()方法,DispatcherServlet继承了FrameworkServlet未重写service()方法。
    在这里插入图片描述

  4. 执行FrameworkServlet的service()方法。

  5. 879行-881行,过滤PATCH请求。

  6. 883行调用父类的service()方法即HttpServlet类的service()方法。

 protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
{
    String method = req.getMethod();

    if (method.equals(METHOD_GET)) {
        long lastModified = getLastModified(req);
        if (lastModified == -1) {
            // servlet doesn't support if-modified-since, no reason
            // to go through further expensive logic
            doGet(req, resp);
        } else {
            long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
            if (ifModifiedSince < lastModified) {
                // If the servlet mod time is later, call doGet()
                // Round down to the nearest second for a proper compare
                // A ifModifiedSince of -1 will always be less
                maybeSetLastModified(resp, lastModified);
                doGet(req, resp);
            } else {
                resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
            }
        }

    } else if (method.equals(METHOD_HEAD)) {
        long lastModified = getLastModified(req);
        maybeSetLastModified(resp, lastModified);
        doHead(req, resp);

    } else if (method.equals(METHOD_POST)) {
        doPost(req, resp);
        
    } else if (method.equals(METHOD_PUT)) {
        doPut(req, resp);
        
    } else if (method.equals(METHOD_DELETE)) {
        doDelete(req, resp);
        
    } else if (method.equals(METHOD_OPTIONS)) {
        doOptions(req,resp);
        
    } else if (method.equals(METHOD_TRACE)) {
        doTrace(req,resp);
        
    } else {
        //
        // Note that this means NO servlet supports whatever
        // method was requested, anywhere on this server.
        //

        String errMsg = lStrings.getString("http.method_not_implemented");
        Object[] errArgs = new Object[1];
        errArgs[0] = method;
        errMsg = MessageFormat.format(errMsg, errArgs);
        
        resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
    }
}
  1. 方法根据调用方式(方法)即POST,GET

举例:GET,进入645行doGet()方法(FrameworkServlet类重写了HttpServlet类的doGet()方法)
在这里插入图片描述

  1. 进入processRequest()方法898行
    在这里插入图片描述

  2. 进入1006行DispatchServlet类的doService()方法
    在这里插入图片描述

  3. 进入DispatchServlet类的962行doDispatch()方法,开始springmvc处理请求的所有流程
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值