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
, є сумісним.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