這是當無恥地從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";
}
...
您正在使用與使用常規JSP文件完全不同的圖塊。你說什麼只適用於如果你不使用瓷磚的東西。因此,如果您使用通用的'InternalResourceView'或'JstlView',您將不得不列出每一個。瓷磚是不同的,因爲有一個來源包含所有的視圖,瓷磚配置。這裏的視圖名稱引用了一個tile定義。另外我強烈懷疑你有多個視圖解析器,而不僅僅是一個'ResourceBundleViewResolver'。我甚至認爲你的'ResourceBundleViewResolver'甚至沒有被使用。 –
謝謝,這非常有啓發性。我評論了ResourceViewResolver並刪除了views.properties,該應用程序仍然正常工作。我確實有一個TilesViewResolver,正如你猜到的(我在上面添加了它)。 – Terry