Spring mvc

Spring mvc复习

SpringMvc

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控制器类

a20b723675912525bb7fa4b6861f2445

804db24f3395fe5d5940d26edfc3ea33

springmvc0需要设定springmcv加载对应Bean

1.1 Springmvc配置

ServletContainersInitConfig 类扩展了 AbstractDispatcherServletInitializer,这个类是 Spring MVC 提供的一个抽象类,用于快速初始化基于 Servlet 3.0 的 Web 容器(如 Tomcat)。它通过实现三个方法来配置 Spring 和 Spring MVC 的应用上下文以及 Servlet 的映射。

1
2
3
4
5
6
7
8
9
10
11

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {

//加载springMVC配置 -第一个接口 创建Servlet容器时,加载SpringMVC对应的bean并放入
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext对象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//加载指定配置类
ctx.register(SpringMvcConfig.class);
return ctx;
}

作用:

  • 创建和配置 Spring MVC 的应用上下文(WebApplicationContext
    • WebApplicationContext 是 Spring 中用于 Web 应用程序的应用上下文,它扩展了 ApplicationContext,提供了面向 Web 的额外功能。
  • 在这个方法中:
    • 创建 AnnotationConfigWebApplicationContext 对象:这是一个基于注解配置的 WebApplicationContext 实现,能够扫描和加载配置类。
    • 注册配置类ctx.register(SpringMvcConfig.class),将指定的配置类 SpringMvcConfig 注册到 WebApplicationContext 中,这样 Spring MVC 就可以根据这个配置类初始化它所需的 bean 和其他配置。
1
2
3
4
5
6
7
8
9
10
11
//设置Tomcat接收的请求哪些归SpringMVC处理
//getServletMappings()方法,设定SpringMVC对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理

protected String[] getServletMappings() {
return new String[]{"/"};
}

//设置spring相关配置 如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,
protected WebApplicationContext createRootApplicationContext() {
return null;
}

注解

Controller 设定SpringMVC的核心控制器bean

@RequestMapping 设置当前控制器方法请求访问路径

@ResponseBody 设置当前控制器方法响应内容为当前返回值,无需解析

综上-我们要导入spirngmvc容器

1.导入springmvc坐标 2.创建springmvc核心控制器bean 3.再配置类中进行指定加载4.配置tocat的路径哪些被springmvc管理

67f41aab7f091ea29d50d4b977866e31

*

2.bean加载控制

在 Spring 应用程序中,通常会有两种类型的配置:

  1. Spring 容器配置:用于管理应用程序的核心业务逻辑组件,例如服务层(Service)、数据访问层(DAO)等。
  2. 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

48eb36fe246fbb47facf7e8f5eb31ff6

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

案例、

f924b648ab257fbefa08c871b796ebb5

这里就排除加载了springmvc的bean- 我们需要在写一个配置类来导入spirngmvc的bena

@Configuration
@ComponentScan(“com.itheima.controller”)—自动扫描
public class SpringMvcConfig {
}

3.springmvc容器的简化开发

1b0641d49bc4e25a589d46b048d0c712

4.请求响应

1.请求映射路径

@RequestMapping

l设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀

2.请求传参

0ae8f28c7e68ec356172c7f4f322aabc

d5fd3828d3099bff24bbf90834041bff

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 likes

2.JSON

添加json数据转换相关坐标

com.fasterxml.jackson.core jackson-databind 2.9.0

开启自动转换json数据的支持

@Configuration
@ComponentScan(“com.itheima.controller”)
@EnableWebMvc@EnableWebMvc注解功能强大,该注解整合了多个功能,此处仅使用其中一部分功能,即json数据进行自动类型转换
public class SpringMvcConfig {
}

1.json数组 @RequestBody

将请求中请求体所包含的数据传递给请求参数,此注解一个处理器方法只能使用一次

@RequestBody List likes

2.json对象

json数据与形参对象属性名相同,定义POJO类型形参即可接收参数

@RequestBody User user

3.json对象数组

json数组数据与集合泛型属性名相同,定义List类型形参即可接收参数

@RequestBody List list

0.区别

697f5240f2ca11734b8ddf804fa935bc

3.日期传参

192cc0e58e4cc136b34168f56ccf355a

ab3b6686ddb4ec826f2990c1c925d36b

image-20240414172132046

3.响应传递

1.文本返回

@ResponseBody -不仅仅可以将JSON对应类-还能告诉编译器转的是文本,而不是文件

2.json返回

返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖==@ResponseBody==注解和==@EnableWebMvc==注解

3.响应pojo集合

开对象-然后存进list集合中-返回list集合 默认返回的就是集合

List userList = new ArrayList();
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/1
  • http://localhost/user
  • 根据路径 无法看出对应功能–具有隐私保护性

请求的方式比较多,但是比较常用的就4种,分别是GET,POST,PUT,DELETE

按照不同的请求方式代表不同的操作类型。

  • 发送GET请求是用来做查询
  • 发送POST请求是用来做新增
  • 发送PUT请求是用来做修改
  • 发送DELETE请求是用来做删除

上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范

2.路径传参 @PathVariable
1
2
3
4
//设置当前请求方法为DELETE,表示REST风格中的删除操作
@RequestMapping(value = "/users/{id}/{name}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id,@PathVariable String name)
名称 @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 异常处理机制

a4c33d1fd830a4bf2508db2f6b98e836

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

1
2
3
4
5
6
7
8
9
@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)//异常捕获
public ResponseEntity<String> handleAllExceptions(Exception ex) {
return new ResponseEntity<>("Handled Exception: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}

b59e8bf4c2fbcc6be6fc912192f6f2df

@ExceptionHandler 是 Spring MVC 提供的一种注解,用于定义处理特定异常的方法。可以在控制器类中使用该注解来捕获和处理特定类型的异常。

–增强类上指定-异常拦截器处理–基于AOP切面编程实现


案例处理-如题

42419f57ee0003c58e6c059ba4fc1f58

b3b21d20c96ae90d732ce3cac09d5f68

2bb0878bbc88b02c0ce024647e49ec70

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

6241b3e5f0b6762d7a7166eac8e101ba

抛出异常

拦截处理异常

4cc146a7a81d28def5a9f72534f22ad3

Springmvc -拦截器

Spring MVC 中,拦截器(Interceptor)是一种用于对请求进行预处理和后处理的机制。拦截器类似于 Servlet 的过滤器(Filter),但提供了更灵活和强大的功能。它们可以用于权限检查、日志记录、性能监控等场景。


Spring MVC 的拦截器基于 HandlerInterceptor 接口,它允许我们在处理 HTTP 请求的过程中插入自定义的逻辑。拦截器可以在以下三个阶段执行:

  1. 预处理阶段(preHandle):在请求到达控制器之前执行。
  2. 后处理阶段(postHandle):在请求被控制器处理之后,但在视图渲染之前执行。
  3. 完成后处理阶段(afterCompletion):在整个请求完成之后执行,通常用于资源清理。
1.拦截器案例

1.声明拦截器

50fccfc54a1ef08467fab507b7fbce62

实现HandlerInt接口

在 Spring Boot 或 Spring MVC 的 Java 配置中,可以通过实现 WebMvcConfigurer 接口的 addInterceptors 方法来添加拦截器

添加拦截器指定路径

在 Spring Boot 或 Spring MVC 的 Java 配置中,可以通过实现 WebMvcConfigurer 接口的 addInterceptors 方法来添加拦截器

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册自定义的拦截器,并指定拦截路径
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns("/login", "/error"); // 排除某些路径不拦截
}
}

addInterceptors(InterceptorRegistry registry):添加拦截器的方法。

addInterceptor(new MyInterceptor()):注册自定义拦截器。

addPathPatterns("/**"):设置拦截器拦截的路径模式,例如,/** 表示拦截所有请求。

excludePathPatterns("/login", "/error"):设置不需要拦截的路径模式,例如登录页和错误页。

2.拦截器流程

4caa6002de9cae7bb61d1f4dc79fbf40

d63b5afd7e7aaff800a0a7fa06a00c25

267baa636fd682717e63a956def32ec5

4b425f5665648fd64d2371a8e70aa4b7

3.多拦截器

c4698693771084332a51d147c5cdd2e7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册第一个拦截器,拦截所有路径
registry.addInterceptor(new FirstInterceptor())
.addPathPatterns("/**");

// 注册第二个拦截器,拦截所有路径
registry.addInterceptor(new SecondInterceptor())
.addPathPatterns("/**");
}
}

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

95d7648e9ae71b1f8e4a5ccf424adb04

4.基于AOP实现拦截器

MVC 拦截器:基于 HandlerInterceptor 接口,可以在处理 HTTP 请求的生命周期的特定点执行代码。适用于 Web 层的请求预处理和后处理。

使用 AOP 实现类似的拦截功能,可以在控制器方法执行前后插入一些通用的逻辑。使用 AOP 可以更灵活地选择何时何地应用这些逻辑。

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

@Aspect
@Component
public class LoggingAspect {


@Pointcut("@annotation(customAnnotation)")
public void annotatedMethod(CustomAnnotation customAnnotation) {}
/*
这个切入点表达式 `@annotation(customAnnotation)` 的作用是匹配所有被 `@CustomAnnotation` 注解标记的方法。

`@annotation(customAnnotation)` 是 AspectJ 提供的一个语法,用来匹配方法级别的注解。这里,`customAnnotation` 是一个参数,它表示目标方法上使用的 `@CustomAnnotation`。



同时`annotatedMethod` f方法的主要用处是可以在通知(Advice)方法中使用一个更清晰、易读的命名标识来引用切入点。*/

// 在控制器中的任何方法执行之前执行
@Before("annotatedMethod(customAnnotation)")
public void beforeControllerMethod() {
System.out.println("在控制器方法执行之前执行的逻辑");
}

// 在控制器方法执行之后执行
@After("annotatedMethod(customAnnotation)")
public void afterControllerMethod() {
System.out.println("在控制器方法执行之后执行的逻辑");
}

// 环绕通知,可以在方法执行前后都进行拦截
@Around("annotatedMethod(customAnnotation)")
public Object aroundControllerMethod(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("在控制器方法执行之前执行的逻辑");
Object result = joinPoint.proceed(); // 执行目标方法
System.out.println("在控制器方法执行之后执行的逻辑");
return result;
}
}

