1. Обзор
Все фреймворки MVC предоставляют способ работы с представлениями.
Spring делает это с помощью преобразователей представлений, которые позволяют отображать модели в браузере, не привязывая реализацию к конкретной технологии представления.
ViewResolver сопоставляет
имена представлений с фактическими представлениями.
И среда Spring поставляется с несколькими преобразователями представлений, например InternalResourceViewResolver
, BeanNameViewResolver
и некоторыми другими.
Это простое руководство показывает, как настроить наиболее распространенные преобразователи представлений и как использовать несколько ViewResolver
в одной конфигурации .
2. Веб-конфигурация Spring
Начнем с веб-конфигурации; мы аннотируем его с помощью @EnableWebMvc
, @Configuration
и @ComponentScan
:
@EnableWebMvc
@Configuration
@ComponentScan("com.foreach.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
, как определено в конфигурации:
<html>
<head></head>
<body>
<h1>This is the body of the sample view</h1>
</body>
</html>
4. Добавьте BeanNameViewResolver
Это реализация ViewResovler, которая интерпретирует имя представления как имя компонента в текущем контексте приложения. Каждый из них
View
может быть определен как bean-компонент в конфигурациях XML или Java.
Во-первых, мы добавляем BeanNameViewResolver
в предыдущую конфигурацию:
@Bean
public BeanNameViewResolver beanNameViewResolver(){
return new BeanNameViewResolver();
}
Как только ViewResolver определен, нам нужно определить bean-компоненты типа View , чтобы
DispatcherServlet
мог выполнять его для визуализации представления:
@Bean
public View sample() {
return new JstlView("/WEB-INF/view/sample.jsp");
}
Вот соответствующий метод-обработчик из класса контроллера:
@GetMapping("/sample")
public String showForm() {
return "sample";
}
Из метода контроллера имя представления возвращается как « образец»
, что означает, что представление из этого метода обработчика разрешается в класс JstlView с
/WEB-INF/view/sample.jsp
URL-адресом.
5. Цепочка ViewResolvers
и определение приоритета порядка
Spring MVC также поддерживает несколько преобразователей представлений .
Это позволяет вам переопределять определенные представления в некоторых обстоятельствах. Мы можем просто сцепить преобразователи представлений, добавив в конфигурацию более одного преобразователя.
После того, как мы это сделали, нам нужно определить порядок для этих распознавателей. Свойство порядка
используется для определения порядка вызовов в цепочке. Чем выше свойство порядка (наибольший порядковый номер), тем позже в цепочке позиционируется преобразователь представлений.
Чтобы определить порядок, мы можем добавить следующую строку кода в конфигурацию наших преобразователей представлений:
bean.setOrder(0);
Будьте осторожны с приоритетом порядка, так как InternalResourceViewResolver
должен иметь более высокий порядок, потому что он предназначен для представления очень явного сопоставления. И если другие распознаватели имеют более высокий порядок, то InternalResourceViewResolver
может никогда не вызываться.
6. Использование Spring Boot
При работе с Spring Boot WebMvcAutoConfiguration автоматически настраивает bean-компоненты InternalResourceViewResolver
и BeanNameViewResolver
в контексте нашего приложения .
**
** ``
Кроме того, добавление соответствующего стартера для механизма шаблонов отнимает большую часть ручной настройки, которую мы должны были бы выполнять в противном случае.
Например, добавив зависимость spring-boot-starter-thymeleaf
в наш pom.xml, Thymeleaf будет включен, и дополнительная настройка не потребуется:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring-boot-starter-thymeleaf.version}</version>
</dependency>
Эта начальная зависимость настраивает bean-компонент ThymeleafViewResolver с именем thymeleafViewResolver
в контексте нашего приложения. Мы можем переопределить автоматически настроенный ThymeleafViewResolver, предоставив bean-компонент с тем же именем.
Преобразователь представлений Thymeleaf работает, окружая имя представления префиксом и суффиксом. Значения префикса и суффикса по умолчанию — «classpath:/templates/» и «.html» соответственно.
Spring Boot также предоставляет возможность изменить значение префикса и суффикса по умолчанию с помощью соответствующих настроек
spring.thymeleaf.prefix
и
spring.thymeleaf.suffix
свойств.
Точно так же у нас есть начальные зависимости для механизмов шаблонов groovy-templates , freemarker и mustache , которые мы можем использовать для автоматической настройки соответствующих распознавателей представлений с помощью Spring Boot.
DispatcherServlet
использует все преобразователи представлений, которые он находит в контексте приложения, и пробует каждый из них, пока не получит результат, поэтому порядок этих преобразователей представлений становится очень важным, если мы планируем добавить свои собственные.
7. Заключение
В этом руководстве мы настроили цепочку преобразователей представлений, используя конфигурацию Java. Играя с приоритетом порядка, мы можем установить порядок их вызова.
Реализацию этого простого туториала можно найти в проекте github .