Spring MVC : DispatcherServlet请求处理的主逻辑(文字版)

本文详细解析了SpringMVC框架中DispatcherServlet处理HTTP请求的核心逻辑,包括查找Handler、选择HandlerAdapter、执行前置处理、处理请求、后置处理、错误处理及视图渲染等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring MVC前置控制器DispatcherServlet对请求进行处理的主要逻辑位于其方法doDispatch,如下 :

  1. 找到可以处理该请求的 Handler

    1. 找到的 HandlerHandlerExecutionChain 形式封装
    2. 任务执行主要代码行 : #getHandler(processedRequest)
    3. 如果没有能处理该请求的 Handler,则抛出异常或者返回404

      任务执行主要代码行 : noHandlerFound(processedRequest, response)

  2. 找到能执行该 HandlerHandlerAdapter 用于调用该Handler

    1. 任务执行主要代码行 : HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler())
    2. 如果没有找到合适的HandlerAdapter,则该方法抛出异常ServletException,带相应信息描述。
  3. 通过找到的HandlerAdapter 处理相应的请求

    1. 对当前Handler的前置处理
      1. 任务执行主要代码行 : mappedHandler.applyPreHandle(processedRequest, response)
      2. 如果某个HandlerInterceptor#preHandle返回false,则doDispatch调用triggerAfterCompletion然后return
    2. 通过HandlerAdapter真正处理当前Handler

      任务执行主要代码行 : mv = ha.handle(processedRequest, response, mappedHandler.getHandler())

    3. 必要时应用缺省视图

      任务执行主要代码行 : applyDefaultViewName(processedRequest, mv)

    4. 对当前Handler的后置处理

      任务执行主要代码行 : mappedHandler.applyPostHandle(processedRequest, response, mv)

    以上流程涉及视图名称的获取和设置,但尚不涉及从视图名称到视图的解析逻辑。

  4. 处理Handler执行结果

    1. 上面的执行要么成功返回一个ModelAndView mv,要么错误产生异常dispatchException
    2. 任务执行主要代码行 : processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException)
    3. 如果该任务执行出现异常/错误,则doDispatch会携带相应异常/错误信息调用triggerAfterCompletionreturn
    1. 如果是dispatchException的情况,则根据异常构建相应的一个ModelAndView对象记到mv然后继续。
      1. exceptionModelAndViewDefiningException的情况直接从其中获取ModelAndViewmv;
      2. 要么调用processHandlerException(request, response, handler, exception)获取一个ModelAndViewmv;
        1. 这里遍历所登记的HandlerExceptionResolver bean尝试从异常解析出相应的ModelAndView对象;
        2. 也可能调用结果为null;
    2. 渲染视图

      任务执行主要代码行 : render(mv, request, response)

      1. Locale应用设置到response;
      2. 根据视图名称解析视图;

        如果解析不到视图,则抛出异常ServletException携带相应信息描述。

      3. 真正的渲染视图;
        1. 任务执行主要代码行 : view.render(mv.getModelInternal(), request, response)
        2. redirect/forward处理在这里完成。

相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值