Перейти к основному содержимому

Руководство по ViewResolver в Spring MVC

· 4 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

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 .