Spring MVC определяет интерфейсы ViewResolver и View, которые позволяют визуализировать модели в браузере, не привязывая вас к конкретной технологии представления. ViewResolver обеспечивает сопоставление между именами представлений и реальными представлениями. View занимается подготовкой данных перед передачей в конкретную технологию представления.
В следующей таблице представлена более подробная информация об иерархии ViewResolver:
| ViewResolver | Описание |
|---|---|
|
|
Подклассы |
|
|
Простая реализация интерфейса |
|
|
Удобный подкласс |
|
|
Удобный подкласс |
|
|
Реализация интерфейса |
|
|
Реализация интерфейса |
Обработка
Вы можете создавать цепочки распознавателей представлений, объявляя более одного бина распознавателя и, при необходимости, задавая свойство order для определения порядка. Помните, что чем выше свойство порядка, тем позже в цепочке располагается распознаватель представления.
Контракт ViewResolver определяет, что он может возвращать null, чтобы определить, что представление не может быть найдено. Однако в случае с JSP и InternalResourceViewResolver единственный способ выяснить, существует ли JSP, – это выполнить диспетчеризацию через RequestDispatcher. Поэтому всегда нужно располагать InternalResourceViewResolver в конфигурации последним в общем порядке распознавателей представлений.
Сконфигурировать распознавание представлений так же просто, как добавить бины ViewResolver в конфигурацию Spring. MVC Config предоставляет специальный конфигурационный API для распознавателей представлений и для добавления контроллеров представлений без алгоритма, которые полезны для визуализации HTML-шаблона без алгоритма управления.
Переадресация
Специальный префикс redirect: в имени представления позволяет выполнить переадресацию. UrlBasedViewResolver (и его подклассы) распознает это как команду осуществить необходимую переадресацию. Остальная часть имени представления – это URL-адрес переадресации.
Конечный результат такой же, как если бы контроллер возвращал RedirectView, но теперь сам контроллер может работать с именами логических представлений. Имя логического представления (например, redirect:/myapp/some/resource) осуществляет переадресацию относительно текущего контекста сервлета, в то время как имя, такое как redirect:https://myhost.com/some/arbitrary/path, осуществляет переадресацию на абсолютный URL-адрес.
Обратите внимание, что если метод контроллера аннотирован @ResponseStatus, значение аннотации имеет приоритет над статусом ответа, установленным RedirectView.
Перенаправление
Вы также можете использовать специальный префикс forward: для имен представлений, которые в конечном итоге распознаются UrlBasedViewResolver и подклассами. Это создает InternalResourceView, который выполняет RequestDispatcher.forward(). Поэтому этот префикс бесполезен при использовании InternalResourceViewResolver и InternalResourceView (для JSP), но он может оказаться полезным, если используется другая технология представления, но все же необходимо в принидительном порядке перенаправить ресурс на обработку контейнером сервлетов/JSP. Обратите внимание, что вместо этого также можно связать в цепочку несколько распознавателей представлений.
Согласование содержимого
ContentNegotiatingViewResolver не распознает представления самостоятельно, а делегирует эту работу другим распознавателям представлений и производит выборку представления, которое похоже на запрошенное клиентом. Представление может быть определено из заголовка Accept или из параметра запроса (например, "/path?format=pdf").
ContentNegotiatingViewResolver выбирает подходящее View для обработки запроса путём сравнения типов данных запроса с типом данных (также известным как Content-Type), поддерживаемым View, связанным с каждым из его ViewResolvers. Первое View в списке, которое имеет совместимый Content-Type, возвращает представление клиенту. Если цепочке ViewResolver не удается предоставить совместимое представление, используется список представлений, заданный в свойстве DefaultViews. Этот последний вариант подходит для одиночных Views, которые могут визуализировать соответствующее представление текущего ресурса независимо от имени логического представления. Заголовок Accept может содержать подстановочные знаки (например, text/*), в этом случае View, чье Content-Type равен text/xml, является совместимым.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