Начать работу со SpringMVC так просто

Java Spring Java EE

Что такое SpringMVC?

SpringMVC является членом семейства Spring Spring — это фреймворк, который сочетает в себе популярные компоненты в разработке! он используется вРазработка уровня представления на основе MVC, аналогичная структуре struts2.

这里写图片描述

Зачем использовать SpringMVC?

Мы уже изучили Struts2, фреймворк на основе MVC... Потом мы изучили Struts2, зачем нам изучать SpringMVC? ? ?

Давайте посмотрим на недостатки Struts2:

  • Есть лазейки [подробности можно перейти в поиск]
  • Работает медленнее [медленнее, чем SpringMVC]
  • Существует много содержимого конфигурации [необходимо использовать файл Struts.xml]
  • сравнительный тяжеловес

По этим причинам и сейчас SpringMVC в индустрии постепенно вытеснил Struts2... Итак, мыС одной стороны, изучение SpringMVC позволяет нам идти в ногу с тенденциями отрасли, а с другой стороны, SpringMVC действительно прост в использовании.!

Вы могли бы выразить это так,Что может Struts2, SpringMVC тоже может....

Обзор разработки Struts2

В Struts2 наши функции разработки выглядят следующим образом:

  • Класс Action наследует класс ActionSupport [если вы хотите использовать дополнительные функции, предоставляемые Struts2, вы должны его наследовать]
  • Бизнес-метод Action всегда возвращает строку, а затем Struts2 переходит к соответствующему представлению через наш рукописный файл конфигурации Struts.xml.
  • Класс Action является многоэкземплярным. Переменные экземпляра необходимо использовать для запоминания параметров, переданных из Интернета. Обычно мы пишем методы set и get.

Рабочий процесс Struts2

这里写图片描述

  • Struts2 получил запрос запроса
  • Направьте запрос в наш фильтр-дозатор для фильтрации
  • Прочитайте файл конфигурации, соответствующий Struts2.
  • Создайте соответствующее действие после перехватчика по умолчанию [несколько случаев]
  • После выполнения бизнес-метода вернуться к объекту ответа

Быстрый старт SpringMVC

Импорт пакета разработки

Первые 6 — это основные функциональные пакеты Spring [IOC], 7-й — это веб-пакет, а 8-й — это пакет SpringMVC.

  • org.springframework.context-3.0.5.RELEASE.jar
  • org.springframework.expression-3.0.5.RELEASE.jar
  • org.springframework.core-3.0.5.RELEASE.jar
  • org.springframework.beans-3.0.5.RELEASE.jar
  • org.springframework.asm-3.0.5.RELEASE.jar
  • commons-logging.jar
  • org.springframework.web-3.0.5.RELEASE.jar
  • org.springframework.web.servlet-3.0.5.RELEASE.jar

Написать действие

Действие реализует интерфейс контроллера


public class HelloAction implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        return null;
    }
    
}

Мы толькоПросто реализуйте метод handleRequest, метод уже сказал, что нам доступны объекты запроса и ответа. Это объекты запроса и ответа, с которыми мы хорошо знакомы. Однако этот метод возвращает такой объект, как ModelAndView, который отличается от Struts2. Struts2 возвращает строку, а SpringMVC возвращает ModelAndView.

ModelAndView на самом деле онПросто инкапсулируйте наш путь просмотра и данные [куда мы хотим перейти, какие данные хранить в поле запроса и установить свойства этого объекта].


public class HelloAction implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {


        ModelAndView modelAndView = new ModelAndView();

        //跳转到hello.jsp页面。
        modelAndView.setViewName("/hello.jsp");
        return modelAndView;
    }
}

Зарегистрируйте основной контроллер

В Struts2 мы хотим использовать функции Struts2, тогда нам нужно настроить фильтр в файле web.xml. И если мы используем SpringMVC, мы настраиваем основной контроллер в web.xml


<!-- 注册springmvc框架核心控制器 -->
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--到类目录下寻找我们的配置文件-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:hello.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <!--映射的路径为.action-->
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>

Создать контроллер SpringMVC

Создаем контроллер SpringMVC в конфигурационном файле hello.xml

    <!--
        注册控制器
        name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
    -->
    <bean class="HelloAction" name="/hello.action"></bean>

доступ

когда мы посещаем в браузереhttp://localhost:8080/hello.actionКогда Spring прочитает наш путь доступа, а затем сравнит, есть ли какая-либо конфигурация в нашем конфигурационном файле/hello.action,Если есть. Затем он передается соответствующему классу Action для обработки. Бизнес-метод класса Action выводит свой запрос на страницу hello.jsp.

