Spring MVC九大组件简介说明
下文笔者讲述Spring MVC九大组件简介说明,如下所示
HandlerMappings
HandlerMapping是用来查找Handler
也就是处理器
具体的表现形式可以是类也可以是方法
如:
标注了@RequestMapping每个method都可以看成是一个Handler
由Handler来负责实际的请求处理
HandlerMapping 在请求到达之后
它的作用便是找到请求相应的处理器Handler和Interceptors
HandlerAdapters
由于Servlet的方法结构都是如doService(HttpServletRequest req, HttpServletResponse resp)
,让固定的Servlet处理方法调用Handler来进行处理,这一步工作便是 HandlerAdapter要做的事。
HandlerExceptionResolvers
用来处理Handler过程中产生的异常情况的组件
此组件的作用是根据异常设置ModelAndView
之后再交给render方法进行渲染,而render便将ModelAndView渲染成页面
不过有一点
HandlerExceptionResolver只是用于解析对请求做处理阶段产生的异常而渲染阶段的异常
这也是Spring MVC组件设计的一大原则分工明确互不干涉。
ViewResolvers
这个组件的主要作用,便是将String类型的视图名和Locale解析为View类型的视图
这个接口只有一个resolveViewName()方法。
从方法的定义就可以看出,Controller层返回的String类型的视图名viewName ,
最终会在这里被解析成为View.View是用来渲染页面的
它会将程序返回的参数和数据填入模板中,最终生成html文件
ViewResolver在这个过程中,主要做两件大事
即ViewResolver 会找到渲染所用的模板(使用什么模板来渲染?)
和所用的技术(其实也就是视图的类型,如JSP啊还是其他什么Blabla的)填入参数
默认情况下,Spring MVC会为我们自动配置一个InternalResourceViewResolver,这个是针对JSP类型视图的。
RequestToViewNameTranslator
从Request中获取viewName
ViewResolver是根据ViewName查找View
但有的 Handler处理完成之后
没有设置View也没有设置ViewName
便要通过这个组件来从Request中查找viewName。
LocaleResolver
LocaleResolver用于从request 中解析出Locale
在中国大陆地区
Locale当然就会是zh-CN之类
用来表示一个区域。这个类也是i18n的基础。
ThemeResolver
这个类是用来解析主题的
主题,就是样式,图片以及它们所形成的显示效果的集合
Spring MVC中一套主题对应一个properties文件
里面存放着跟当前主题相关的所有资源
如图片,css样式等。创建主题非常简单,只需准备好资源
然后新建一个“主题名.properties”并将资源设置进去
放在classpath下,便可以在页面中使用了
Spring MVC中跟主题有关的类
有ThemeResolver, ThemeSource和Theme。ThemeResolver负责
从request中解析出主题名
ThemeSource则根据主题名找到具体的主题
其抽象也就是 Theme
通过Theme来获取主题和具体的资源。
MultipartResolver
MultipartResolver用于处理上传请求
通过将普通的Request包装成MultipartHttpServletRequest来实现
MultipartHttpServletRequest
可以通过getFile(直接获得文件,如果是多个文件上传
还可以通过调用getFileMap得到Map<FileName, File>
MultipartResolver的作用就是用来封装普通的request
使其拥有处理文件上传的功能
FlashMapManager
FlashMap用于重定向Redirect时的参数数据传递
如,在处理用户订单提交时,为了避免重复提交,可以处理完post请求后redirect到一个get请求
这个get请求可以用来显示订单详情之类的信息。这样做虽然可以规避用户刷新重新提交表单的问题
但是在这个页面上要显示订单的信息,那这些数据从哪里去获取呢
因为redirect重定向是没有传递参数这一功能的
如果不想把参数写进url(其实也不推荐这么做,url有长度限制不说,
把参数都直接暴露,感觉也不安全),那么就可以通过flashMap来传递。
只需要在redirect 之前,将要传递的数据写入request(
可以通过ServletRequestAttributes.getRequest()获得)的属性
OUTPUT_FLASH_MAP_ATTRIBUTE中
在redirect之后的handler中
spring 就会自动将其设置到 Model中,在显示订单信息的页面上,
就可以直接从 Model中取得数据了。而FlashMapManager就是用来管理FlashMap
转载自:https://juejin.cn/post/7152326786922217479