【Spring MVC源码解析】(二)请求处理流程

论坛 期权论坛     
选择匿名的用户   2021-5-23 22:50   375   0
<h1>一、概览</h1>
<p>本篇来看看,一个web用户请求是如何被Spring mvc(DispatchServlet)处理的,先上图:</p>
<p style="text-align:center;"><img alt="" height="601" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-f66bbce31d5ccfdd5d7bedc5de3ae3d2.png" width="903"></p>
<h3>具体步骤:</h3>
<p>第一步:发起请求到前端控制器(DispatcherServlet)</p>
<p>第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找)</p>
<p>第三步:处理器映射器HandlerMapping向前端控制器返回Handler,HandlerMapping会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象),通过这种策略模式,很容易添加新的映射策略</p>
<p>第四步:前端控制器调用处理器适配器去执行Handler</p>
<p>第五步:处理器适配器HandlerAdapter将会根据适配的结果去执行Handler</p>
<p>第六步:Handler执行完成给适配器返回ModelAndView</p>
<p>第七步:处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)</p>
<p>第八步:前端控制器请求视图解析器去进行视图解析 (根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可</p>
<p>第九步:视图解析器向前端控制器返回View</p>
<p>第十步:前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)</p>
<p>第十一步:前端控制器向用户响应结果</p>
<h3>MVC 九大组件</h3>
<p><strong>MultipartResolver(多文件上传组件)</strong></p>
<p>  其实这是一个大家很熟悉的组件,MultipartResolver 用于处理上传请求,通过将普通的Request 包装成MultipartHttpServletRequest 来实现。MultipartHttpServletRequest可以通过getFile() 直接获得文件,如果是多个文件上传,还可以通过调用getFileMap得到Map&lt;FileName, File&gt; 这样的结构。</p>
<p><strong>LocaleResolver(本地语言环境组件)</strong></p>
<p>  在LocaleResolver用于从request 中解析出Locale, 在中国大陆地区,Locale 当然就会是zh-CN 之类,用来表示一个区域。这个类也是i18n 的基础。</p>
<p><strong>ThemeResolver(模板主题处理组件)</strong></p>
<p>  从名字便可看出,这个类是用来解析主题的。Spring MVC 中一套主题对应一个properties 文件,里面存放着跟当前主题相关的所有资源,如图片,css 样式等。创建主题非常简单,只需准备好资源,然后新建一个&#34;主题名.properties&#34; 并将资源设置进去,放在classpath 下,便可以在页面中使用了。Spring MVC 中跟主题有关的类有ThemeResolver, ThemeSource 和Theme。ThemeResolver 负责从request 中解析出主题名, ThemeSource 则根据主题名找到具体的主题, 其抽象也就是Theme, 通过Theme 来获取主题和具体的资源。</p>
<p><strong>HandlerMappings(处理器映射组件)</strong></p>
<p>  HandlerMapping 是用来查找Handler 的,也就是处理器,具体的表现形式可以是类也可以是方法。比如,标注了&#64;RequestMapping 的每个method 都可以看成是一个Handler,由Handler 来负责实际的请求处理。HandlerMapping 在请求到达之后,它的作用便是找到请求相应的处理器Handler 和Interceptors。</p>
<p><strong>HandlerAdapters (处理器适配器)</strong></p>
<p>  从名字上看,这是一个适配器。因为Spring MVC 中Handler 可以是任意形式的,只要能够处理请求便行, 但是把请求交给Servlet 的时候,由于Servlet 的方法结构都是如doService(HttpServletRequest req, HttpServletResponse resp) 这样的形式,让固定的Servlet 处理方法调用Handler 来进行处理,这一步工作便是HandlerAdapter 要做的事。</p>
<p><strong>HandlerExceptionResolvers(异常处理组件)</strong></p>
<p>  从这个组件的名字上看,这个就是用来处理Handler 过程中产生的异常情况的组件。具体来说,此组件的作用是根据异常设置ModelAndView, 之后再交给render()方法进行渲染, 而render() 便将ModelAndView 渲染成页面。不过有一点,HandlerExceptionResolver 只是用于解析对请求做处理阶段产生的异常,而渲染阶段的异常则不归他管了,这也是Spring MVC 组件设计的一大原则分工明确互不干涉。</p>
<p><strong>RequestToViewNameTranslator(视图预处理器组件)</strong></p>
<p>  这个组件的作用,在于从Request 中获取viewName. 因为ViewResolver 是根据ViewName 查找View, 但有的Handler 处理完成之后,没有设置View 也没有设置ViewName, 便要通过这个组
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP