2015-05-01 28 views
2

這是當無恥地從Internet上覆制示例時遇到的那種奇怪的問題。我使用Spring MVC 4,Apache Tiles 3,Java 8和Tomcat 8.爲什麼ResourceBundleViewResolver需要views.properties

我絕對必須有一個views.properties文件。 但是它不需要有任何實際的映射。所以問題不在於爲什麼我需要它,而是爲什麼我不需要它。

正如你可以從views.properties文件中看到的,它有一個條目與userList沒有任何關係。如果文件完全丟失,則DispatcherServlet將引發異常。但有了這個可憐的條目,一切正常。當然,它列出了TilesView類,並提供了一個可能尋找JSP的位置的一般概念。但一切我讀過說,每個JSP必須精心列在views.properties文件中。這根本不是事實。

一方面這很好,因爲它維護起來要少很多。但另一方面,這讓我覺得我真的錯過了一些重要的東西。免責聲明:我還沒有破解靜態資源解析器,這是證明相當頑固。這似乎與這個完全無關,除了這兩個都是Spring發現我的資源的一般問題。

臭名昭著views.properties(整個文件)

messages.(class)=org.springframework.web.servlet.view.tiles3.TilesView 
messages.url=/WEB-INF/xxxx/messages.jsp (for example) 

強制性代碼實例:

@Configuration類

... 
@Bean 
TilesConfigurer tilesConfigurer() { 
    TilesConfigurer tilesConfigurer = new TilesConfigurer(); 
    tilesConfigurer.setDefinitions("WEB-INF/tiles/tiles.xml"); 
    return tilesConfigurer; 
} 

@Bean 
ResourceBundleViewResolver viewResolver() { 
    ResourceBundleViewResolver resourceBundleViewResolver = new ResourceBundleViewResolver(); 
    resourceBundleViewResolver.setBasename("views"); 
    return resourceBundleViewResolver; 
} 

@Bean 
TilesViewResolver tilesVewResolver() { 
    return new TilesViewResolver(); 
} 
... 

tiles.xml

<tiles-definitions> 
<definition name="baseLayout" template="/WEB-INF/tiles/maintemplate.jspx"> 
    <put-attribute name="header" value="/WEB-INF/tiles/header.jspx" /> 
    <put-attribute name="menu" value="/WEB-INF/tiles/menu.jspx" /> 
    <put-attribute name="body" value="" /> 
    <put-attribute name="footer" value="/WEB-INF/tiles/footer.jspx" /> 
</definition> 

<!-- USERS --> 
<definition name="userEdit" extends="baseLayout"> 
    <put-attribute name="title" value="Edit User" /> 
    <put-attribute name="body" value="/WEB-INF/views/users/edit.jspx" /> 
</definition> 
<definition name="userList" extends="baseLayout"> 
    <put-attribute name="title" value="List Users" /> 
    <put-attribute name="body" value="/WEB-INF/views/users/list.jspx" /> 
</definition> 
... 

用戶控件ler.java

... 
@PreAuthorize("isAuthenticated()") 
@RequestMapping(method = RequestMethod.GET) 
public String list(Locale locale, HttpServletRequest request, HttpServletResponse response, Model uiModel) { 

    themeResolver.setThemeName(request, response, "defaultTheme"); 

    List<User> users = userRepository.findAll(); 
    uiModel.addAttribute("users", users); 
    return "userList"; 
} 
... 
+1

您正在使用與使用常規JSP文件完全不同的圖塊。你說什麼只適用於如果你不使用瓷磚的東西。因此,如果您使用通用的'InternalResourceView'或'JstlView',您將不得不列出每一個。瓷磚是不同的,因爲有一個來源包含所有的視圖,瓷磚配置。這裏的視圖名稱引用了一個tile定義。另外我強烈懷疑你有多個視圖解析器,而不僅僅是一個'ResourceBundleViewResolver'。我甚至認爲你的'ResourceBundleViewResolver'甚至沒有被使用。 –

+0

謝謝,這非常有啓發性。我評論了ResourceViewResolver並刪除了views.properties,該應用程序仍然正常工作。我確實有一個TilesViewResolver,正如你猜到的(我在上面添加了它)。 – Terry

回答

1

ResourceBundleViewResolver需要其包含用於每個查看它可以處理一個配置的附加配置文件。默認使用views的基本名稱。如果此文件不存在,ResourceBundleViewResolver將無法​​加載/啓動。

根據您所描述的行爲和您使用瓷磚的事實判斷,我懷疑您也有TilesViewResolver。對於拼貼,返回視圖的名稱(此處爲userList)必須對應於拼貼視圖定義。

當使用Spring MVC時,將查詢所有配置的ViewResolver以將視圖的名稱解析爲實際的View實現。在你的情況下,ResourceBundleViewResolver將返回null作爲視圖分辨率,因爲它只能處理名爲messages的視圖,接下來TilesViewResolver被查詢,由於存在userList的視圖定義,將返回視圖。