这是当无耻地从互联网复制示例时,人们会遇到的那种奇怪的问题。我正在使用Spring MVC 4,Apache Tiles 3,Java 8和Tomcat 8。
我绝对必须有一个views.properties文件。但是它不需要任何实际的映射。因此,问题不是我为什么需要它,但是为什么我不需要它。
您可以从视图中看到。如果文件完全缺少,则dispatcherserv会引发异常。但是有了这个可怜的条目,一切都很好。授予它确实列出了Tilesview类,并提供了一个在哪里寻找JSP的概括的想法。但是所有内容我已经看过说,每个JSP都必须在views.properties文件中精心列出。那根本不是真的。
一方面这是好的,因为它要少得多。但另一方面,这让我觉得我真的缺少一些重要的东西。免责声明:我尚未破解静态资源解析器,事实证明这很顽固。这似乎与此完全无关,除了是春季找到我的资源的一般问题。
臭名昭著的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>
...
usercontroller.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";
}
...
ResourceBundleViewResolver
需要一个附加的配置文件,该文件包含适用于其可以处理的每个视图的配置。默认情况下,使用views
的Basename。如果此文件没有,则ResourceBundleViewResolver
将无法加载/启动。
根据您描述的行为以及您使用瓷砖的事实,我怀疑您也有TilesViewResolver
。对于瓷砖,返回的视图的名称,此处userList
必须对应于图块视图定义。
使用Spring MVC时,请参阅所有配置的ViewResolver
S,以将视图名称解析为实际的View
实现。在您的情况下,ResourceBundleViewResolver
将返回null
以进行视图分辨率,因为它只能处理名为messages
的视图,接下来会咨询TilesViewResolver
,该视图将返回视图,因为userList
有瓷砖视图定义。