写点什么

一文读懂 spring MVC 请求处理流程,java 程序设计教程第三版

用户头像
极客good
关注
发布于: 刚刚
  • ViewResolver


ViewResolver 即视图解析器,?于将 String 类型的视图名和 Locale 解析为 View 类型的视图,只有?个 resolveViewName()?法。从?法的定义可以看出,Controller 层返回的 String 类型视图名 viewName 最终会在这?被解析成为 View。View 是?来渲染??的,也就是说,它会将程序返回的参数和数据填?模板中,?成 html?件。ViewResolver 在这个过程主要完成两件事情:ViewResolver 找到渲染所?的模板(第?件?事)和所?的技术(第?件?事,其实也就是找到视图的类型,如 JSP)并填?参数。默认情况下,Spring MVC 会?动为我们配置?个 InternalResourceViewResolver,是针对 JSP 类型视图的。


  • HandlerExceptionResolver


HandlerExceptionResolver ?于处理 Handler 产?的异常情况。它的作?是根据异常设置 ModelAndView,之后交给渲染?法进?渲染,渲染?法会将 ModelAndView 渲染成??。


  • RequestToViewNameTranslator


RequestToViewNameTranslator 组件的作?是从请求中获取 ViewName.因为 ViewResolver 根据 ViewName 查找 View,但有的 Handler 处理完成之后,没有设置 View,也没有设置 ViewName,便要通过这个组件从请求中查找 ViewName。


  • LocaleResolver


ViewResolver 组件的 resolveViewName ?法需要两个参数,?个是视图名,?个是 Locale。LocaleResolver ?于从请求中解析出 Locale,?如中国 Locale 是 zh-CN,?来表示?个区域。这个组件也是 i18n 的基础。


  • ThemeResolver

  • MultipartResolver


MultipartResolver ?于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。MultipartHttpServletRequest 可以通过 getFile() ?法 直接获得?件。如果上传多个?件,还可以调? getFileMap()?法得到 Map<FileName,File>这样的结构,MultipartResolver 的作?就是封装普通的请求,使其拥有?件上传的功能。


  • FlashMapManager


FlashMap ?于重定向时的参数传递,?如在处理?户订单时候,为了避免重复提交,可以处理完 post 请求之后重定向到?个 get 请求,这个 get 请求可以?来显示订单详情之类的信息。这样做虽然可以规避?户重新提交订单的问题,但是在这个??上要显示订单的信息,这些数据从哪?来获得呢?因为重定向时么有传递参数这?功能的,如果不想把参数写进 URL(不推荐),那么就可以通过 FlashMap 来传递。只需要在重定向之前将要传递的数据写?请求(可以通过 ServletRequestAttributes.getRequest()?法获得)的属性 OUTPUT_FLASH_MAP_ATTRIBUTE 中,这样在重定向之后的 Handler 中 Spring 就会?动将其设置到 Model 中,在显示订单信息的??上就可以直接从 Model 中获取数据。FlashMapManager 就是?来管理 FalshMap 的。


这九大组件都在 DispatcherServlet 类中。


/** MultipartResolver used by this servlet. */


// 多部件解析器


@Nullable


private MultipartResolver multipartResolver;


/** LocaleResolver used by this servlet. */


//地域解析器,国际化


@Nullable


private LocaleResolver localeResolver;


/** ThemeResolver used by this servlet. */


//主题解析器


@Nullable


private ThemeResolver themeResolver;


/** List of HandlerMappings used by this servlet. */


//处理器映射器组件


@Nullable


private List<HandlerMapping> handlerMappings;


/** List of HandlerAdapters used by this servlet. */


//处理器适配器组件


@Nullable


private List<HandlerAdapter> handlerAdapters;


/** List of HandlerExceptionResolvers used by this servlet. */


//处理器异常解析器


@Nullable


private List<HandlerExceptionResolver> handlerExceptionResolvers;


/** RequestToViewNameTranslator used by this servlet. */


//视图名称转换器


@Nullable


