SpringMVC(详细版从入门到精通)未完

发布于:2025-08-15 ⋅ 阅读:(19) ⋅ 点赞:(0)

SpringMVC介绍

image-20211221143600426

MVC模型

MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:

  • Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。

  • View(视图):用于展示模型中的数据的,一般为jsp或html文件。

  • Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。

    image-20211214152348721

SpringMVC

SpringMVC是一个基于MVC模式的轻量级Web框架,是Spring框架的一个模块,和Spring可以直接整合使用,我们使用的版本是Spring6,所以JDK需要17以上。SpringMVC代替了Servlet技术,它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。

实时效果反馈

1. 在MVC模型中,Controller指的是

A 数据模型

B 展示数据的视图

C 应用程序中处理用户交互的部分

D 以上说法都不对

2. SpringMVC框架可以让一个简单JAVA类成为

A 控制器

B 视图

C 模型

D 以上均可以

答案

1=>C 2=>A

SpringMVC入门案例

接下来我们编写一个SpringMVC的入门案例

  1. 使用maven创建web项目,补齐包结构。

  2. 引入相关依赖

    <dependencies>
      <!-- Spring核心依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>6.0.11</version>
      </dependency>
      <!-- SpringMVC -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>6.0.11</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>6.0.11</version>
      </dependency>
      <!-- Servlet -->
      <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
      </dependency>
      <!-- JSP -->
      <dependency>
        <groupId>jakarta.servlet.jsp</groupId>
        <artifactId>jakarta.servlet.jsp-api</artifactId>
        <version>3.0.0</version>
        <scope>provided</scope>
      </dependency>
    </dependencies>
    
  3. 在web.xml中配置前端控制器DispatcherServlet。

    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!--SpringMVC前端控制器,本质是一个Servlet,接收所有请求,在容器启动时就会加载-->
      <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:springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    </web-app>
    
  4. 编写SpringMVC核心配置文件springmvc.xml,该文件和Spring配置文件写法一样。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        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.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    
    
      <!-- 扫描包 -->
      <context:component-scan base-package="com.itbaizhan"/>
    
    
      <!-- 开启SpringMVC注解的支持 -->
      <mvc:annotation-driven/>
    
    
    </beans>
    
  5. 编写控制器

    @Controller
    public class MyController1 {
      // 该方法的访问路径是/c1/hello1
      @RequestMapping("/c1/hello1")
      public void helloMVC(){
        System.out.println("hello SpringMVC!");
       }
    }
    
  6. 配置tomcat10启动项目,访问 http://localhost:8080/c1/hello1

实时效果反馈

1. 使用SpringMVC必须要配置的是

A 监听器

B IOC容器

C 前端控制器

D 编码过滤器

答案

1=>C

SpringMVC执行流程

image-20211222093922306

SpringMVC的组件

  • DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
  • HandlerMapping:处理器映射器,根据配置找到方法的执行链。
  • HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
  • ViewResolver:视图解析器,找到指定视图。

组件的工作流程

  1. 客户端将请求发送给前端控制器。
  2. 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。
  3. 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器。
  4. 处理器执行方法,将结果返回给前端控制器。
  5. 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。
  6. 视图渲染数据并将结果显示到客户端。

实时效果反馈

1. 在SpringMVC中,通过组件找到指定视图

A 前端控制器

B 处理器映射器

C 处理器适配器

D 视图解析器

2. 在SpringMVC中,通过组件接受所有请求,调用其他组件

A 前端控制器

B 处理器映射器

C 处理器适配器

D 视图解析器

答案

1=>D 2=>A

SpringMVC封装参数_简单数据类型

image-20211221144403791

在Servlet中我们通过request.getParameter(name)获取请求参数。该方式存在两个问题:

  • 请求参数较多时会出现代码冗余。
  • 与容器紧耦合。

而SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。用法如下:

  1. 编写控制器方法

    // 封装为简单数据类型类型参数
    @RequestMapping("/c1/param1")
    public void simpleParam(String username,int age){
    System.out.println(username);
    System.out.println(age);
    }
  2. 访问该方法时,请求参数名和方法参数名相同,即可完成自动封装。

    http://localhost:8080/c1/param1?username=bz&age=10

实时效果反馈

1. 在SpringMVC中,接受简单类型参数时,请求参数名和相同即可自动封装

A 类名

B 属性名

C 方法名

D 方法参数名

答案

1=>D

SpringMVC封装参数_简单对象

image-20211221144613779

SpringMVC支持将参数直接封装为对象,写法如下:

  1. 编写实体类

    public class Student {
      private int id;
      private String name;
      private String sex;
      // 省略getter/setter/tostring
    }
    

  2. 编写控制器方法

    // 封装为简单对象类型参数
    @RequestMapping("/c1/param2")
    public void objParam(Student student){
      System.out.println(student);
    }
    

  3. 访问该方法时,请求参数名和对象参数的属性名相同,即可完成自动封装。

    http://localhost:8080/c1/param2?id=1&name=bz&sex=female

SpringMVC封装参数_关联对象

SpringMVC还可以将请求参数封装为关联对象,即对象的属性也是一个对象。写法如下:

  1. 编写实体类

    public class Student {
      private int id;
      private String name;
      private String sex;
      private Address address; // 地址对象
      // 省略getter/setter/tostring
    }
    
    
    public class Address {
      private String info; //地址信息
      private String postcode; //邮编
      // 省略getter/setter/tostring
    }
    

  2. 编写控制器方法

    // 获取关联对象类型参数
    @RequestMapping("/c1/param3")
    public void objParam2(Student student){  
      System.out.println(student);
    }
    
  3. 访问该方法时,请求参数名和方法参数的属性名相同,即可完成自动封装。

    http://localhost:8080/c1/param3?id=1&name=bz&sex=female&address.info=beijing&address.postcode=030000

    我们也可以使用表单发送带有参数的请求:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
     <head>
       <title>表单提交</title>
     </head>
     <body>
       <form action="/c1/param3" method="post">
         id:<input name="id">
         姓名:<input name="name">
         性别:<input name="sex">
         住址:<input name="address.info">
         邮编:<input name="address.postcode">
         <input type="submit">
       </form>
     </body>
    </html>
    

实时效果反馈

1. 在SpringMVC中,接受对象类型参数时,请求参数名和相同即可自动封装

A 方法参数名

B 方法对象参数的属性名

C 方法名

D 类名

答案

1=>B

SpringMVC封装参数_List集合

image-20211221144931683

SpringMVC支持将请求参数封装为List或Map集合,写法如下:

封装为简单数据类型集合

  1. 编写控制器方法(封装为简单数据类型集合的话,参数前必须添加@RequestParam注解)

    // 封装为简单数据类型集合,参数前必须添加@RequestParam注解
    @RequestMapping("/c1/param4")
    public void listParam(@RequestParam List<String> users){ 
      System.out.println(users);
    }
    

    该方式也可以封装为简单数据类型数组:

    @RequestMapping("/c1/param5")
    public void listParam2(@RequestParam String[] users){ 
      System.out.println(users[0]); 
      System.out.println(users[1]);
    }
    

  2. 请求的参数写法

    http://localhost:8080/c1/param4?users=bj&users=sxt

封装为对象类型集合

SpringMVC不支持将请求参数封装为对象类型的List集合,但可以封装到有List属性的对象中。

  1. 编写实体类

    public class AddressList {
      private List<Address> address; // 地址集合
      // 省略getter/setter/tostring
    }
    
  2. 编写控制器方法

    // 对象中包含集合属性
    @RequestMapping("/c1/param6")
    public void listParam3(AddressList addressList){
      System.out.println(addressList);
    }
    
  3. 请求的参数写法