Spring mvc
Spring mvc复习

0.spring-springmvc
Spring 和 Spring MVC 是两个相关但独立的框架,它们解决了不同的问题。简单来说,Spring 是一个通用的应用框架,而 Spring MVC 是一个基于 Spring 的 Web 框架,用于构建 Web 应用程序。
Spring 的主要作用:
- 依赖注入(Dependency Injection, DI):Spring 最主要的功能是依赖注入,它通过控制反转(Inversion of Control, IoC)容器来管理对象之间的依赖关系,使代码更加模块化和可测试。
- 面向切面编程(Aspect-Oriented Programming, AOP):Spring 支持 AOP,允许在不修改原始代码的情况下添加额外的行为,例如日志记录、事务管理和安全检查。
- 数据访问集成:Spring 提供对多种数据访问技术(如 JDBC、JPA、Hibernate)的集成和支持,简化了与数据库的交互。
- 事务管理:Spring 提供了声明性事务管理,可以让开发者更轻松地管理事务。
- 其他支持:如邮件发送、消息队列集成、缓存等。
Spring MVC 的主要作用:
- 专门用于 Web 开发:Spring MVC 是 Spring 框架中用于构建 Web 应用的部分,它遵循 Model-View-Controller (MVC) 设计模式,帮助开发者更容易地构建基于 HTTP 协议的 Web 应用程序。
- 请求处理流程:Spring MVC 提供了一整套用于处理 HTTP 请求和响应的机制,例如
DispatcherServlet作为前端控制器,将请求分发给适当的处理器(Controller)。- 视图解析:Spring MVC 提供视图解析机制,将模型数据绑定到视图(例如 JSP、Thymeleaf、Freemarker 等)。
- 数据绑定与验证:提供了数据绑定功能,将请求参数绑定到 Java 对象,还支持数据验证和格式化。
- 国际化(I18n)支持:Spring MVC 提供了内置的国际化支持,方便开发多语言 Web 应用程序。
- 集成与扩展:与 Spring 生态系统中的其他模块(如 Spring Security、Spring Data 等)无缝集成。
Spring 和 Spring MVC 的关系
Spring MVC 是 Spring 框架中的一个模块,它依赖于 Spring 核心容器(Core Container)来工作。它利用了 Spring 的 IoC 和 AOP 功能来管理 Web 应用程序的组件(如控制器、服务、数据访问层等)。因此,Spring MVC 本质上是一个基于 Spring 的 Web 框架。
1.入门
Spirngmvc-Servlet
Controller->Springmvc 产物
1.SpringMVC是一种表现层框架技术–
SpringMVC用于进行表现层功能开发
使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
创建Springfmvc控制器类


springmvc0需要设定springmcv加载对应Bean
1.1 Springmvc配置
ServletContainersInitConfig 类扩展了 AbstractDispatcherServletInitializer,这个类是 Spring MVC 提供的一个抽象类,用于快速初始化基于 Servlet 3.0 的 Web 容器(如 Tomcat)。它通过实现三个方法来配置 Spring 和 Spring MVC 的应用上下文以及 Servlet 的映射。
1 | |
作用:
- 创建和配置 Spring MVC 的应用上下文(
WebApplicationContext)
WebApplicationContext是 Spring 中用于 Web 应用程序的应用上下文,它扩展了ApplicationContext,提供了面向 Web 的额外功能。- 在这个方法中:
- 创建
AnnotationConfigWebApplicationContext对象:这是一个基于注解配置的WebApplicationContext实现,能够扫描和加载配置类。- 注册配置类:
ctx.register(SpringMvcConfig.class),将指定的配置类SpringMvcConfig注册到WebApplicationContext中,这样 Spring MVC 就可以根据这个配置类初始化它所需的 bean 和其他配置。
1 | |
注解
Controller 设定SpringMVC的核心控制器bean
@RequestMapping 设置当前控制器方法请求访问路径
@ResponseBody 设置当前控制器方法响应内容为当前返回值,无需解析
综上-我们要导入spirngmvc容器
1.导入springmvc坐标 2.创建springmvc核心控制器bean 3.再配置类中进行指定加载4.配置tocat的路径哪些被springmvc管理

*
2.bean加载控制
在 Spring 应用程序中,通常会有两种类型的配置:
- Spring 容器配置:用于管理应用程序的核心业务逻辑组件,例如服务层(Service)、数据访问层(DAO)等。
- Spring MVC 容器配置:用于管理 Web 层的组件,例如控制器(Controller)、视图解析器(View Resolver)等。
当一个应用程序使用了 Spring 和 Spring MVC 时,通常会有两个 ApplicationContext:
- 根应用上下文(Root ApplicationContext):由 Spring 容器管理,包含业务逻辑层的 bean(如 Service、DAO 等)。
- Web 应用上下文(WebApplicationContext):由 Spring MVC 容器管理,包含 Web 层的 bean(如 Controller、视图解析器等)。
我们就需要避免加载
springmvc-controller –mvc bean
业务层的service–注册为spirngbean的bean
将业务层的 bean(如 Service、DAO)注册到根应用上下文中,这些 bean 应该由 Spring 容器管理。
将 Web 层的 bean(如 Controller)注册到 Web 应用上下文中,这些 bean 应该由 Spring MVC 容器管理。
1.因为功能不同,如何避免Spring错误的加载到SpringMVC的bean——加载Spring控制的bean的时候排除掉SpringMVC控制的bean

