Учебники

Spring — MVC Framework

Среда Spring Web MVC предоставляет архитектуру Model-View-Controller (MVC) и готовые компоненты, которые можно использовать для разработки гибких и слабосвязанных веб-приложений. Шаблон MVC приводит к разделению различных аспектов приложения (логика ввода, бизнес-логика и логика пользовательского интерфейса), обеспечивая при этом слабую связь между этими элементами.

  • Модель инкапсулирует данные приложения и в целом они состоят из POJO.

  • Представление отвечает за рендеринг данных модели и, в общем, генерирует вывод HTML, который может интерпретировать браузер клиента.

  • Контроллер отвечает за обработку пользовательских запросов и построение соответствующей модели и передает ее в представление для визуализации.

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

Представление отвечает за рендеринг данных модели и, в общем, генерирует вывод HTML, который может интерпретировать браузер клиента.

Контроллер отвечает за обработку пользовательских запросов и построение соответствующей модели и передает ее в представление для визуализации.

ДиспетчерСервлет

Среда Spring Web Model-View-Controller (MVC) разработана на основе DispatcherServlet, который обрабатывает все HTTP-запросы и ответы. Рабочий процесс обработки запросов Spring Web MVC DispatcherServlet показан на следующей диаграмме:

Весенний ДиспетчерСервлет

Ниже приведена последовательность событий, соответствующая входящему HTTP-запросу в DispatcherServlet.

  • После получения HTTP-запроса DispatcherServlet обращается к HandlerMapping для вызова соответствующего контроллера .

  • Контроллер принимает запрос и вызывает соответствующие методы обслуживания на основе используемого метода GET или POST. Сервисный метод устанавливает данные модели на основе определенной бизнес-логики и возвращает имя представления в DispatcherServlet .

  • DispatcherServlet будет получать помощь от ViewResolver для получения определенного представления для запроса.

  • Как только представление завершено, DispatcherServlet передает данные модели в представление, которое в конечном итоге отображается в браузере.

После получения HTTP-запроса DispatcherServlet обращается к HandlerMapping для вызова соответствующего контроллера .

Контроллер принимает запрос и вызывает соответствующие методы обслуживания на основе используемого метода GET или POST. Сервисный метод устанавливает данные модели на основе определенной бизнес-логики и возвращает имя представления в DispatcherServlet .

DispatcherServlet будет получать помощь от ViewResolver для получения определенного представления для запроса.

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

Все вышеупомянутые компоненты, то есть HandlerMapping, Controller и ViewResolver, являются частями WebApplicationContext w, который является расширением простого ApplicationContext с некоторыми дополнительными функциями, необходимыми для веб-приложений.

Требуемая конфигурация

Вам необходимо сопоставить запросы, которые вы хотите обработать с помощью DispatcherServlet , используя сопоставление URL-адресов в файле web.xml . Ниже приведен пример демонстрации объявления и сопоставления для примера HelloWeb DispatcherServlet:

<web-app id = "WebApp_ID" version = "2.4"
   xmlns = "http://java.sun.com/xml/ns/j2ee" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee 
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
   <display-name>Spring MVC Application</display-name>
   
   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>

</web-app>

Файл web.xml будет храниться в каталоге WebContent / WEB-INF вашего веб-приложения. После инициализации HelloWeb DispatcherServlet платформа попытается загрузить контекст приложения из файла с именем [servlet-name] -servlet.xml, расположенного в каталоге WebContent / WEB-INF приложения. В этом случае наш файл будет HelloWebservlet.xml .

Затем тег <servlet-mapping> указывает, какие URL будут обрабатываться каким DispatcherServlet. Здесь все HTTP-запросы, заканчивающиеся на .jsp, будут обрабатываться HelloWeb DispatcherServlet.

Если вы не хотите использовать имя файла по умолчанию как [servlet-name] -servlet.xml и расположение по умолчанию как WebContent / WEB-INF , вы можете настроить это имя файла и местоположение, добавив прослушиватель сервлета ContextLoaderListener в свой файл web.xml следующим образом —

<web-app...>

   <!-------- DispatcherServlet definition goes here----->
   ....
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
   </context-param>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>
   
</web-app>

Теперь давайте проверим необходимую конфигурацию файла HelloWeb-servlet.xml , который находится в каталоге WebContent / WEB-INF вашего веб-приложения —

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package = "com.tutorialspoint" />

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>

</beans>

