0%

SpringMVC概述

  • SpringMVC概述
    • 什么是SpringMVC
    • SpringMVC框架的优点
    • SpringMVC优化的方向
    • SpringMVC执行流程
    • 基于注解的SpringMVC程序

一、SpringMVC概述

1.1 什么是SpringMVC

  • SpringMVC 是基于 MVC 开发模式的框架,用来优化控制器
    • 它是 Spring 家族的一员,它也具备 IOCAOP

1.2 SpringMVC框架的优点

  1. 轻量级,基于 MVC 的框架。
  2. 易于上手,容易理解,功能强大。
  3. 具备 IOCAOP
    • 方便整合 StrutsMyBatisHibernateJPA 等其他框架。
  4. 完全基于注解开发。
    • ControllerServiceDao 中都可以使用注解,方便灵活。
    • 使用 @Controller 创建处理器对象。
    • @Service 创建业务对象。
    • @Autowired 或者 @Resource 在控制器类中注入 Service,在 Service 类中注入 Dao

1.3 SpringMVC优化的方向

  • SpringMVC 主要是优化了下图中的蓝色部分,包括数据提交的优化、携带数据的优化以及返回结果处理的优化。

    ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc优化的方向.png)

1.4 ★★★SpringMVC执行流程

![springmvc执行流程](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc执行流程.png)

  • 执行流程说明:
    1. 向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获。
    2. DispatcherServlet 根据 <servlet-name> 中的配置对请求的 URL 进行解析,得到请求资源标识符(URI)。然后根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象(包括 Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
    3. DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter
    4. 提取 Request 中的模型数据,填充 Handler 入参,开始执行 HandlerController)。在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些额外的工作:
      • HttpMessageConveter:将请求消息(如 Jsonxml 等数据)转换成一个对象,将对象转换为指定的响应信息。
      • 数据转换:对请求消息进行数据转换。如 String 转换成 IntegerDouble 等。
      • 数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
      • 数据验证:验证数据的有效性(长度、格式等),验证结果存储到 BindingResultError 中。
    5. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。
    6. 根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet
    7. ViewResolver 结合 ModelView,来渲染视图。
    8. 视图负责将渲染结果返回给客户端。

