Hello, Spring Web MVC

Web MVC — веб фреймворк, основанный на Servlet API и являющийся частью framework. Изначально это был только MVC фреймворк, но в настоящий момент поддерживается все разнообразие web. Web MVC является значимой частью framework и, потому, заслуживает отдельного рассмотрения.

Как не сложно догадаться, Spring Web MVC требует наличие Servlet контейнера для запуска и не может быть (за небольшим исключением) использован в standalone приложении. Дабы не загромождать статью подробностями работы с серверами приложений, я использую встраиваемый сервер .

Подготовка

Как обычно, сгенерируем простое web приложение и добавим в него зависимости:

Из зависимостей понадобятся собственно Spring, Spring Web MVC и всё для тестов.

Сам же jetty будет добавлен в виде maven плагина и запускать приложение будет тоже maven.

Web приложение

Чтобы сделать из набора java классов настоящее web приложение, надо написать пару xml дескрипторов. Первый из них имеет предопределённое имя и расположение. Это файл src/main/java/webapp/WEB-INF/web.xml Именно этот файл ищет сервлет контейнер в вашем приложении и именно из него берётся конфигурация сервлетов.

В моём случае файл состоит из трёх частей — описания приложения, описания сервлета и параметров сервлета. Описание приложения — вещь интуитивно понятная и рассматривать я её не буду. А вот описание сервлета уже интереснее — вы задаёте имя сервлета ( <servlet-name/>), класс сервлета ( <servlet-class/>) и параметры загрузки. Класс сервлета в случае Spring Web MCV предопределён и всегда будет org.springframework.web.servlet.DispatcherServlet. Наконец, в третьей части сервлету назначается url путь, на который он отображается. Связь пути и сервлета осуществляется по имени сервлета.

web.xml необходим сервлет контейнеру, чтобы знать, что загружать. А вот самому Spring нужна собственная конфигурация контекста. И он её будет искать в файле webmvc-servlet.xml, расположенном в том же каталоге, что и web.xml Имя этого файла зависит от имени сервлета — <servlet name>-servlet.xml, что позволяет иметь несколько контекстов Spring

Файл webmvc-servlet.xml представляет собой самую банальную конфигурацию Spring

Наконец, добавим какой-нибудь web метод:

Класс, аннотированный @Controller, является web контроллером (в терминах MVC паттерна). В нашем случае достаточно знать, что методы класса, аннотированного @Controller, можно вызывать с помощью веб запросов. Для этого методы должны быть аннотированы @RequestMapping аннотацией. В моём случае это @GetMapping, что означает, что метод будет вызываться при GET запросе по адресу /hello. Адрес или, точнее говоря, путь, задаётся в параметре аннотации. Наконец, метод будет принимать параметр из GET запроса, по имени name и будет ожидать, что этот параметр будет строковым.

Сам же метод возвращает строку и аннотация @ResponseBody говорит Spring, что возвращаемое значение не надо обрабатывать, а надо вернуть пользователю.

Запуск приложения

Как я уже говорил, мы можем собрать пакет с приложением, но для его исполнения нужен servlet контейнер. Поэтому мы используем jetty для запуска:

Jetty сам увидит web.xml, запустит servlet, тот прочитает конфигурацию и найдёт созданный нам контроллер. Давайте немедленного его опробуем:

Spring Boot

Разумеется, конфигурация на основе xml несколько старомодна и сейчас всё можно сделать в коде. Но зачем что-то делать в коде, если можно этого не делать вообще? Spring boot настраивает Spring Web MVC автоматически и содержит встроенный servlet контейнер.

Для начала сгенерируем Spring boot проект и добавим в него web starter. Если кто-то хочет добавить web starter к существующему проекту, просто добавьте следующую зависимость:

Теперь, чтобы включить поддержку Spring Web MVC, достаточно добавить аннотацию @EnableWebMVC к классу приложения:

Это заменяет все настройки, которые мы делали для обычного servlet контейнера выше. Контроллер я возьму тот же, что и в примере выше, и использую его совершенно без изменений. Приложение можно собрать и запустить как обычный jar файл:

Простая проверка покажет, что приложение на основе Spring Boot работает точно так же:

В дальнейшем, при описании остальных возможностей Spring Web MVC, я буду использовать только Spring Boot для сокращения кода и трудоёмкости. Код примеров доступен на github