ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springMVC大纲

2021-07-03 21:00:39  阅读:181  来源: 互联网

标签:大纲 springMVC mappedHandler request handler HandlerInterceptor response processed


一、springmvc是什么?

1、是一个表现层的框架。

2、它是在这个网络请求的过程中担任的是一个处理 HttpServletRequest, HttpServletResponse的方法。

它的上游是tomcat是一个servlet容器,功能是将网络请求封装成HttpServletRequest, HttpServletResponse。

它的下游是提供数据的方法。springMVC就是这样中间衔接和封装的。

二、原理分析

Dispatcher的核心流程代码如下

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
   HttpServletRequest processedRequest = request;
   HandlerExecutionChain mappedHandler = null;
   boolean multipartRequestParsed = false;

   WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);

   try {
      ModelAndView mv = null;
      Exception dispatchException = null;

      try {
         processedRequest = checkMultipart(request);
         multipartRequestParsed = (processedRequest != request);

         //通过HandlerMapping找到对应的 HandlerExecutionChain 
          //HandlerExecutionChain 包含 handler和 HandlerInterceptor
          mappedHandler = getHandler(processedRequest);
         if (mappedHandler == null) {
            noHandlerFound(processedRequest, response);
            return;
         }

         // 包装handler变成HandlerAdapter
         //因为可能有不同情况转化成处理器
         HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

         // Process last-modified header, if supported by the handler.
         String method = request.getMethod();
         boolean isGet = "GET".equals(method);
         if (isGet || "HEAD".equals(method)) {
            long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
            if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
               return;
            }
         }
				 //HandlerInterceptor的preHandle方法。
        //如果有一个执行失败,就执行完对应的afterCompletion的方法
         if (!mappedHandler.applyPreHandle(processedRequest, response)) {
            return;
         }

         // 实际调用handler方法
         mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

         if (asyncManager.isConcurrentHandlingStarted()) {
            return;
         }

         applyDefaultViewName(processedRequest, mv);
        //执行HandlerInterceptor的postHandle方法
         mappedHandler.applyPostHandle(processedRequest, response, mv);
      }
      catch (Exception ex) {
         dispatchException = ex;
      }
      catch (Throwable err) {
         // As of 4.3, we're processing Errors thrown from handler methods as well,
         // making them available for @ExceptionHandler methods and other scenarios.
         dispatchException = new NestedServletException("Handler dispatch failed", err);
      }
     // 处理结果 用视图解析器获得视图,以及视图的渲染
      processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
   }
   catch (Exception ex) {
     //异常情况调用HandlerInterceptor的afterCompletion方法
      triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
   }
   catch (Throwable err) {
      triggerAfterCompletion(processedRequest, response, mappedHandler,
            new NestedServletException("Handler processing failed", err));
   }
   finally {
      if (asyncManager.isConcurrentHandlingStarted()) {
         // Instead of postHandle and afterCompletion
         if (mappedHandler != null) {
            mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
         }
      }
      else {
         // Clean up any resources used by a multipart request.
         if (multipartRequestParsed) {
            cleanupMultipart(processedRequest);
         }
      }
   }
}

三、springMVC的扩展点

从流程开始往后一个一个来。

3.1 HandlerMapping资源文件映射器。

这里面最重要的就是RequestMappingHandlerMapping啦

3.2HandlerInterceptor拦截器

3.3HandlerAdapter处理器适配器

  • SimpleServletHandlerAdapter处理Servlet接口的

  • SimpleControllerHandlerAdapter处理实现Controller接口的

  • HttpRequestHandlerAdapter处理HttpRequestHandler接口的

    ​ 不要向Controller那样最后还要生成视图,比如ResourceHttpRequestHandler。

  • RequestMappingHandlerAdapter处理注解的@Controller

3.4 WebDataBinderFactory 数据绑定工厂

  • WebBindingInitializer 可以通过 @initBinder来实现对应的controller的,可以是实现WebBindingInitializer处理 全局的。
  • WebDataBinder ConversionService Converter

3.5 HandlerMethodArgumentResolver 参数处理器

3.6HandlerMethodReturnValueHandler 返回结果处理器

  • HttpMessageConverter

3.7 HandlerExceptionResolver异常处理器

标签:大纲,springMVC,mappedHandler,request,handler,HandlerInterceptor,response,processed
来源: https://www.cnblogs.com/matteo-catari/p/14967526.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有