private RequestToViewNameTranslator viewNameTranslator;


/** FlashMapManager used by this servlet. */


//flash 组件管理器


@Nullable


private FlashMapManager flashMapManager;


/** List of ViewResolvers used by this servlet. */


//视图解析器


@Nullable


private List<ViewResolver> viewResolvers;


[](


)MVC 结构体系


=======================================================================


三层架构:表现层、业务层和持久层


MVC 设计模式:


MVC 全名是 Model View Controller,是 模型(model)-视图(view)-控制器(controller) 的缩写, 是?


种?于设计创建 Web 应?程序表现层的模式。MVC 中每个部分各司其职:


Model(模型):模型包含业务模型和数据模型,数据模型?于封装数据,业务模型?于处理业


务。


View(视图): 通常指的就是我们的 jsp 或者 html。作??般就是展示数据的。通常视图是依据


模型数据创建的。


Controller(控制器): 是应?程序中处理?户交互的部分。作??般就是处理程序逻辑的。


MVC 提倡:每?层只编写??的东?,不编写任何其他的代码;分层是为了解耦,解耦是为了维


护?便和分?协作。



[](


)spring MVC 请求处理流程


================================================================================


所有请求都会通过 DispatcherServlet 来执行。



流程说明:


1、DispatcherServlet 接收到客户端发送的请求。


2、DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。


3、HandleMapping 根据请求 URL 找到对应的 handler 以及处理器 拦截器,返回给 DispatcherServlet


4、DispatcherServlet 根据 handler 调用 HanderAdapter 处理器适配器。


5、HandlerAdapter 根据 handler 执行处理器,也就是我们 controller 层写的业务逻辑,并返回一个 ModeAndView


6、HandlerAdapter 返回 ModeAndView 给 DispatcherServlet


7、DispatcherServlet 调用 ViewResolver 视图解析器来 来解析 ModeAndView


8、ViewResolve 解析 ModeAndView 并返回真正的 view 给 DispatcherServlet


9、DispatcherServlet 将得到的视图进行渲染,填充到 request 域中


10、返回给客户端响应结果。


[](


)springmvc 源码分析


=============================================================================


请求进来。先找 HttpServlet.发现 FrameworkServlet 重现了 doGet()和 doPost() 方法。所以会执行其中的方法。




并且在 FrameworkServlet 中实现了 HttpServlet 的 doGet()和 doPost() 方法。




我们接着看 FrameworkServlet 的 doGet 和 doPost 方法都是调用其 processRequest 方法。这个方法里面主要的调用 DispatcherServlet 中 doService()方法。



在 DispatcherServlet 中的这个方法。会调用 doDispatche() 方法执行。




所以整体的请求流程都在 doDispatch() 方法中。


主要流程如下:


1、根据 url 请求获取到 handlerExecutorChina 对象,也就是获取到 handler 执行链对象,这个对象中包含执行的 handler 和一个拦截器的集合。




2、根据这个 handlerExecutorChina 执行链对象获取到对应的 handlerAdapter handler 适配器。


![](https://imgconvert.csdnim


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


g.cn/aHR0cDovL3psZi5xdWVsbGFuYW4ueHl6L2ltYWdlLTIwMjAwNjExMTU0NDM5ODgxLnBuZw?x-oss-process=image/format,png)


3、根据这个适配器,真正执行 handler ,并且返回一个 modeAndView 这里的 handler 就是我们通常所有的 controller 层的业务逻辑。



4、根据获取到的 modeAndView ,解析渲染页面并返回结果。



这样整体核心流程就完了。只有这四步。其实和最开始的流程处理图是一样的。总结一下:先根据请求从 handlermapping 中获取到 handle ,然后通过 handle 找到能处理该请求的 handlerAdapter ,通过 handlerAdapter 执行真正的 handler 也就是我们的业务代码,并返回一个 ModeAndView 。然后通过 viewResolver 解析成 view 返回给页面

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
一文读懂 spring MVC 请求处理流程,java程序设计教程第三版