这里写图片描述


Рабочий процесс SpringMVC

这里写图片描述

  • Пользователь отправляет запрос
  • Запрос обрабатывается основным контроллером
  • Основной контроллер находит маппер, а маппер видит, каков путь запроса.
  • Основной контроллер снова находит адаптер, чтобы увидеть, какие классы реализуют интерфейс контроллера или соответствующий объект компонента.
  • Конвертировать, форматировать и т.д. привезенные данные
  • Найдите действие нашего контроллера и верните объект ModelAndView после обработки дела.
  • Наконец, ModelAndView анализируется парсером представлений.
  • Перейти на соответствующую страницу JSP/html

В приведенном выше рабочем процессеМы не говорили о мапперах, адаптерах, преобразователях представлений и т. д. Но среда SpringMVC по-прежнему создается нами.

Теперь позвольте мне представить их одну за другой тому, для чего они полезны!

картограф

Настраиваем положения в web.xmlПока запрос имеет суффикс .action, он будет проходить через основной сервлет SpringMVC..

Когда мы получаем запрос, мы обнаруживаем, что это hello.action, который будет проходить через наш основной сервлет, а затемОсновной сервлет узнает, существует ли специальный класс Action для обработки запроса hello.action..

Это:Mapper используется для обработки того, «какой запрос отправляется в действие»..[Опущено по умолчанию].....

На самом деле мы уже настроили пример в быстром старте:Атрибут name указывает, что hello.action обрабатывается в контроллере HelloAction.!


    <!--
        注册控制器
        name属性的值表示的是请求的路径【也就是说,当用户请求到/helloAction时,就交由HelloAction类进行处理】
    -->
    <bean class="HelloAction" name="/hello.action"></bean>

Значение по умолчанию для картографа следующее:


  <!-- 注册映射器(handler包)(框架)【可省略】 -->
	  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
 	  </bean>

Конечно, когда мы создаем контроллер выше [то есть HelloAction], мы можем указать путь без использования атрибута имени, и мы можем использовать наш маппер для его настройки. Например, следующий код:

    <bean class="HelloAction" id="helloAction"></bean>

    <!-- 注册映射器(handler包)(框架) -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.action">helloAction</prop>
            </props>
        </property>
    </bean>

Когда нам нужно, чтобы контроллер helloAction обрабатывал несколько путей запросов, нам просто нужно добавить тег prop!


    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.action">helloAction</prop>
                <prop key="/bye.action">helloAction</prop>
            </props>
        </property>
    </bean>

这里写图片描述


адаптер

Когда наш преобразователь найдет соответствующее действие для обработки запроса, основной контроллерПусть адаптер узнает, реализует ли класс интерфейс Controller..[Опущено по умолчанию]

Это:Адаптер должен найти класс, реализующий интерфейс контроллера.


    <!-- 适配器【可省略】 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>

вид распознавателя

После того, как мы инкапсулируем результат в ModelAndView, SpringMVC будет использовать преобразователь представления для анализа ModelAndView.[Опущено по умолчанию]

Также есть ситуация, которую нельзя опускать.В примере быстрого старта мы инкапсулируем результат в ModelAndView, используя абсолютный реальный путь! Если мы используем логический путь, мы должны его настроить, иначе SpringMVC не сможет найти соответствующий путь.

Так что же такое логический путь? ? ?В Struts2 мы возвращаем строку типа «success», чтобы перейти на страницу, например, success.jsp. Мы можем назвать «успехом» логический путь.

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


    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {


        ModelAndView modelAndView = new ModelAndView();

        //跳转到hello.jsp页面。
        modelAndView.setViewName("hello");
        return modelAndView;
    }

Если вы не используете преобразователь представления, страница не будет найдена:

这里写图片描述

Итак, нам нужно настроить преобразователь представления



    <!--
    如果Action中书写的是视图逻辑名称,那么视图解析器就必须配置
    如果Action中书写的是视图真实名称,那么视图解析器就可选配置
-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 路径前缀 -->
        <property name="prefix" value="/"/>
        <!-- 路径后缀 -->
        <property name="suffix" value=".jsp"/>
        <!-- 前缀+视图逻辑名+后缀=真实路径 -->
    </bean>

контроллер

ParameterizableViewController

Когда мы раньше использовали Struts2,Если вы просто хотите перейти на страницу WEB-INF/JSP, вам также необходимо написать бизнес-метод. А бизнес-метод просто возвращает простую строку.

Следующий код:



