Главная » Spring » Поиск представлений Spring

0

Последнее, что осталось сделать в ходе обработки запроса, – ото- бразить страницу. Для решения подобных задач используются пред- ставления – обычно JavaServer Pages (JSP), но могут использоваться и другие технологии реализации представлений, такие как Velocity и FreeMarker. Чтобы определить, какое представление должно об- рабатывать данный запрос, DispatcherServlet обращается за помощью к арбитру представлений с целью заменить логическое имя, возвра- щаемое контроллером, ссылкой на фактическое представление, реа- лизующее отображение результатов.

В действительности работа арбитра представлений заключается

в отображении логического имени на некоторую реализацию интер- фейса org.springframework.web.servlet.View. Но пока достаточно пред- ставлять себе арбитр представлений как некоторый механизм ото- бражения имени представления в JSP, что он и делает.

В состав Spring входят несколько реализаций арбитров представ- лений, которые перечислены в табл. 8.1.

Таблица 8.1. Когда дело доходит до отображения информации, фреймворк Spring MVC позволяет выбрать соответствующее представление с помощью одной из следующих реализаций арбитров  представлений

Арбитр представлений

Описание

BeanNameViewResolver

Отыскивает реализацию интерфейса View, объявленную с помощью элемента <bean>

с идентификатором, совпадающим с логиче- ским именем представления

ContentNegotiatingViewResolver

Для определения представления использует один или более других арбитров представле- ний, выбирая нужного арбитра, исходя из типа запрошенного содержимого. (Подробнее об этом арбитре представлений рассказывается в главе 11)

Таблица 8.1 (продолжение)

Арбитр представлений

Описание

FreeMarkerViewResolver

Отыскивает шаблон FreeMaker, путь к которому определяется за счет добавления приставки и окончания к логическому имени представления

InternalResourceViewResolver

Отыскивает шаблон представления, содержа- щийся в WAR-файле веб-приложения. Путь

к шаблону определяется добавлением пристав- ки и окончания к логическому имени представ- ления

JasperReportsViewResolver

Отыскивает шаблон представления, объявлен- ный как отчет Jasper Reports, путь к которому определяется за счет добавления приставки и окончания к логическому имени представления

ResourceBundleViewResolver

Отыскивает реализацию интерфейса View

в файле свойств

TilesViewResolver

Отыскивает представление, которое определе- но как шаблон Tiles, путь к которому определя- ется за счет добавления приставки и окончания к логическому имени представления

UrlBasedViewResolver

Это базовый класс для реализации некоторых других арбитров представлений, таких как InternalResourceViewResolver. Может использо- ваться как самостоятельный арбитр, но он

не обладает такой широтой возможностей, как его подклассы. Например, UrlBasedViewResolver не способен выявлять представления, опираясь на текущие региональные настройки

VelocityLayoutViewResolver

Подкласс класса VelocityViewResolver, который поддерживает компоновку страниц посред- ством VelocityLayoutView (реализация представ- ления, имитирующего VelocityLayoutServlet)

VelocityViewResolver

Арбитр представлений, созданных на основе фреймворка Velocity, где путь шаблона Velocity определяется за счет добавления приставки и окончания к логическому имени представления

XmlViewResolver

Отыскивает реализацию интерфейса View, объявленную с помощью элемента <bean> в XML-файле (/WEB-INF/views.xml). Этот ар- битр представлений близко напоминает

BeanNameViewResolver, за исключением того, что

элемент <bean> представления определяется отдельно от других компонентов контекста приложения Spring

Таблица 8.1 (окончание)

Арбитр представлений

Описание

XsltViewResolver

Отыскивает представления, реализованные на основе XSLT-определения, где путь к таблице стилей XSLT определяется за счет добавления приставки и окончания к логическому имени представления

У нас недостаточно ни времени, ни места, чтобы познакомиться с каждым из этих арбитров представлений. Но некоторые из них стоят того, чтобы взглянуть на них поближе. Начнем с арбитра InternalResolverViewResolver.

Поиск внутренних представлений

Фреймворк Spring MVC во многом следует принципу преиму- щества соглашений перед настройками. Арбитр InternalResourceView- Resolver является одним из таких элементов, ориентированных на соглашения. Он отображает логическое имя представления в объ- ект View, который перекладывает ответственность за отображение страницы на шаблон (обычно JSP), находящийся в контексте веб- приложения. Как показано на рис. 8.3, он выполняет такое ото- бражение, добавляя приставку и окончание к логическому имени представления, в результате получая путь к шаблону, являющемуся ресурсом внутри веб-приложения.

Рис. 8.3. InternalResourceViewResolver определяет путь к шаблону представления, добавляя указанные приставку и окончание к логическому имени представления

Допустим, что все страницы JSP для приложения Spitter нахо- дятся в каталоге /WEB-INF/views/. Учитывая это условие, компонент InternalResourceViewResolver необходимо настроить в файле spitter- servlet.xml, как показано ниже:

<bean  class=

"org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/"/>

<property name="suffix" value=".jsp"/>

</bean>

Когда DispatcherServlet запросит у арбитра InternalResourceView- Resolver представление, он добавит к логическому имени приставку

/WEB-INF/views/ и окончание .jsp. В результате получится путь к стра- нице JSP для отображения вывода. Затем InternalResourceViewResolver передаст этот путь объекту View, который направит запрос странице JSP. То есть, когда HomeController вернет логическое имя представ- ления home, в конечном итоге будет получен путь /WEB-INF/views/ home.jsp.