非常麻烦 –还需要分开加载
案例、

这里就排除加载了springmvc的bean- 我们需要在写一个配置类来导入spirngmvc的bena
@Configuration
@ComponentScan(“com.itheima.controller”)—自动扫描
public class SpringMvcConfig {
}
3.springmvc容器的简化开发

4.请求响应
1.请求映射路径
@RequestMapping
l设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
2.请求传参


2.请求传参
1.普通参数
1.url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数
2.请求参数名与形参变量名不同,使用@RequestParam绑定参数关系
@RequestParam(“name”)String userName
2.pojo类型参数
POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
3.嵌套pojo参数
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
4.数组类型
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型形参即可接收参数 String[] likes
l
5.集合类型 RequestParam
l集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
@RequestParam List
2.JSON
添加json数据转换相关坐标
开启自动转换json数据的支持
@Configuration
@ComponentScan(“com.itheima.controller”)
@EnableWebMvc@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
public class SpringMvcConfig {
}
1.json数组 @RequestBody
将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次
@RequestBody List
2.json对象
json数据与形参对象属性名相同,定义POJO类型形参即可接收参数
@RequestBody User user
3.json对象数组
json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数
@RequestBody List
0.区别

3.日期传参



3.响应传递
1.文本返回
@ResponseBody -不仅仅可以将JSON对应类-还能告诉编译器转的是文本,而不是文件
2.json返回
返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖==@ResponseBody==注解和==@EnableWebMvc==注解
3.响应pojo集合
开对象-然后存进list集合中-返回list集合 默认返回的就是集合
List
userList.add(user1);
userList.add(user2);
@ResponseBody
| 名称 | @ResponseBody |
|---|---|
| 类型 | ==方法\类注解== |
| 位置 | SpringMVC控制器方法定义上方和控制类上 |
| 作用 | 设置当前控制器返回值作为响应体, 写在类上,该类的所有方法都有该注解功能 |
| 相关属性 | pattern:指定日期时间格式字符串 |
说明:
- 该注解可以写在类上或者方法上
- 写在类上就是该类下的所有方法都有@ReponseBody功能
- 当方法上有@ReponseBody注解后
- 方法的返回值为字符串,会将其作为文本内容直接响应给前端
- 方法的返回值为对象,会将对象转换成JSON响应给前端
此处又使用到了类型转换,内部还是通过Converter接口的实现类完成的,所以Converter除了前面所说的功能外,它还可以实现:
- 对象转Json数据(POJO -> json)
- 集合转Json数据(Collection -> json)
Rest风格
1.rest风格介绍
传统风格
http://localhost/user/getById?id=1查询id为1的用户信息http://localhost/user/saveUser保存用户信息
REST
http://localhost/user/1http://localhost/user- 根据路径 无法看出对应功能–具有隐私保护性
请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE。
按照不同的请求方式代表不同的操作类型。
- 发送GET请求是用来做查询
- 发送POST请求是用来做新增
- 发送PUT请求是用来做修改
- 发送DELETE请求是用来做删除
上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
2.路径传参 @PathVariable
1 | |
| 名称 | @PathVariable |
|---|---|
| 类型 | ==形参注解== |
| 位置 | SpringMVC控制器方法形参定义前面 |
| 作用 | 绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应 |
关于接收参数,我们学过三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?
- 区别
- @RequestParam用于接收url地址传参或表单传参
- @RequestBody用于接收json数据
- @PathVariable用于接收路径参数,使用{参数名称}描述路径参数
- 应用
- 后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
- 采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
springmvc开发特性
1.知识点1:@RestController
| 名称 | @RestController |
|---|---|
| 类型 | ==类注解== |
| 位置 | 基于SpringMVC的RESTful开发控制器类定义上方 |
| 作用 | 设置当前控制器类为RESTful风格, 等同于@Controller与@ResponseBody两个注解组合功能 |
知识点2:@GetMapping @PostMapping @PutMapping @DeleteMapping
| 名称 | @GetMapping @PostMapping @PutMapping @DeleteMapping |
|---|---|
| 类型 | ==方法注解== |
| 位置 | 基于SpringMVC的RESTful开发控制器方法定义上方 |
| 作用 | 设置当前控制器方法请求访问路径与请求动作,每种对应一个请求动作, 例如@GetMapping对应GET请求 |
| 相关属性 | value(默认):请求访问路径 |
Spring mvc 异常处理机制

@ControllerAdvice 是一个全局异常处理注解,用于定义一个全局的异常处理类。这个类中的方法可以处理所有控制器中抛出的异常
1 | |

@ExceptionHandler 是 Spring MVC 提供的一种注解,用于定义处理特定异常的方法。可以在控制器类中使用该注解来捕获和处理特定类型的异常。
–增强类上指定-异常拦截器处理–基于AOP切面编程实现
案例处理-如题