1.5 ★基于注解的SpringMVC程序

  • 项目需求:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。

    1. 新建一个空项目 SpringMVC-learning-code ,将项目编码都改为 UTF-8,并对项目的 maven 进行设置。

      ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc-001-demo-0.png)

      ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc-001-demo-00.png)

    2. 新建项目,选择 webapp 模板。

      ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc-001-demo-1.png)

    3. 修改目录,添加缺失的 test,并添加 javaresources (两套)。

      ![](../../../../../Running Noob/计算机/Typora笔记/笔记-git仓库/Java-SSM-notebook/img/SpringMVC/springmvc-001-demo-2.png)

    4. 修改 pom.xml 文件,添加 SpringMVC 的依赖,添加 Servlet 的依赖。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      <?xml version="1.0" encoding="UTF-8"?>

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>

      <groupId>com.f</groupId>
      <artifactId>SpringMVC-001-demo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>

      <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>17</maven.compiler.source>
      <maven.compiler.target>17</maven.compiler.target>
      </properties>

      <dependencies>
      <!--SpringMVC依赖-->
      <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>6.1.2</version>
      </dependency>
      <!--servlet依赖-->
      <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>6.0.0</version>
      <scope>provided</scope>
      </dependency>
      <!--junit依赖-->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
      </dependency>
      </dependencies>

      <build>
      <resources>
      <resource>
      <directory>src/main/java</directory>
      <includes>
      <include>**/*.xml</include>
      <include>**/*.properties</include>
      </includes>
      </resource>
      <resource>
      <directory>src/main/resources</directory>
      <includes>
      <include>**/*.xml</include>
      <include>**/*.properties</include>
      </includes>
      </resource>
      </resources>
      </build>
      </project>
    5. /main/resources 目录下利用 XML 的 Spring 模板添加 springmvc.xml 配置文件:

      • 指定包扫描,添加视图解析器 InternalResourceViewResolver
      • 配置文件名可以任意命名,推荐使用 springmvc.xml
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
      <!--添加包扫描-->
      <context:component-scan base-package="com.f.springmvc.controller"/>
      <!--添加视图解析器-->
      <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <!--配置前缀-->
      <!--配置前缀为/admin/是因为我们最终要跳转的是webapp下admin目录中的页面-->
      <property name="prefix" value="/admin/"/>
      <!--配置后缀-->
      <property name="suffix" value=".jsp"/>
      </bean>
      </beans>
      • SpringMVC 框架为了避免请求资源路径与扩展名的冗余,在视图解析器 InternalResouceViewResolver 中引入了请求的前辍与后辍。在 action 中只需给出要跳转页面的文件名即可,对于具体的文件路径与文件扩展名,视图解析器会自动完成拼接。
    6. 删除 web.xml 文件,新建 web.xml(若版本无问题则不需要删除,删除原生 web.xml 文件的主要目的是为了防止版本过老无法支持框架运行)。

    7. web.xml 文件中注册 SpringMVC 框架(所有的 web 请求都是基于 servlet 的)。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
      version="6.0">
      <!--注册SpringMVC框架-->
      <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <!--告诉DispatcherServlet配置文件springmvc.xml的信息-->
      <init-param>
      <param-name>contextConfigLocation</param-name>
      <!--表示从类路径下加载springmvc.xml的配置文件-->
      <param-value>classpath:springmvc.xml</param-value>
      </init-param>
      </servlet>
      <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <!--指定拦截什么请求,只有后缀为.action的请求才交给DispatcherServlet处理-->
      <url-pattern>*.action</url-pattern>
      </servlet-mapping>
      </web-app>
      • <param-value>classpath:springmvc.xml</param-value>表示从类路径下加载 SpringMVC 的配置文件。

      • 因为 web 的请求都需要由 Servlet 来进行处理的,而 SpringMVC 的核心处理器就是一个 DispatcherServlet,它负责接收客户端的请求,并根据请求的路径分派给对应的 action(控制器)进行处理,处理结束后依然由核心处理器 DispatcherServlet 进行响应返回。

        • DispatcherServlet 要在 web.xml 文件中注册才可用。
      • 注意:SpringMVC 的控制器是普通的 java 类,并不是 Servlet,只有 DispatcherServlet 才是 Servlet

        1
        index.jsp <------> DispatcherServlet核心处理器(Servlet) <------> SpringMVC的控制器(普通的java类)
    8. webapp 目录下新建 admin 目录,在 admin 目录下新建 main.jsp 页面。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <%--main.jsp文件--%>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
      <title>hello</title>
      </head>
      <body>
      <h1>hello,world!</h1>
      </body>
      </html>
    9. 删除 index.jsp 页面,并新建一个 index.jsp 文件,用于发送请求给服务器。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      <%--index.jsp文件--%>
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
      <title>index</title>
      </head>
      <body>
      <a href="${pageContext.request.contextPath}/demo.action">访问服务器</a>
      </body>
      </html>
    10. 开发 HelloAction.java –> 这就是一个控制器(相当于 javaweb 中的 servlet)。

      这是一个普通的类,不用继承和实现接口,类中的每个方法就是一个具体的 action 控制器。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      package com.f.springmvc.controller;

      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;

      /**
      * @author fzy
      * @date 2024/2/4 14:42
      */
      @Controller // 由Spring来创建该类的实例对象
      public class HelloAction {
      /**
      * 作为对比,看看以前的servlet方法规范:
      * protected void doGet(HttpServletRequest request, HttpServletResponse response)
      * throws ServletException, IOException {......}
      */
      /**
      * action中所有功能的实现都是由方法来完成的
      * action中方法的规范
      * 1.修饰符是public
      * 2.方法返回值任意
      * 3.方法的名称任意
      * 4.方法可以没有参数,如果有,可以任意类型
      * 5.要使用@RequestMapping注解,来声明一个访问路径
      */
      @RequestMapping("/demo.action")
      public String hello() {
      System.out.println("访问服务器成功!");
      return "main"; // 这样可以直接跳到 /admin/main.jsp 页面上
      }
      }
    11. 添加 tomcat 进行测试。

---------------The End---------------