Spring MVC请求处理流程

 图片来自网上

DispatcherServlet执行流程

 上图是一个DispatcherServlet的继承关系

主要看:doService()方法

doService()方法

1.绑定⼀些 Attribute

    WebApplicationContext / LocaleResolver / ThemeResolver

    1

    2

    3

    4

    5

// Make framework objects available to handlers and view objects.

request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE, getWebApplicationContext());

request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE, this.localeResolver);

request.setAttribute(THEME_RESOLVER_ATTRIBUTE, this.themeResolver);

request.setAttribute(THEME_SOURCE_ATTRIBUTE, getThemeSource());

3.处理 Multipart

如果是,则将请求转为 MultipartHttpServletRequest

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

   12

   13

   14

   15

   16

   17

   18

   19

   20

   21

   22

   23

   24

   25

   26

   27

   28

   29

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {

if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {

        if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {

                if (DispatcherType.REQUEST.equals(request.getDispatcherType())) {

                        logger.trace("Request already resolved to MultipartHttpServletRequest, e.g. by MultipartFilter");

                }

        }

        else if (hasMultipartException(request)) {

                logger.debug("Multipart resolution previously failed for current request - " +

                                "skipping re-resolution for undisturbed error rendering");

        }

        else {

                try {

                        return this.multipartResolver.resolveMultipart(request);

                }

                catch (MultipartException ex) {

                        if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) != null) {

                                logger.debug("Multipart resolution failed for error dispatch", ex);

                                // Keep processing error dispatch with regular request handle below

                        }

                        else {

                                throw ex;

                        }

                }

        }

}

// If not returned before: return original request.

return request;

}

3.Handler 处理 

 如果找到对应 Handler,执⾏ Controller 及前后置处理器逻辑

    1

    2

    3

    4

    5

    6

    7

    8

    9

   10

   11

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {

        if (this.handlerMappings != null) {

                for (HandlerMapping mapping : this.handlerMappings) {

                        HandlerExecutionChain handler = mapping.getHandler(request);

                        if (handler != null) {

                                return handler;

                        }

                }

        }

        return null;

}

4. 处理返回的 Model ,呈现视图

    1

    2

    3

    4

    5

    6

    7

    8

private void applyDefaultViewName(HttpServletRequest request, @Nullable ModelAndView mv) throws Exception {

        if (mv != null && !mv.hasView()) {

                String defaultViewName = getDefaultViewName(request);

                if (defaultViewName != null) {

                        mv.setViewName(defaultViewName);

                }

        }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FantasyBaby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值