Ниже приведены важные моменты, касающиеся файла HelloWeb-servlet.xml.

  • Файл [servlet-name] -servlet.xml будет использоваться для создания определенных bean-компонентов, переопределяя определения любых bean-компонентов, определенных с таким же именем в глобальной области видимости.

  • Тег <context: component-scan …> будет использоваться для активации возможности сканирования аннотаций Spring MVC, которая позволяет использовать аннотации, такие как @Controller, @RequestMapping и т. Д.

  • InternalResourceViewResolver будет иметь правила, определенные для разрешения имен представлений. Согласно определенному выше правилу, логическое представление с именем hello делегируется реализации представления, расположенной в /WEB-INF/jsp/hello.jsp .

Файл [servlet-name] -servlet.xml будет использоваться для создания определенных bean-компонентов, переопределяя определения любых bean-компонентов, определенных с таким же именем в глобальной области видимости.

Тег <context: component-scan …> будет использоваться для активации возможности сканирования аннотаций Spring MVC, которая позволяет использовать аннотации, такие как @Controller, @RequestMapping и т. Д.

InternalResourceViewResolver будет иметь правила, определенные для разрешения имен представлений. Согласно определенному выше правилу, логическое представление с именем hello делегируется реализации представления, расположенной в /WEB-INF/jsp/hello.jsp .

Следующий раздел покажет вам, как создать ваши фактические компоненты, например, Controller, Model и View.

Определение контроллера

DispatcherServlet делегирует запрос контроллерам для выполнения специфической для него функциональности. Аннотация @Controller указывает, что определенный класс выполняет роль контроллера. Аннотация @RequestMapping используется для сопоставления URL либо с целым классом, либо с конкретным методом-обработчиком.

@Controller
@RequestMapping("/hello")
public class HelloController { 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

Аннотация @Controller определяет класс как контроллер Spring MVC. Здесь первое использование @RequestMapping указывает, что все методы обработки на этом контроллере относятся к пути / hello . Следующая аннотация @RequestMapping (method = RequestMethod.GET) используется для объявления метода printHello () в качестве метода службы контроллера по умолчанию для обработки HTTP-запроса GET. Вы можете определить другой метод для обработки любого запроса POST по тому же URL.

Вы можете написать приведенный выше контроллер в другой форме, где вы можете добавить дополнительные атрибуты в @RequestMapping следующим образом:

@Controller
public class HelloController {
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

Атрибут value указывает URL-адрес, с которым сопоставляется метод обработчика, а атрибут метода определяет метод службы для обработки HTTP-запроса GET. О контроллере, определенном выше, следует отметить следующие важные моменты:

  • Вы определите необходимую бизнес-логику внутри метода сервиса. Вы можете вызвать другой метод внутри этого метода согласно требованию.

  • На основе определенной бизнес-логики вы создадите модель в этом методе. Вы можете использовать различные атрибуты модели сеттера, и эти атрибуты будут доступны представлению для представления окончательного результата. В этом примере создается модель с атрибутом «сообщение».

  • Определенный метод службы может возвращать строку, которая содержит имя представления, которое будет использоваться для визуализации модели. Этот пример возвращает «привет» как логическое имя представления.

Вы определите необходимую бизнес-логику внутри метода сервиса. Вы можете вызвать другой метод внутри этого метода согласно требованию.

На основе определенной бизнес-логики вы создадите модель в этом методе. Вы можете использовать различные атрибуты модели сеттера, и эти атрибуты будут доступны представлению для представления окончательного результата. В этом примере создается модель с атрибутом «сообщение».

Определенный метод службы может возвращать строку, которая содержит имя представления, которое будет использоваться для визуализации модели. Этот пример возвращает «привет» как логическое имя представления.

Создание JSP-видов

Spring MVC поддерживает много типов представлений для различных технологий представления. К ним относятся — JSP, HTML, PDF, рабочие листы Excel, XML, шаблоны Velocity, XSLT, JSON, Atom и RSS-каналы, JasperReports и т. Д. Но чаще всего мы используем шаблоны JSP, написанные с использованием JSTL.

Давайте напишем простое приветственное представление в /WEB-INF/hello/hello.jsp —

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>
   
   <body>
      <h2>${message}</h2>
   </body>
</html>

Здесь $ {message} — это атрибут, который мы установили внутри контроллера. Вы можете иметь несколько атрибутов для отображения внутри вашего представления.

Spring Web MVC Framework Примеры

Основываясь на вышеизложенных концепциях, давайте проверим несколько важных примеров, которые помогут вам в создании веб-приложений Spring —

В этом примере объясняется, как написать простое приложение Spring Web Hello World.

В этом примере объясняется, как написать веб-приложение Spring с использованием HTML-форм для отправки данных в контроллер и отображения обработанного результата.

Узнайте, как использовать функциональность перенаправления страниц в Spring MVC Framework.

Узнайте, как получить доступ к статическим страницам вместе с динамическими страницами в Spring MVC Framework.

Узнайте, как обрабатывать исключения в Spring MVC Framework.