SpringMVC:多视图解析器配置以及问题
多个视图解析器的配置
在SpringMVC模式当中可以通过如下配置来支持多视图解析
<!-- jsp jstl --> <bean id="JSPViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="viewNames" value="*jsp" /> <property name="contentType" value="text/html; charset=utf-8"/> <property name="prefix" value="/" /> <property name="suffix" value="" /> <property name="order" value="1"></property> </bean>
<bean id="FMViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/> <property name="viewNames" value="*html" /> <property name="contentType" value="text/html; charset=utf-8"/> <property name="cache" value="true" /> <property name="prefix" value="/" /> <property name="suffix" value="" /> <property name="order" value="0"></property> </bean>
首先可以使用order属性进行设置 系统首先按解析器的order值进行查找 首先使用FreeMarkerViewResolver解析器调用canHandle方法,判断当前解析器对视图是否能够解析。如不能解析在依次调用。
具体使用
单个视图解析器:
1、springmvc配置文件
<!-- 3.配置jsp 显示ViewResolver视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
2、静态页面
3、Controller接口
可以成功跳转!
问题,如果jsp页面不在jsp目录下,怎么跳转?
关于springmvc多视图解析器解析的问题:
假设我现在有两个jsp页面,分别在其它的目录下怎么办:
1、WEB-INF/A/a.jsp
2、WEB-INF/B/b.jsp
controller接口但是报404,因为jsp目录下没有a.jsp这个页面,显然返回的视图名有一开始定义的视图解析器处理了。
那要如何按照自己的设想进行跳转呢?
解决方案
最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则
<property name="viewNames" value="A*"/>
<property name="viewNames" value="B*"/>
如上两个的意思是对A或B开头的视图名进行处理,比如返回的视图名为A/a(或者A_a) 那么会交给viewNames为A*的那个解析器处理;支持的规则可以查看javadoc。
多视图解析器配置
controller层
SpringMVC配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- 支持通配符,如果返回的视图名的开头是A,则使用该视图解析器 也可以定义为 *A*:表示包含A的 --> <property name="viewNames" value="A*"/> <!-- 如果定义为:value="/WEB-INF/A/",返回的视图名为A/a,会拼接成/WEB-INF/A/A/a.jsp就找不到了 --> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="viewNames" value="B*"/> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean>
注意点
新增两个视图解析器,注意默认的视图解析器(就是没有设置viewNames属性的),必须放在新增的视图解析器的后面。
否则返回的页面还是由默认的视图解析器解析的,就会导致404。
如果就想要默认的视图解析器写在最上面该怎么办,我们可以通过设置视图解析器的顺序。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 默认的视图:不定义顺序或者定义的顺序要比其他的视图解析器的order值要大 --> <property name="order" value="2"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- viewNames和order属性需要同时定义,先后顺序可随意--> <property name="order" value="1"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <!-- 支持通配符,如果返回的视图名的开头是A,则使用该视图解析器 也可以定义为 *A*:表示包含A的 --> <property name="viewNames" value="A*"/> <!-- 如果定义为:value="/WEB-INF/A/",返回的视图名为A/a,会拼接成/WEB-INF/A/A/a.jsp就找不到了 --> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="order" value="1"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="viewNames" value="B*"/> <property name="prefix" value="/WEB-INF/"/> <property name="suffix" value=".jsp"/> </bean>
成功!