spring艳 2020-05-30
在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接口

可以成功跳转!
关于springmvc多视图解析器解析的问题:
假设我现在有两个jsp页面,分别在其它的目录下怎么办:
1、WEB-INF/A/a.jsp
2、WEB-INF/B/b.jsp


但是报404,因为jsp目录下没有a.jsp这个页面,显然返回的视图名有一开始定义的视图解析器处理了。

那要如何按照自己的设想进行跳转呢?
最简单的办法是使用其viewNames属性,来指定一个是否可以处理的规则
<property name="viewNames" value="A*"/>
<property name="viewNames" value="B*"/>
如上两个的意思是对A或B开头的视图名进行处理,比如返回的视图名为A/a(或者A_a) 那么会交给viewNames为A*的那个解析器处理;支持的规则可以查看javadoc。

<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>
成功!