1
2
3
public @interface CustomAnnotation {
String value();
}

WebApplicationContext探究

WebApplicationContext 是一个容器类,它是 Spring 框架中专门用于 Web 应用程序的应用上下文(ApplicationContext)接口的扩展。

什么是 WebApplicationContext

WebApplicationContext 是 Spring 框架中的一个接口,它继承了 ApplicationContext 接口,并添加了特定于 Web 应用程序的功能。它提供了一些额外的方法和功能来处理 Web 应用程序的特定需求,例如管理与 Servlet、过滤器和监听器相关的 Web 组件。

WebApplicationContext 的特点

  1. **扩展 ApplicationContext**:

    • WebApplicationContext 继承自 ApplicationContext,而 ApplicationContext 是 Spring 的核心容器接口,用于管理和配置应用程序中的 bean。ApplicationContext 提供了 Spring IoC 容器的基本功能,如依赖注入、事件发布、国际化支持等。
    • WebApplicationContextApplicationContext 的一个特化版本,增加了与 Web 环境相关的特性。
  2. 面向 Web 应用程序

    • WebApplicationContext
      

      是为 Web 应用程序设计的,它能够处理 Web 相关的上下文信息,例如:

      • ServletContextWebApplicationContext 可以访问 Servlet 容器的 ServletContext,这使它能够与 Servlet API 集成,并提供与 Web 容器的交互能力。
      • 会话作用域和请求作用域WebApplicationContext 支持 Web 特定的作用域(如会话作用域和请求作用域),这对于 Web 应用程序非常有用。
  3. Web 应用程序的根上下文

    • 在典型的 Spring Web 应用程序中,WebApplicationContext 通常是应用程序的根上下文(Root Context),它在 Web 应用程序启动时由 Spring 的前端控制器 DispatcherServletContextLoaderListener 创建。
    • 它管理 Web 应用程序的所有 bean,包括控制器、服务层组件、数据访问层组件等。

WebApplicationContext 的具体实现类

在 Spring 中,WebApplicationContext 有多个实现类,其中最常用的是:

  1. XmlWebApplicationContext

    • 基于 XML 配置文件的 WebApplicationContext 实现,它从指定的 XML 文件中加载 bean 定义。
  2. AnnotationConfigWebApplicationContext

    • 基于 Java 注解的 WebApplicationContext 实现,通常用于配置类(使用 @Configuration 注解的类)而非 XML 文件的方式进行 bean 定义的加载。
  3. GenericWebApplicationContext

    • 通用的 WebApplicationContext 实现,它既可以从 XML 文件加载配置,也可以使用注解或其他方式加载配置。

总结

WebApplicationContext 是一个面向 Web 的 Spring 容器类,它继承了 ApplicationContext 并扩展了与 Web 相关的功能。它能够管理 Web 应用程序的 bean,处理与 Web 环境相关的上下文信息,并与 Servlet 容器紧密集成。因此,WebApplicationContext 是 Spring Web 应用程序中非常重要的容器类。


Spring mvc
http://example.com/2024/09/13/Spring mvc复习/
作者
John Doe
发布于
2024年9月13日
许可协议