1. 配置多個視圖解析器
InternalResourceViewResolver內置了jsp解析器,用於解析jsp頁面
此處我們使用了InternalResourceViewResolver,其有一個buildView方法,該方法一定會創建一個View;所以呢View永遠不為null(即使該jsp不存在);問題就是出在這;因為我們使用這個的時候默認是使用servlet forward轉發的,此時並不知道該jsp是否存在。
解決方案
最簡單的辦法是使用其viewNames屬性,來指定一個是否可以處理的規則
<property name="viewNames" value="weixin*"/>
<property name="viewNames" value="base*"/>
如上兩個的意思是對weixin或base開頭的視圖名進行處理,比如返回的視圖名為weixin/a 那么會交給viewNames為weixin*的那個解析器處理;支持的規則可以查看javadoc。
<!-- 視圖解析器,可以根據不同的請求配置不同的響應路徑 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewNames" value="weixin*"/> <property name="prefix" value="/" /> <property name="suffix" value=".jsp" /> <property name="order" value="0" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewNames" value="base*"/> <property name="prefix" value="/login/" /> <property name="suffix" value=".jsp" /> <property name="order" value="1" /> </bean> 如何調用? return new ModelAndView("redirect:weixin/index.jsp");// 走的是第一個視圖解析器 return new ModelAndView("redirect:base/login.jsp");// 先判斷第一個,不是以weixin開頭的,再走第二個視圖解析器,符合要求
2. 配置HTML視圖解析器
html頁面需要freemark解析
<!-- <bean id="defaultViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property> <property name="prefix" value="/WEB-INF/views/"></property> <property name="suffix" value=".jsp"></property> </bean>-->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath"> <value>/WEB-INF/views/</value> </property> </bean> <bean id="htmlviewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="suffix" value=".html" /> <property name="order" value="0"></property> <property name="contentType" value="text/html;charset=UTF-8"></property> </bean>
運行tomcat,可能出現如下異常:
Caused by: java.lang.ClassNotFoundException: org.springframework.ui.freemarker.FreeMarkerConfigurationFactory
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
導入依賴包:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.3.13.RELEASE</version> </dependency>
仍可能出現如下異常:
Caused by: java.lang.ClassNotFoundException: freemarker.cache.TemplateLoader
導入依賴包:
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
還可能出現如下異常:
Caused by: java.lang.NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS
這種異常一般是由freemark依賴包版本導致,可通過變更freemark版本解決(一般使用較高版本的freemark依賴包)