- 在配置视图跳转和使用视图时,指定视图界面的路径前缀高度重复,为了解决这个问题,Spring mvc提供了视图解析器简化视图的路径,用视图的文件名直接指定视图
- 类似jsp界面发送请求时,Controller接收目录片段交给视图解析器处理,视图解析器这时就会加上相应的路径前缀和文件后缀再返回,最后再控制界面传递到相应的视图
- BeanNameViewResolver要求视图bean对象都定义在Spring的application context中, 且不会进行视图缓存。
- 如果没有设置viewResolver,spring使用InternalResourceViewResolver进行解析。
- Spring实现ViewResolver的非抽象类且我们经常使用的viewResolver有以下四种:
viewResolver |
描述 |
InternalResourceViewResolver |
将逻辑视图名字解析为一个路径 InternalResourceViewResolver不管能不能解析它都不会返回null,也就是说它拦截了所有的逻辑视图,让后续的解析器得不到执行,所以InternalResourceViewResolver必须放在最后 |
BeanNameViewResolver |
将逻辑视图名字解析为bean的Name属性,从而根据name属性,找定义View的bean |
ResourceBundleResolver |
将视图解析为资源bundle(一般为属性文件) 和BeanNameViewResolver一样,只不过定义的view-bean都在一个properties文件中,用这个类进行加载这个properties文件 |
XmlViewResolver |
和ResourceBundleResolver一样,只不过定义的view-bean在一个xml文件中,用这个类来加载xml文件,DispatcherServlet会加载所有的viewResolver到一个list中,并按照优先级进行解析。 |
ContentNegotiatingViewResolver |
通过客户端需要的内容类型来解析视图 |
FreeMarkerViewResolver |
将视图解析为FreeMaker模板 |
JaperReportsViewResolver |
将视图解析为JasperReports定义 |
TitleViewResolver |
将视图解析为Apache Tile定义,其中tile ID与视图名称相同。注意有两个不同的TileViewResolver实现,分别对应Tile 2.0和Tile 3.0 |
UrlBaseViewResolver |
直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义 |
VelocityLayoutViewResolver |
将视图解析为Velocity布局,从不同的Velocity模板中组合界面 |
VelocityViewResolver |
将视图解析为Velocity模板 |
XsltViewResolver |
将视图解析为XSLT转换后的结果 |
- 以上视图解析器可以设置一下属性,在视图解析时的以下属性会映射到视图文件上:
类属性 |
描述 |
order |
视图解析的优先级 |
prefix |
视图的相对路径的根目录 |
suffix |
视图文件的后缀,一般为.jsp |
示例
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="1" /> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> </bean> |
- 当处理器返回“index”时,InternalResourceViewResolver解析器会自动添加前缀和后缀:/WEB-INF/page/index.jsp
注
- 我们不想只使用一种视图解析器的话,可以在[spring-dispatcher-name]-servlet.xml定义多个viewResolver
- order表示视图解析的优先级,数目越小优先级越大(即:0为优先级最高,所以优先进行处理视图),InternalResourceViewResolver在项目中的优先级必须设置为最低,也就是order要最大。不然它会阻碍其他视图解析器