Это своего рода странный вопрос, который возникает при бесстыдном копировании примеров из Интернета. Я использую Spring MVC 4, Apache Tiles 3, Java 8 и Tomcat 8.Почему для ResourceBundleViewResolver требуется значение views.properties
У меня абсолютно должен быть файл views.properties. BUT В нем нет никаких фактических сопоставлений. Поэтому вопрос заключается не столько в том, зачем он мне нужен, а в том, почему он мне не нужен.
Как вы можете видеть из файла 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>
...
UserControl 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', вам нужно будет перечислить каждый из них. Плитки разные, так как существует единственный источник, содержащий все виды, конфигурацию плиток. Здесь имя вида ссылается на определение фрагментов. Кроме того, я сильно подозреваю, что у вас есть несколько представлений, а не только «ResourceBundleViewResolver». Я даже думаю, что ваш ResourceBundleViewResolver даже не используется. –
Спасибо, это очень поучительно. Я прокомментировал ResourceViewResolver и удалил views.properties, и приложение все еще работает нормально. У меня действительно есть TilesViewResolver, как вы догадались (я добавил его выше). – Terry