2014-09-22 105 views
0

我用Tiles項目創建了Spring MVC。爲什麼我們不應該同時使用jspViewResolver和TilesViewResolver?

我的控制器返回一個字符串「hello」,這是一個邏輯文件名,我把jsp稱爲hello.jsp。

在tiles.xml中,我應該有一個名爲hello的定義擴展定義模板。 我的基本定義被映射到layout.jsp。

當我添加jspViewResolver時,它將我帶到hello.jsp,但是如果我將其註釋掉,它將根據tile.xml中的hello定義呈現layout.jsp。

那麼,爲什麼我們不應該同時使用jspViewResolver和tilesViewResolver?

+1

兩者都是UrlBasedViewResolver的實例,它簡單地構造一個URL,而不管請求的視圖是否存在。其他'ViewResolver'像'BeanNameViewResolver'不存在時不返回視圖。在你的視圖解析器鏈中有多個UrlBasedViewResolver會使最後一個永遠不會調用。正如課程的文檔中所解釋的那樣。 – 2014-09-22 05:41:00

+0

如果您想將此作爲答案,我可能選擇此作爲最佳答案。 :) – user3705478 2014-09-22 07:34:34

+0

該評論實際上並不完全正確,給了一些更詳細的解釋。 – 2014-09-22 09:21:44

回答

1

無論是TilesViewResolverInternalResourceViewResolverUrlBasedViewResolver的實例實例。一般而言,這意味着ViewResolver接受給定的視圖名稱,並嘗試從中構建一個URL,不管視圖的實際存在如何,都使用此URL來解析視圖。

根據Spring版本(Spring> = 3.0)和使用的子類進行檢查以檢查視圖的實際存在。 (見this解決了問題)。

唯一的實現不是實際檢查視圖的存在(目前)它是InternalResourceViewResolver還是普通的UrlBasedViewResolver實例。當使用這個時,這使得這是視圖解析器鏈中的最後一個(最高order屬性)。

如果您想將普通JSP與Tiles結合起來,實際上應該可以通過給TilesViewResolver命令1和InternalResourceViewResolver命令高於1(例如2)來實現。

在早期版本(Spring < 3.0)中,這些檢查不到位,排序也沒有任何影響。

相關問題