您的位置:首页 > 编程语言 > Java开发

Spring MVC 源码阅读笔记

2016-06-08 16:38 495 查看

一、功能

视图解析器ViewResolver用于返回页面或者数据给前端请求。

二、接口及实现类

顶层接口: ViewResolver

定义了最核心的 View resolverViewName方法, 根据视图名返回真实的视图对象


实现类:

BeanNameViewResolver:  将controller中返回的逻辑视图名做为beanID去applicationContext中获取View对象, 如果没有找到会报错。
ContentNegotiatingViewResolver:
本身不负责解析视图, 它根据请求content-type选择与之相匹配的视图解析器来完成实际的视图解析工作。
属性:
viewResolvers: 指定视图解析器列表, 如果没配置此属性, Spring会自动从ApplicationContext中查找ViewResolver类型的Bean
defaultViews: 配置默认视图列表, 默认视图的作用是所有ViewResolver都没有找到合适视图时, 会从默认视图中查看是否有匹配的。
AbstractCachingViewResolver:
UrlBasedViewResolver:
InternalResourceViewResolver:通过RequestDispatcher完成内部跳转, 主要用于在JSP和Servlet之间跳转


三、视图

1、两个特殊的视图:

RedirectView、ForwardView

RedirectView用于给客户端发送重定向响应(302), 如想从一个Controller跳转到加一个Controller, 可以return “redirect: xxx.action”, 客户收到响应后就会自动请求xxx.action这个RequestMapping, 间接实现了从一个Controller跳转到另一个Controller.

ForwardView, 基于RequestDispatch, 在服务端实现跳转, 同时将reqeust参数带入请求中, 这种跳转同样可以实现Controller -> Controller, 而且对客户端无感(不会改变客户端URL).

2、Controller中的方法无返回值时

这时Spring会用当前请求地址作为逻辑视图名调用众多视图解析器去解析视图。

四、Spring怎么决定用哪个视图解析器

如果配置的有多个视图解析器, Spring按照配order属性决定优先级, 1为优先级最高。

如果配置了ContentNegotiatingViewResolver视图解析器, 并且已经进入ContentNegotiatingViewResolver解析器, ContentNegotiatingViewResolver会查找内部配置的viewResolvers或者ApplicationContext中配置的其它视图解析器, 按请求类型和解析器响应类型, 选择合适的视图解析器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息