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
, является совместимым.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