SpringMVC配置多視圖JSP+freemarker

jopen 10年前發布 | 49K 次閱讀 SpringMVC Spring MVC Web框架

SpringMVC 的多視圖,本以為很簡單,實踐后發現各種問題,在網上查了很多資料,最后還是選擇了看源碼,終于知道為什么失敗了,下面介紹一下.

失敗配置! 成功只是改了幾個小地方.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=";
    xmlns:cxf="

<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />
<!-- 配置freeMarker視圖解析器 -->
<bean id="viewResolver"
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="viewNames" value="*.ftl" />
    <property name="contentType" value="text/html; charset=utf-8" />
    <property name="cache" value="true" />
    <property name="prefix" value=""/> 

        <property name="suffix" value=".ftl"/>          <property name="order" value="0"/>  <property name="exposeRequestAttributes" value="true" /> <property name="allowSessionOverride" value="true" /> <property name="exposeSessionAttributes" value="true" /> <property name="exposeSpringMacroHelpers" value="true" /> </bean> </beans></pre>

以上是我在網上搜找到的大部分配置,問題出在,以jsp配置為例:

        <property name="viewNames" value="*.jsp" />
        <property name="suffix" value=".jsp"/>
         <property name="order" value="1"/>

第一:有一部分人說order屬性不管用,我在看源碼debug時發現是有用的,他會指定使用哪一個配置進行創建視圖,(數字越小優先級越高),例如:你的項目大部分是jsp很少一部分是ftl或其他視圖,沒有特別要求的話肯定要jsp優先級別高一些,這樣他會直接匹配jsp視圖,匹配成功后就不會在去找ftl視圖了.

下面進入正題,也是出問題的地方, 

viewNames:屬性代表你在return 視圖的名稱時.文件名必須帶后綴,這樣spring回去判斷是否是以.jsp結尾,

假如說你確實是返回的文件名+后綴名,但是suffix:屬性會在創建視圖前幫你加上后綴.jsp,這樣spring就幫你又加了一遍.jsp,這肯定最后是找不到文件的會異常.

    部分源碼:

    

public static boolean simpleMatch(String pattern, String str) {
        if (pattern == null || str == null) {
            return false;
        }
        int firstIndex = pattern.indexOf('*');
        if (firstIndex == -1) {
            return pattern.equals(str);
        }
        if (firstIndex == 0) {
            if (pattern.length() == 1) {
                return true;
            }
            int nextIndex = pattern.indexOf('*', firstIndex + 1);
            if (nextIndex == -1) {
                return str.endsWith(pattern.substring(1));
            }
            String part = pattern.substring(1, nextIndex);
            int partIndex = str.indexOf(part);
            while (partIndex != -1) {
                if (simpleMatch(pattern.substring(nextIndex), str.substring(partIndex + part.length()))) {
                    return true;
                }
                partIndex = str.indexOf(part, partIndex + 1);
            }
            return false;
        }
        return (str.length() >= firstIndex &&
                pattern.substring(0, firstIndex).equals(str.substring(0, firstIndex)) &&
                simpleMatch(pattern.substring(firstIndex), str.substring(firstIndex)));
    }


    正確配置是

        <property name="viewNames" value="*.jsp" />
        <property name="suffix" value=""/>

    java:

return "/jsp.jsp";


如果說返回時不帶后綴名,

        <property name="viewNames" value="" />
        <property name="suffix" value=".jsp"/>

    java:

return "/jsp";

不知道這么說大家會不會明白,這2個屬性不能都設置,spring后自動幫你找到你要的視圖,也不用重新實現ViewResolver接口,有特殊情況的可以實現自己的邏輯,

http://yunpan.cn/cjBvaI3ehdRQR  提取碼 26d0  想使用git的不大會用 22端口被封,先這么用吧360云盤 直接tomcat打包

來自:http://my.oschina.net/u/1472917/blog/411979

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!