自写异常-根据异常严重程度来进行对应的出来

抛出异常
拦截处理异常

Springmvc -拦截器
Spring MVC 中,拦截器(Interceptor)是一种用于对请求进行预处理和后处理的机制。拦截器类似于 Servlet 的过滤器(Filter),但提供了更灵活和强大的功能。它们可以用于权限检查、日志记录、性能监控等场景。
Spring MVC 的拦截器基于 HandlerInterceptor 接口,它允许我们在处理 HTTP 请求的过程中插入自定义的逻辑。拦截器可以在以下三个阶段执行:
- 预处理阶段(preHandle):在请求到达控制器之前执行。
- 后处理阶段(postHandle):在请求被控制器处理之后,但在视图渲染之前执行。
- 完成后处理阶段(afterCompletion):在整个请求完成之后执行,通常用于资源清理。
1.拦截器案例
1.声明拦截器

实现HandlerInt接口
–
在 Spring Boot 或 Spring MVC 的 Java 配置中,可以通过实现
WebMvcConfigurer接口的addInterceptors方法来添加拦截器
添加拦截器指定路径
在 Spring Boot 或 Spring MVC 的 Java 配置中,可以通过实现 WebMvcConfigurer 接口的 addInterceptors 方法来添加拦截器
1 | |
addInterceptors(InterceptorRegistry registry):添加拦截器的方法。
addInterceptor(new MyInterceptor()):注册自定义拦截器。
addPathPatterns("/**"):设置拦截器拦截的路径模式,例如,/** 表示拦截所有请求。
excludePathPatterns("/login", "/error"):设置不需要拦截的路径模式,例如登录页和错误页。
2.拦截器流程




3.多拦截器

1 | |
addInterceptor() 方法按顺序注册拦截器,Spring MVC 将按照注册顺序执行这些拦截器的 preHandle() 方法,postHandle() 和 afterCompletion() 方法则按相反顺序执行。

4.基于AOP实现拦截器
MVC 拦截器:基于 HandlerInterceptor 接口,可以在处理 HTTP 请求的生命周期的特定点执行代码。适用于 Web 层的请求预处理和后处理。
使用 AOP 实现类似的拦截功能,可以在控制器方法执行前后插入一些通用的逻辑。使用 AOP 可以更灵活地选择何时何地应用这些逻辑。
1 | |
1 | |
WebApplicationContext探究
WebApplicationContext是一个容器类,它是 Spring 框架中专门用于 Web 应用程序的应用上下文(ApplicationContext)接口的扩展。什么是
WebApplicationContext?
WebApplicationContext是 Spring 框架中的一个接口,它继承了ApplicationContext接口,并添加了特定于 Web 应用程序的功能。它提供了一些额外的方法和功能来处理 Web 应用程序的特定需求,例如管理与 Servlet、过滤器和监听器相关的 Web 组件。
WebApplicationContext的特点
**扩展
ApplicationContext**:
WebApplicationContext继承自ApplicationContext,而ApplicationContext是 Spring 的核心容器接口,用于管理和配置应用程序中的 bean。ApplicationContext提供了 Spring IoC 容器的基本功能,如依赖注入、事件发布、国际化支持等。WebApplicationContext是ApplicationContext的一个特化版本,增加了与 Web 环境相关的特性。面向 Web 应用程序:
WebApplicationContext是为 Web 应用程序设计的,它能够处理 Web 相关的上下文信息,例如:
- ServletContext:
WebApplicationContext可以访问 Servlet 容器的ServletContext,这使它能够与 Servlet API 集成,并提供与 Web 容器的交互能力。- 会话作用域和请求作用域:
WebApplicationContext支持 Web 特定的作用域(如会话作用域和请求作用域),这对于 Web 应用程序非常有用。Web 应用程序的根上下文:
- 在典型的 Spring Web 应用程序中,
WebApplicationContext通常是应用程序的根上下文(Root Context),它在 Web 应用程序启动时由 Spring 的前端控制器DispatcherServlet或ContextLoaderListener创建。- 它管理 Web 应用程序的所有 bean,包括控制器、服务层组件、数据访问层组件等。
WebApplicationContext的具体实现类在 Spring 中,
WebApplicationContext有多个实现类,其中最常用的是:
XmlWebApplicationContext:
- 基于 XML 配置文件的
WebApplicationContext实现,它从指定的 XML 文件中加载 bean 定义。
AnnotationConfigWebApplicationContext:
- 基于 Java 注解的
WebApplicationContext实现,通常用于配置类(使用@Configuration注解的类)而非 XML 文件的方式进行 bean 定义的加载。
GenericWebApplicationContext:
- 通用的
WebApplicationContext实现,它既可以从 XML 文件加载配置,也可以使用注解或其他方式加载配置。总结
WebApplicationContext是一个面向 Web 的 Spring 容器类,它继承了ApplicationContext并扩展了与 Web 相关的功能。它能够管理 Web 应用程序的 bean,处理与 Web 环境相关的上下文信息,并与 Servlet 容器紧密集成。因此,WebApplicationContext是 Spring Web 应用程序中非常重要的容器类。