Spring MVC — описание интерфейса ViewResolver

Как спринг Spring MVC определяет какое представление необходимо отобразить для определенного запроса? Для этого используется интерфейс ViewResolver.

Диспетчер сервлетов DisptacherSevlet Spring’а с помощью ViewResolver определяет какое представление необходимо использовать на основании полученного имени. Возьмем картинку из статьи Spring MVC – основные понятия, архитектура.

SpringMVC detail

Ещё раз краткое описание происходящего из прошлой статьи:

  • Вначале диспатчер сервлет (диспетчер) получает запрос, далее он смотрит свои настройки, чтобы понять какой контроллер использовать (на рисунке Handler Mapping).
  • После получения имени контроллера запрос передается в него (на рисунке Controller). В контроллере происходит обработка запроса и обратно посылается ModelAndView (модель – сами данные; view (представление) – как эти данные отображать).
  • Диспатчер сервлет на основании полученного ModelAndView ищет какое представление ему использовать (View Resolver) и получает в ответе имя представления View
  • В представление передаются данные (model) и обратно, если необходимо, посылается ответ от представления.

1. Описание интерфейса ViewResolver

ViewResolver — интерфейс, реализуемый объектами, которые способны находить представления View по имени View Name.

Состояние представления не изменяется во время выполнения приложения и поэтому в реализации возможно применять кэширование.

Реализации могут поддерживать интернационализацию, т.е. локализировать представления.

2. Реализация ViewResolver по умолчанию

По умолчанию реализацией интерфейса ViewResolver является класс InternalResourceViewResolver. Многим из вас может быть знакома следующая запись в настройках dispatcher-servlet.xml:

Чтобы легче было понять написанное приведу фрагмент кода из контроллера Spring MVC – Hello World:

После того как в модель modelAndView было записано имя представления viewName = ‘index’ и произошел выход из метода, то в действие включается ViewResolver. Для этого примера согласно настройкам в dispatcher-servlet.xml класс InternalResourceViewResolver будет искать представление с именем index, у которого префикс /WEB-INF/views/, а суффикс .jsp. Другими словами он должен найти представление с именем /WEB-INF/views/index.jsp. 

SpringMVC_JSPHelloWorld structure

Если представление найдено, то произойдет переход на эту страницу. В противном случае результат зависит от настроек реализации интерфейса ViewResolver. По умолчанию возвращается null, но можно возвращать имя или исключение, если вам это необходимо.

3. Особенности расположения представлений в папке WEB-INF

Папка WEB-INF служит хранилищем для файлов, к которым закрыт прямой доступ из адресной строки. Существует специальное понятие внутренних ресурсов, которые не доступны извне. Обратите внимание, что одна из реализаций интерфейса ViewResolver так и называется InternalResourceViewResolver.

Поместив ваши представления в папку WEB-INF/view/*.jsp вы скроете представления и доступ к ним можно будет получить только из контроллера. Немножко больше в примере для JSF (там по умолчанию в папку web-inf нельзя помещать представления) здесь.

Может быть интересно

Spring MVC – основные понятия, архитектура

Spring MVC — WebApplicationContext. Описание интерфейса

Spring MVC – Handler Mapping. Описание интерфейса HandlerMapping

Share Button
15
4124 Total Views 1 Views Today

Добавить комментарий