Каркас проекта Spring MVC. Использование XML конфигурации

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

В случае Spring MVC можно выделить две категории проектов, в зависимости от архитектуры.

  • Проекты на основе XML конфигурации;
  • Проекты с использованием аннотаций.

Первые используют для определения контроллеров и маршрутизации XML файл DispatcherServlet. Вторые используют для этого аннотации.

В этой статье мы рассмотрим первый тип проектов.

Важно отметить, что подобный подход в построении каркаса проекта на сегодняшний день уже устарел и его полноценно использовать начиная со Spring 5 невозможно. Но, как говорится, никто не застрахован от того, что ему попадётся старый проект на доработку. Поэтому мы всё же посвятим данному типу проектов некоторое время.

Однако, хотелось бы ещё раз подчеркнуть, что материал данной статьи применим только для Spring 4 или некоторых более ранних версий.

Архитектуру Spring MVC рассматривать мы не будем, так как она достаточно подробно описана в документации (в крайнем случае, ей будет посвящена отдельная статья), а сразу перейдём к практике. То есть, данная статься представляет собой своего рода «быстрый старт» для создания нового проекта или понимания работы существующего.

Контроллеры

Функционал контроллеров реализуется специальными классами из пакета org.springframework.web.servlet.mvc. В основном это:

  • ParameterizableViewController.
    Просто выдаёт заданное в
    XML файле конфигурации JSP представление;
  • AbstractController.
    Абстрактный класс, который служит основой для создания контроллеров-действий (поддерживают только одно действие);
  • MultiActionController (находится в пакете org.springframework.web.servlet.mvc.multiaction).
    Абстрактный класс, предоставляющий основу для обычных контроллеров, которые поддерживают несколько действий.

С ParameterizableViewController всё предельно просто. Это уже полностью готовый контроллер и весь необходимый функционал в нём уже реализован. Нужно лишь объявить его как обычный компонент Spring с указанием нужного представления.

AbstractController содержит лишь один метод, который требуется переопределить в классе наследнике — handleRequestInternal. Собственно он и отвечает за реализацию единственного действия контроллера.

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

Ниже приведён пример подобного контроллера.

Контроллеры на основе класса MultiActionController лишены подобных недостатков, и как уже говорилось ранее, поддерживают выполнение нескольких действий. Также для подобных контроллеров не обязательно задавать JSP представления в файле конфигурации. Это можно сделать непосредственно в самом классе.

Ниже представлен пример контроллера на основе MultiActionController.

Обратите внимание на формат имени представления. Оно начинается с папки в которой расположены файлы представлений относящихся к данному контроллеру. После идёт символ «/» и только после него само имя представления.

Размещать представления для таких контроллеров в отдельных папках не обязательно (тогда можно ограничиться просто именем представления), но крайне желательно во избежание путаницы.

В Spring 5 класс MultiActionController отсутствует, а его функционал полностью заменён аннотациями (источник). Поэтому, даже если вы начинаете новый проект на более ранних версиях настоятельно рекомендуется использовать подход основанный на аннотациях.

Что касается старых проектов, то при миграции на Spring 5 соответствующие фрагменты придётся переписать.

Конфигурация

Контроллеры объявляются как обычный Spring компоненты в файле dispatcher-servlet.xml. Маршрутизация определяется в этом же файле при помощи класса SimpleUrlHandlerMapping.

Подробно останавливаться на этом не будем (конфигурационный файл и маршрутизация с использованием SimpleUrlHandlerMapping подробно описаны в документации) просто приведём пример файла dispatcher-servlet.xml для контроллеров, которые мы рассмотрели ранее.

Помимо всего остального данный конфигурационный файл должен в обязательном порядке задавать расположение корневой папки с файлами представлений (p:prefix) и их расширение (p:suffix).

Для этого используется компонент viewResolver. Для данного компонента рекомендуется использовать класс InternalResourceViewResolver, который позволяет задействовать в качестве представлений соответствующие файлы проекта.

Ниже приведён пример файла конфигурации сервера приложений (web.xml) применительно к данному случаю.

Заключение

Мы рассмотрели определение контролеров и маршрутизации в Spring MVC с использованием XML.

Приведённых в статье примеров и комментариев к ним будет вполне достаточно для понимания основ работы подобных проектов и облегчения их создания или доработки.

В завершение приведём два скриншота, которые наглядно проиллюстрируют примерную структуру проекта, построенного в соответствии с рассмотренными принципами.

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

К слову, NetBeans по умолчанию создаёт для Spring MVC проекты именно такого формата, который был рассмотрен в данной статье (пока «из коробки» поддерживается максимум Spring 4). Только оригинальный шаблон NetBeans немного проще того проекта, который послужил примером для данной статьи.

Но, в любом случае всё это уже «вчерашний день». В одной из следующих статей будет обязательно рассмотрен уже современных подход в разработке web приложений на фреймворке Spring MVC с применением аннотаций.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *