От SpringBoot к SpringMVC

Spring Boot Java Spring MVC
V A I O

Обзор

После долгого использования SpringBoot и отравления удобством его соглашения по настройке, я хочу вернуться в эпоху SpringMVC, чтобы посмотреть, как пользователи участвуют в модели разработки SpringMVC. В этой статье мы рассмотрим процесс разработки в эпоху SpringMVC.


Шаблон архитектуры SpringMVC

Поток обработки запросов SpringMVC

Типичный процесс запроса SpringMVC показан на рисунке, который подробно разделен на 12 шагов:

  1. Пользователь инициирует запрос, который обрабатывается интерфейсным контроллером DispatcherServlet.
  2. Фронт-контроллер находит обработчик через процессорный маппер, который можно найти по XML или аннотациям
  3. Преобразователь процессора возвращает цепочку выполнения
  4. Фронт-контроллер запрашивает адаптер обработчика для выполнения обработчика.
  5. адаптер обработчика для выполнения обработчика
  6. После завершения обработки дела адаптеру процессора будет возвращен объект ModeAndView, который содержит имя представления и данные модели.
  7. Адаптер обработчика возвращает имя представления и данные модели во фронт-контроллер.
  8. Фронт-контроллер анализирует представление через преобразователь представления.
  9. Преобразователь представления возвращает реальное представление на фронт-контроллер.
  10. Фронт-контроллер визуализирует с возвращенным представлением и данными
  11. Возвращает визуализированный вид
  12. Возвращает окончательный вид пользователю, производя ответ

Весь процесс ясен и понятен, и ниже мы объединим реальные эксперименты, чтобы понять весь процесс.


Создание проекта SpringMVC

Экспериментальная среда выглядит следующим образом:

  • IntelliJ IDEA 2018.1 (Ultimate Edition)
  • SpringMVC 4.3.9.RELEASE
  • Maven 3.3.9

Здесь я использую IDEA для создания проекта SpringMVC на основе Maven. Процесс сборки не будет повторяться. Нажмите и перейдите к следующему шагу. Окончательная созданная структура проекта выглядит следующим образом:

Проект SpringMVC на основе Maven

Добавить конфигурацию фронт-контроллера

Если используется SpringMVC, все запросы должны управляться SpringMVC, то есть все подходящие запросы должны перехватываться собственным сервлетом SpringMVC.

Для этого нам нужноweb.xmlДобавьте передний контроллер DispatcherServlet SpringMVC в:

    <!--springmvc前端控制器-->
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc-dispatcher.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

Эта конфигурация указывает, что все URL-адреса, соответствующие .action, передаются сервлету mvc-dispatcher для обработки.


Написание XML-файлов конфигурации ядра SpringMVC

Как видно из конфигурации на предыдущем шаге, определенный нами сервлет mvc-dispatcher зависит от файла конфигурации.mvc-dispatcher.xml, на этом шаге нам нужно добавить три аспекта конфигурации

  • 0x01 Добавить сопоставитель процессора
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

В SpringMVC существует много видов обработчиков сопоставления.Используемый здесь BeanNameUrlHandlerMapping имеет правило сопоставления, согласно которому имя компонента обрабатывается как URL-адрес.

  • 0x02 Добавить адаптер процессора
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

В SpringMVC также есть много видов адаптеров-обработчиков.Используемый здесь SimpleControllerHandlerAdapter является классом-адаптером класса реализации контроллера, и его суть заключается в выполнении метода handleRequest в контроллере.

  • 0x03 Добавить парсер попыток
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" />

После того как здесь настроен преобразователь представления InternalResourceViewResolver, он загрузит соответствующий интерфейс и привяжет данные в соответствии с конкретным расположением представления в ModelAndView, возвращаемом после выполнения метода контроллера.


контроллер записи

Моделирование здесь представляет собой службу, которая печатает список учащихся.Написанный нами контроллер должен отображать запрошенные данные списка учащихся на указанной странице JSP через ModelAndView.

public class TestController implements Controller {

    private StudentService studentService = new StudentService();

    @Override
    public ModelAndView handleRequest( HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        List<Student> studentList = studentService.queryStudents();
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("studentList",studentList);
        modelAndView.setViewName("/WEB-INF/views/studentList.jsp");
        return modelAndView;
    }
}

class StudentService {
    public List<Student> queryStudents() {
        List<Student> studentList = new ArrayList<Student>();

        Student hansonwang = new Student();
        hansonwang.setName("hansonwang99");
        hansonwang.setID("123456");

        Student codesheep = new Student();
        codesheep.setName("codesheep");
        codesheep.setID("654321");

        studentList.add(hansonwang);
        studentList.add(codesheep);

        return studentList;
    }
}

записать файл представления

Файл представления здесь представляет собой файл jsp с путем:/WEB-INF/views/studentList.jsp

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<html>
<head>
    <title>学生名单</title>
</head>
<body>
    <h3>学生列表</h3>
    <table width="300px;" border=1>
        <tr>
            <td>姓名</td>
            <td>学号</td>
        </tr>
        <c:forEach items="${studentList}" var="student" >
            <tr>
                <td>${student.name}</td>
                <td>${student.ID}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

Объединив этот шаг и предыдущий шаг, представление и контроллер были написаны. Поскольку преобразователь обработчика, который мы настроили ранее, называется BeanNameUrlHandlerMapping, нам также необходимо настроить сопоставление URL-адресов в файле mvc-dispatcher.xml. Компонент контроллера для обработчик сопоставления BeanNameUrlHandlerMapping для поиска:

<bean name="/test.action" class="cn.codesheep.controller.TestController" />

Экспериментальный тест

Запустите сервер Tomcat и введите в браузере:

http://localhost:8080/test.action
Результаты экспериментов

Отрисовка данных в порядке.

Примечания: Конечно, все методы настройки, используемые в этой статье, являются неаннотированными методами настройки, то есть их необходимо настраивать в XML и следовать различным принципам реализации. Более общие и распространенные методы настройки на основе аннотаций будут подробно описаны в последующих статьях.


постскриптум

Другие практические статьи автора SpringBt находятся здесь:


Если вам интересно, вы также можете уделить время прочтению некоторых статей автора о контейнеризации и микросервисах:


CodeSheep