2015-05-01 3 views
2

Это своего рода странный вопрос, который возникает при бесстыдном копировании примеров из Интернета. Я использую 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"; 
} 
... 
+1

Вы используете плитки, которые сильно отличаются от обычных JSP-файлов. То, что вы говорите, применяется ТОЛЬКО, если вы не используете такие вещи, как плитки. Поэтому, если вы используете общий 'InternalResourceView' или' JstlView', вам нужно будет перечислить каждый из них. Плитки разные, так как существует единственный источник, содержащий все виды, конфигурацию плиток. Здесь имя вида ссылается на определение фрагментов. Кроме того, я сильно подозреваю, что у вас есть несколько представлений, а не только «ResourceBundleViewResolver». Я даже думаю, что ваш ResourceBundleViewResolver даже не используется. –

+0

Спасибо, это очень поучительно. Я прокомментировал ResourceViewResolver и удалил views.properties, и приложение все еще работает нормально. У меня действительно есть TilesViewResolver, как вы догадались (я добавил его выше). – Terry

ответ

1

ResourceBundleViewResolver требуется дополнительный файл конфигурации, который содержит конфигурацию для каждого просмотра он может работать. По умолчанию используется базовое имя views. Если этого файла нет, ResourceBundleViewResolver не сможет загрузить/запустить.

Судя по поведению, которое вы описываете, и тому факту, что вы используете плитки, я подозреваю, что у вас также есть TilesViewResolver. Для плиток имя возвращаемого вида, здесь userList, должно соответствовать определению вида плитки.

При использовании Spring MVC сконфигурированы все сконфигурированные ViewResolver s для разрешения имени представления на фактическую реализацию View. В вашем случае ResourceBundleViewResolver вернет null для разрешения вида, так как он может обрабатывать только вид с именем messages, затем с сообщением TilesViewResolver, который вернет представление, поскольку существует определение вида плитки для userList.

Смежные вопросы