public String home(){

	return "home";
}

    <package name="nsfw-home" namespace="/nsfw" extends="struts-default">

        <action name="nsfw_*" class="zhongfucheng.nsfw.HomeAction" method="{1}">
            <result name="{1}">/WEB-INF/jsp/nsfw/{1}.jsp</result>
        </action>
    </package>

В SpringMVC, если мы просто перейдем к представлению, мы можем опустить Action и бизнес-метод.Сконфигурированное действие должно наследовать только класс ParameterizableViewController.!


    <!-- 专用于jsp到jsp/html的转发控制器 -->
    <bean name="/ok.action" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
    	<!-- 转发到真实视图名 -->
    	<property name="viewName" value="/WEB-INF/ok.jsp"/>
    </bean>

这里写图片描述

  • 26 сентября 2017 г. 15:57:45Теперь кажется, что лучше написать в методе. Думаю было бы удобнее управлять единым способом

AbstractCommandController

До сих пор мы не объяснили, как SpringMVC получает параметры, переданные из веб-стороны.

В Struts2, пока мы пишем соответствующие переменные-члены в классе Action, даем соответствующие методы set и get. Затем Struts2 поможет нам инкапсулировать параметры в соответствующие переменные-члены, что очень удобно.

Так как же нам получить параметры в SpringMVC? ? ? ? МыНаследуйте Action от класса, такого как AbstractCommandController.


public class HelloAction extends AbstractCommandController {
    
    @Override
    protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {
           
        return null;
    } 
}

Прежде чем объяснять контроллер, сначала нам нужно понять разницу между контроллером SpringMVC и Struts2:Контроллер SpringMVC — одноэлементный, а контроллер Struts2 — множественный.!

Это:Struts2 собирает переменные, определяя переменные-члены для получения, а SpringMVC как синглтон, невозможно использовать переменные-члены для получения [поскольку будет доступ нескольких пользователей, будет иррациональность данных]!

Затем SpringMVC как синглтон,Он может получить соответствующие параметры только через параметры метода!Только методы могут гарантировать, что разные пользователи соответствуют разным данным.!

организация

Атрибуты объекта должны соответствовать имени, представленному именем на веб-странице. Это то же самое, что и Struts2!


public class User {

    private String id;
    private String username;

    public User() {
    }

    public User(String id, String username) {
        this.id = id;
        this.username = username;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", username='" + username + '\'' +
                '}';
    }
}

Отправить параметр JSP


<form action="${pageContext.request.contextPath}/hello.action" method="post">
    <table align="center">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>编号</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>

</form>

Настройка действия для обработки запросов


    <bean class="HelloAction" id="helloAction"></bean>


    <!-- 注册映射器(handler包)(框架) -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.action">helloAction</prop>
            </props>
        </property>
    </bean>

Действие получает параметры


public class HelloAction extends AbstractCommandController {

    /*设置无参构造器,里边调用setCommandClass方法,传入要封装的对象*/
    public HelloAction() {
        this.setCommandClass(User.class);
    }

    /**
     *
     * @param httpServletRequest
     * @param httpServletResponse
     * @param o  这里的对象就表示已经封装好的了User对象了。!
     * @param e
     * @return
     * @throws Exception
     */
    @Override
    protected ModelAndView handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, BindException e) throws Exception {

        User user = (User) o;

        System.out.println(user);

        ModelAndView modelAndView = new ModelAndView();
        //跳转到ok.jsp
        modelAndView.setViewName("/WEB-INF/ok.jsp");
        //将数据封装到ModelAndView中
        modelAndView.addObject("USER", user);
        return modelAndView;
    }
}

Эффект:

这里写图片描述

краткое содержание

这里写图片描述

这里写图片描述

Разница между сохраненным значением Struts2 и SpringMVC:

这里写图片描述

  • Рабочий процесс SpringMVC:
    • Пользователь отправляет HTTP-запрос, и основной контроллер SpringMVC получает запрос.
    • Найдите преобразователь, чтобы узнать, обрабатывается ли запрос соответствующим классом действий.
    • Найдите адаптер, чтобы увидеть, есть ли класс Action
    • Класс Action обрабатывает результаты и инкапсулирует их в ModelAndView.
    • Проанализируйте данные с помощью синтаксического анализатора представления и перейдите на соответствующую страницу JSP.
  • Контроллер представляет два типа:
    • ParameterizableViewController
      • Возможность перехода к ресурсам под WEB-INF без написания методов обработки
    • AbstractCommandController
      • Может реализовать инкапсуляцию данных параметров

Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом.Учащиеся, которые привыкли читать технические статьи в WeChat и хотят получить больше ресурсов по Java, могут подписаться на общедоступную учетную запись WeChat: Java3y.