SpringMVC介绍
MVC模型
MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分:
Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。
View(视图):用于展示模型中的数据的,一般为jsp或html文件。
Controller(控制器):是应用程序中处理用户交互的部分。接受视图提出的请求,将数据交给模型处理,并将处理后的结果交给视图显示。
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的入门案例
使用maven创建web项目,补齐包结构。
引入相关依赖
<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>
在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>
编写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>
编写控制器
@Controller public class MyController1 { // 该方法的访问路径是/c1/hello1 @RequestMapping("/c1/hello1") public void helloMVC(){ System.out.println("hello SpringMVC!"); } }
配置tomcat10启动项目,访问 http://localhost:8080/c1/hello1
实时效果反馈
1. 使用SpringMVC必须要配置的是
A 监听器
B IOC容器
C 前端控制器
D 编码过滤器
答案
1=>C
SpringMVC执行流程
SpringMVC的组件
- DispatcherServlet:前端控制器,接受所有请求,调用其他组件。
- HandlerMapping:处理器映射器,根据配置找到方法的执行链。
- HandlerAdapter:处理器适配器,根据方法类型找到对应的处理器。
- ViewResolver:视图解析器,找到指定视图。
组件的工作流程
- 客户端将请求发送给前端控制器。
- 前端控制器将请求发送给处理器映射器,处理器映射器根据路径找到方法的执行链,返回给前端控制器。
- 前端控制器将方法的执行链发送给处理器适配器,处理器适配器根据方法类型找到对应的处理器。
- 处理器执行方法,将结果返回给前端控制器。
- 前端控制器将结果发送给视图解析器,视图解析器找到视图文件位置。
- 视图渲染数据并将结果显示到客户端。
实时效果反馈
1. 在SpringMVC中,通过组件找到指定视图
A 前端控制器
B 处理器映射器
C 处理器适配器
D 视图解析器
2. 在SpringMVC中,通过组件接受所有请求,调用其他组件
A 前端控制器
B 处理器映射器
C 处理器适配器
D 视图解析器
答案
1=>D 2=>A
SpringMVC封装参数_简单数据类型
在Servlet中我们通过request.getParameter(name)
获取请求参数。该方式存在两个问题:
- 请求参数较多时会出现代码冗余。
- 与容器紧耦合。
而SpringMVC支持参数注入的方式用于获取请求数据,即将请求参数直接封装到方法的参数当中。用法如下:
编写控制器方法
// 封装为简单数据类型类型参数@RequestMapping("/c1/param1")public void simpleParam(String username,int age){System.out.println(username);System.out.println(age);}访问该方法时,请求参数名和方法参数名相同,即可完成自动封装。
实时效果反馈
1. 在SpringMVC中,接受简单类型参数时,请求参数名和相同即可自动封装
A 类名
B 属性名
C 方法名
D 方法参数名
答案
1=>D
SpringMVC封装参数_简单对象
SpringMVC支持将参数直接封装为对象,写法如下:
编写实体类
public class Student { private int id; private String name; private String sex; // 省略getter/setter/tostring }
编写控制器方法
// 封装为简单对象类型参数 @RequestMapping("/c1/param2") public void objParam(Student student){ System.out.println(student); }
访问该方法时,请求参数名和对象参数的属性名相同,即可完成自动封装。
SpringMVC封装参数_关联对象
SpringMVC还可以将请求参数封装为关联对象,即对象的属性也是一个对象。写法如下:
编写实体类
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 }
编写控制器方法
// 获取关联对象类型参数 @RequestMapping("/c1/param3") public void objParam2(Student student){ System.out.println(student); }
访问该方法时,请求参数名和方法参数的属性名相同,即可完成自动封装。
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集合
SpringMVC支持将请求参数封装为List或Map集合,写法如下:
封装为简单数据类型集合
编写控制器方法(封装为简单数据类型集合的话,参数前必须添加@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]); }
请求的参数写法
封装为对象类型集合
SpringMVC不支持将请求参数封装为对象类型的List集合,但可以封装到有List属性的对象中。
编写实体类
public class AddressList { private List<Address> address; // 地址集合 // 省略getter/setter/tostring }
编写控制器方法
// 对象中包含集合属性 @RequestMapping("/c1/param6") public void listParam3(AddressList addressList){ System.out.println(addressList); }
请求的参数写法