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 .