最近做一個小項目(移動端),自己搭了個簡單的SSM框架(spring + spring MVC + Mybitis),展示層本來選用的是jsp,各方便都已經搭建好,結果發現有些頁面需要用到H5的一些功能,所以展示層需要用到Html,而自己又比較熟悉jsp,所以決定使用多視圖解析器。本篇先來介紹框架內配置多視圖解析器的方式:
在spring-mvc.xml中配置:
網上看的大部分都是采用默認的InternalResourceViewResolver解析器,如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 這里的配置我的理解是自動給后面action的方法return的字符串加上前綴和后綴,變成一個 可用的url地址 --> <property name="prefix" value="/WEB-INF/view/jsp/" /> <property name="suffix" value=".jsp" /> <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> <!-- 不能用jstl的那個 --> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="order" value="0"></property> </bean>
並使用order屬性來決定解析器的優先級(數值越小,優先級越高),所以打算分別寫一個這樣的jsp和html解析器,分別給予0和1的優先級,在配置html的視圖解析器的時候,也碰到了小問題(和jsp的有些不同,可以百度,這里不再詳說)。結果發現這兩個解析器,一直只能識別優先級高的那個,並不能實現按優先級識別,結果查找了一番,最后使用了下面的方法解決(兩種不同類型的解析器)
<!-- html視圖解析器 必須先配置freemarkerConfig,注意html是沒有prefix前綴屬性的--> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath"> <value>/WEB-INF/view/html</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> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 這里的配置我的理解是自動給后面action的方法return的字符串加上前綴和后綴,變成一個 可用的url地址 --> <property name="prefix" value="/WEB-INF/view/jsp/" /> <property name="suffix" value=".jsp" /> <property name="viewClass" value="org.springframework.web.servlet.view.InternalResourceView"/> <!-- 不能用jstl的那個 --> <property name="contentType" value="text/html;charset=UTF-8"/> <property name="order" value="0"></property> </bean>
上面優先級都寫的0,經實驗發現跳轉jsp或者html都好使了。改為0和1就有問題,等項目解決完了再來研究吧...
后記:在另一個項目中也用到了這種方法,我把html的解析器代碼直接copy過去,發現不起作用,后來查閱資料才知道配置不同類型視圖解析器的時候,InternalResourceViewResolver必須放在最后
web.xml正常配置
<!-- Spring MVC 核心控制器 DispatcherServlet 配置 --> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
要加上freemarker jar包,不然會報錯