1. Обзор
Все фреймворки MVC предоставляют способ работы с представлениями.
Spring делает это с помощью распознавателей представлений, которые позволяют визуализировать модели в браузере, не привязывая реализацию к определенной технологии представления.
ViewResolver сопоставляет имена представлений с фактическими представлениями.
И Spring framework поставляется с довольно большим количеством распознавателей представлений, например InternalResourceViewResolver , XmlViewResolver , ResourceBundleViewResolver и некоторыми другими.
Это простой учебник, показывающий, как настроить наиболее распространенные распознаватели представлений и как использовать несколько ViewResolver в одной конфигурации .
2. Весенняя веб-Конфигурация
Давайте начнем с веб-конфигурации; мы будем аннотировать ее с помощью @EnableWebMvc , @Configuration и @ComponentScan :
@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
// All web configuration will go here
}Именно здесь мы настроим наш распознаватель представлений в конфигурации.
3. Добавьте InternalResourceViewResolver
Этот ViewResolver позволяет нам задать такие свойства, как префикс или суффикс имени представления, чтобы сгенерировать окончательный URL-адрес страницы представления:
@Bean
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}Для такой простоты примера нам не нужен контроллер для обработки запроса.
Нам нужна только простая страница jsp , помещенная в папку /WEB-INF/view , как определено в конфигурации:
This is the body of the sample view
4. Добавьте ResourceBundleViewResolver
Как следует из названия этого решателя, ResourceBundleViewResolver использует определения компонентов в ResourceBundle .
Сначала мы добавим ResourceBundleViewResolver в предыдущую конфигурацию:
@Bean
public ViewResolver resourceBundleViewResolver() {
ResourceBundleViewResolver bean = new ResourceBundleViewResolver();
bean.setBasename("views");
return bean;
}
Пакет обычно определяется в файле свойств, расположенном в пути к классу. Ниже приведен файл views.properties :
sample.(class)=org.springframework.web.servlet.view.JstlView sample.url=/WEB-INF/view/sample.jsp
Мы также можем использовать простую страницу jsp , определенную в приведенном выше примере, для этой конфигурации.
5. Добавьте XmlViewResolver
Эта реализация ViewResolver принимает файл конфигурации, записанный в XML с тем же DTD , что и фабрики компонентов Spring XML :
@Bean
public ViewResolver xmlViewResolver() {
XmlViewResolver bean = new XmlViewResolver();
bean.setLocation(new ClassPathResource("views.xml"));
return bean;
}Ниже приведен файл конфигурации, views.xml :
Что касается предыдущих примеров мы можем использовать наши простой jsp страница определена ранее.
6. Цепочка ViewResolvers и определение приоритета заказа
Spring MVC также поддерживает несколько распознавателей представлений .
Это позволяет в некоторых случаях переопределять определенные представления. Мы можем просто объединить распознаватели вида в цепочку, добавив в конфигурацию более одного распознавателя.
Как только мы это сделаем, нам нужно будет определить порядок для этих решателей. Свойство order используется для определения порядка вызовов в цепочке. Чем выше свойство order (наибольший номер заказа), тем позже viewresolver позиционируется в цепочке.
Чтобы определить порядок, мы можем добавить следующую строку кода в конфигурацию распознавателей наших представлений:
bean.setOrder(0);
Будьте осторожны с приоритетом порядка, так как InternalResourceViewResolver должен иметь более высокий порядок – потому что он предназначен для представления очень явного отображения. И если другие распознаватели имеют более высокий порядок, то InternalResourceViewResolver может никогда не вызываться.
7. Заключение
В этом уроке мы настроили цепочку распознавателей представлений с помощью конфигурации Java. Играя с приоритетом порядка, мы можем установить порядок их вызова.
Реализацию этого простого учебника можно найти в проекте github .