为什么views.resuct BundleViewResolver需要views.properties



这是当无耻地从互联网复制示例时,人们会遇到的那种奇怪的问题。我正在使用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有瓷砖视图定义。

最新更新