По умолчанию объект View, созданный арбитром InternalResource- ViewResolver, является экземпляром класса InternalResourceView, ко- торый просто передает запрос странице JSP для отображения. Но, поскольку home.jsp использует некоторые теги JSTL, объект Internal- ResourceView можно заменить объектом JstlView, определив свойство viewClass, как показано ниже:

<bean  class=

"org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"  />

<property name="prefix" value="/WEB-INF/views/"/>

<property name="suffix" value=".jsp"/>

</bean>

Представление JstlView направляет запрос странице JSP, как и InternalResourceView. Но дополнительно устанавливает JSTL-атрибуты запроса, что позволяет пользоваться преимуществом наличия под- держки интернационализации в JSTL.

Мы не будем погружаться в изучение FreeMarkerViewResolver, Jasper- ReportsViewResolver, VelocityViewResolver, VelocityLayoutViewResolver и XsltViewResolver, однако отмечу, что в поисках шаблона представле- ния они, подобно арбитру InternalResourceViewResolver, определяют представления, добавляя приставку и окончание к логическому име- ни представления. Теперь, после знакомства с принципом действия арбитра InternalResourceViewResolver, особенности работы других ар- битров представлений должны выглядеть более естественными.

Арбитр InternalResourceViewResolver, отыскивающий JSP-представ- ления, отлично подходит для использования в простых веб-прило- жениях, отображающих несложные страницы. Но веб-сайты часто реализуют весьма интересные пользовательские интерфейсы, ис- пользуя элементы, общие для разных страниц. Для реализации та- ких веб-сайтов часто используются диспетчеры компоновки, такие как Apache Tiles. Посмотрим, как настроить Spring MVC на исполь- зование представлений, входящих в состав фреймворка Tiles.

Поиск представлений Tiles

Apache Tiles1 – это фреймворк обслуживания шаблонов для со- ставления полных страниц из фрагментов во время выполнения. Первоначально он создавался как часть фреймворка Struts, но теперь фреймворк Tiles используется многими другими веб-фреймворками. Мы будем использовать его совместно с фреймворком Spring MVC, чтобы обеспечить компоновку страниц приложения Spitter.

Чтобы использовать представления из фреймворка Tiles в Spring MVC, сначала нужно зарегистрировать TilesViewResolver как компо- нент приложения Spring в файле spitter-servlet.xml:

<bean  class=

"org.springframework.web.servlet.view.tiles2.TilesViewResolver"/>

Этот скромный элемент <bean> настраивает арбитр представлений, который будет искать представления, являющиеся определениями шаблонов Tiles, имена которых совпадают с логическими именами представлений.

В этом определении отсутствует информация об определениях шаблонов Tiles. Сам по себе арбитр TilesViewResolver ничего не знает о шаблонах Tiles и в попытках отыскать их опирается на компонент TilesConfigurer, хранящий нужную информацию. Поэтому добавим в файл spitter-servlet.xml  определение компонента TilesConfigurer:

<bean  class=

"org.springframework.web.servlet.view.tiles2.TilesConfigurer">

<property name="definitions">

<list>

<value>/WEB-INF/views/**/views.xml</value>

</list>

</property>

</bean>

1   http://tiles.apache.org.

Компонент TilesConfigurer загружает один или более файлов шаб- лонов Tiles и делает их доступными для TilesViewResolver. Нам потре- буется несколько файлов с определениями шаблонов Tiles для при- ложения Spitter. Все файлы будут иметь имя views.xml и храниться в разных подкаталогах в каталоге /WEBINF/views. Поэтому в определе- нии выше свойству definitions присвоено значение /WEB-INF/views/**/ views.xml. Шаблонный символ ** в стиле утилиты Ant указывает, что поиск файлов views.xml должен выполняться по всему дереву ката- логов с корнем в каталоге /WEB-INF/views.

Что касается самих файлов views.xml, мы будем создавать их на протяжении всей главы, начав с файла, определяющего шаблон для главной страницы. В листинге 8.4 представлен файл views.xml, опре- деляющий шаблон главной страницы, а также общий шаблон, кото- рый будет использоваться другими шаблонами.

Листинг 8.4. Определение шаблона Tiles

<!DOCTYPE tiles-definitions PUBLIC

"-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>

<definition name="template"

template="/WEB-INF/views/main_template.jsp">  <!–  Общий  шаблон  –>

<put-attribute  name="top"

value="/WEB-INF/views/tiles/spittleForm.jsp"  />

<put-attribute  name="side"

value="/WEB-INF/views/tiles/signinsignup.jsp"  />

</definition>

<definition name="home" extends="template">   <!– Шаблон главной страницы –>

<put-attribute  name="content"  value="/WEB-INF/views/home.jsp"  />

</definition>

</tiles-definitions>

Определение home наследует определение template и для отобра- жения основного содержимого использует JSP-страницу home.jsp, но для предоставления дополнительной информации опирается на шаблон template.

Именно этот шаблон home будет отыскивать арбитр TilesViewResolver при преобразовании логического имени представления, возвращае- мого методом showHomePage() класса HomeController. Для отображения

результатов с применением шаблона home контроллер DispatcherServlet

будет передавать запросы фреймворку Tiles.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии