Spring MVC — описание интерфейса ViewResolver
Как спринг Spring MVC определяет какое представление необходимо отобразить для определенного запроса? Для этого используется интерфейс ViewResolver.
Диспетчер сервлетов DisptacherServlet Spring’а с помощью ViewResolver определяет какое представление необходимо использовать на основании полученного имени. Возьмем картинку из статьи Spring MVC – основные понятия, архитектура.
Ещё раз краткое описание происходящего из прошлой статьи:
- Вначале диспатчер сервлет (диспетчер) получает запрос, далее он смотрит свои настройки, чтобы понять какой контроллер использовать (на рисунке Handler Mapping).
- После получения имени контроллера запрос передается в него (на рисунке Controller). В контроллере происходит обработка запроса и обратно посылается ModelAndView (модель – сами данные; view (представление) – как эти данные отображать).
- Диспатчер сервлет на основании полученного ModelAndView ищет какое представление ему использовать (View Resolver) и получает в ответе имя представления View
- В представление передаются данные (model) и обратно, если необходимо, посылается ответ от представления.
1. Описание интерфейса ViewResolver
ViewResolver — интерфейс, реализуемый объектами, которые способны находить представления View по имени View Name.
Состояние представления не изменяется во время выполнения приложения и поэтому в реализации возможно применять кэширование.
Реализации могут поддерживать интернационализацию, т.е. локализировать представления.
2. Реализация ViewResolver по умолчанию
По умолчанию реализацией интерфейса ViewResolver является класс InternalResourceViewResolver. Многим из вас может быть знакома следующая запись в настройках dispatcher-servlet.xml:
1 2 3 4 5 6 7 |
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> |
Чтобы легче было понять написанное приведу фрагмент кода из контроллера Spring MVC – Hello World:
1 2 3 4 5 6 7 |
@RequestMapping(value = "/", method = RequestMethod.GET) public ModelAndView main() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("userJSP", new User()); modelAndView.setViewName("index"); return modelAndView; } |
После того как в модель modelAndView было записано имя представления viewName = ‘index’ и произошел выход из метода, то в действие включается ViewResolver. Для этого примера согласно настройкам в dispatcher-servlet.xml класс InternalResourceViewResolver будет искать представление с именем index, у которого префикс /WEB-INF/views/, а суффикс .jsp. Другими словами он должен найти представление с именем /WEB-INF/views/index.jsp.
Если представление найдено, то произойдет переход на эту страницу. В противном случае результат зависит от настроек реализации интерфейса 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
28