1.关于Spring MVC
Spring MVC是基础spring框架基础之上,主要解决了后端服务器接收客户端提交的请求,并给予响应的相关问题.
MVC=Model+View+Controller
-
Model:数据模型,通常由业务逻辑层(Service Layer)和数据访问层(Data Access Object Layer)构成
-
View:视图
-
Controller:控制器
MVC只关心V-C之间的交互
2.创建Spring MVC工程
可参考IDEA-Tomcat
3.使用Spring MVC工程接收客户端的请求
在pom.xml中添加spring-webmvc
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.14</version> </dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>
2个配置类,一个Spring配置类,一个Spring MVC配置类( 实现WebMvcConfigurer接口)
项目初始化类,必须继承AbstractAnnotationConfigDispatcherServletInitializer
控制器类,用于接收客户端的某个请求,并予以响应结果
-
当启动Tomcat时,会自动将项目打包并部署到Tomcat,通过自动打开的浏览器中的URL即可访问主页.
-
启动Tomcat,项目就会自动创建并加载
AbstractAnnotationConfigDispatcherServletInitializer
的子类,即当前项目中自定义的SpringMvcInitialier
,无论这个类放在哪个包中,都会自动创建并加载,由于会自动调用这个类中所有方法,所以会将Spring MVC框架处理的请求路径设置为*.do
,并执行对cn.tedu.springmvc
的组件扫描,进而会创建UserController
的对象,由于在UserController
中配置的方法使用了@RequestMapping("/login.do")
,则此时还将此方法与/login.do
进行了绑定,以至于后续随时访问/login.do
时都会执行此方法 -
注意:组件扫描必须配置在SpringMVc的配置类中
-
注意:控制类的注解必须是
@Controller
,不可以是其他组件扫描注解
4.关于@RequestMapping
注解
主要作用:配置请求路径与处理请求方法的映射关系
注解添加在控制器的方法之前或者控制器类上
@RequestMapping配置请求路径,请求方式,请求头,响应头
RequestMethod请求方式 GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的方式。 POST(CREATE):在服务器新建一个资源,调用insert操作。 PUT(UPDATE):在服务器更新资源,调用update操作。 DELETE(DELETE):从服务器删除资源,调用delete语句
不配置mothod则表示可以使用任何请求
GET, HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;
Spring MVC框架还提供了@RequestMapping的相关注解
只能加在方法上面,限定请求方式 @DeleteMapping @GetMapping @PostMapping @PutMapping
小结:
类上使用@RequestMapping,方法 上使用@GetMapping, @PostMapping等注解
5.关于@ResponseBody
注解
@ResponseBody:响应正文
-
配置"响应正文",则处理请求的方法的返回值则会直接发送到客户端
-
不配置"响应正文",则处理请求的方法的返回值表示"视图组件的名称",当方法返回后,服务器不会直接响应,会根据视图组件的名称"在服务器找到对应的视图组件(不推荐,不是前后端分离)
将@ResponseBody添加到类上,所有方法都可以使用
Spring MVC还提供@RestController同时具有@ResponseBody和@Controller
Spring MVC内置了一系列的转换器(Converter) ,用于将方法的返回值转换为响应到客户端的数据,并且Spring
MVC会根据方法的返回值不同,自动选取某个转换器
不使用String
作为处理请求的返回值类型
建议向客户端响应JSON格式的字符串,需要添加jackson-databind
依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency>
jackson-databind
依赖项中也有一个转换器,当SpringMVC调用的处理请求方法的返回值是SpringMVC没有默认匹配的转换器时,会自动使用jackson-databind转换器,jackson-databind转换器会解析方法的返回值,并就其处理为JSON格式的字符串,在响应头中将Content-Type设置为application/json
注意:在Spring MVC中,需要在SpringMVC配置类上添加@EnableWebMvc注解,否则响应时会导致出现HTTP406错误
6.接收请求参数
将各参数直接声明为处理请求的方法的参数
-
客户端提交的请求中没有匹配名称的参数,获取到的是null
-
客户端提交了参数名称,却没有值,获取到的是""(长度为0的空串)
-
客户端提交了匹配的参数名称,且值是有效的,则可以获取到值
声明参数时:参数尽量使用包装类,使用基本类型会出现IllegalStateException
400:参数错误或者参数未提交
404:资源不存在
405:请求参数错误
406:头部错误
@RequestParam
-
配置
name
属性:协调名称不统一 -
配置required属性:默认为true,要求客户端必须提交请求参数
-
配置defaultValue属性:当客户的没有提交参数时,使用默认值
参数较多时,将参数封装成数据类型,把数据类型作为参数
封装后使用Validation,不适用RequestParam
可以结合使用,一部分参数声明,一部分封装
7.RestFul
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
资源:互联网所有的事物都可以被抽象为资源 资源操作:分为POST、DELETE、PUT、GET四种方法,使用不同方法对资源进行操作(增、删、改、查)
http方法 | 资源操作 | 幂等 | 安全 |
---|---|---|---|
GET | SELECT | 是 | 是 |
POST | INSERT | 否 | 否 |
PUT | UPDATE | 是 | 否 |
DELETE | DELETE | 是 | 否 |
幂等性:对同一REST接口的多次访问,得到的资源状态是相同的。
安全性:对该REST接口访问,不会使服务器端资源的状态发生改变。
RestFul的设计风格典型表现就是:将某些唯一特征的请求参数
放在URL中,而不是放在URL的参数中
https://blog.csdn.net/weixin_46594796/article/details/114673114
在使用{}
格式的占位符时,还可以结合正则表达式进行匹配,其基本语法是:
{占位符名称:正则表达式}
占位符的做法并不影响精准匹配的路径
8.关于响应正文的结果类型
当响应正文时,只要方法的返回值是自定义的数据类型,则Spring MVC框架一定会调用jackson-databind
的转换器,就可以将结果转换为JSON格式的字符串.
类中用到了泛型,类的声明上就得有
静态方法(static方法)使用了泛型,静态方法声明得有泛型
100:就绪 200:成功 301 / 302:重定向 400:请求参数有误 401:后续学习再讲 403:后续学习再讲 404:请求资源不存在 405:请求方式错误 406:请求头不可接受 500:服务器内部错误
9.统一处理异常
自定义方法对异常进行处理,关于此方法
-
注解:需要添加
ExceptionHandler
注解 -
访问权限:应该是公有的
-
放回值类型:可参考处理请求的方法的返回值类型
-
方法名称:自定义
-
参数列表:必须包含1个异常类型的参数,按需添加
HttpServletRequest
,HttpServletResponse
等少量的特定类型参数,不可随意添加参数
//异常处理方法 @ExceptionHandler public String handlerException(NullPointerException e){ return "Error NullPointerException!"; }
将处理异常的代码放在专门的类中
在此类中添加@ControllerAdvice(@RestControllerAdvice)
可以将处理异常的方法放到所有控制器公共的父类中,让所有控制器继承
@RestControllerAdvice public class GlobalExceptionHandler { //异常处理方法 @ExceptionHandler({NullPointerException.class,ClassCastException.class}) public String handlerNullPointerException(Throwable e){ e.printStackTrace(); return "Error NullPointerException or ClassCastException!"; } @ExceptionHandler public String handlerThrowable(Throwable e){ e.printStackTrace(); return "Error Throwable!"; } }
10.拦截器Interceptors
拦截器可以运行在所有控制器处理请求之前和之后的一种组件.
目的并不是"拦截下来阻止运行",而且"拦截下来执行某些代码",其优势在于可作用于若干种不同的的请求的处理过程
使用拦截器需要自定义类,
-
运行在处理请求之前,可以选择对当前请求进行阻止或放行
每个拦截器都必须注册才能被启用,注册过程通过重写WebMvcConfigurer
的addInterceptors
方法
addPathPatterns拦截什么
excludePathPatterns除之外
11.SpingMVC的小结
-
理解Spring MVC框架作用
-
接收请求,响应结果,处理异常....
-
-
掌握创建基于Maven的运行在Tomcat的webapp
-
认识基础的依赖项
-
spring-context
、javax.servlet-api
、jackson-databind
-
-
掌握配置SpringMVC的运行环境(使得控制器能接收请求)
-
掌握以下注解的使用
-
@Controller
/@RestController
-
@ResponseBody
-
@RequestMapping
、@GetMapping
、@PostMapping
-
@RequestParam
/@PathVariable
-
@Exceptionhandler
/@ControllerAdvice
/@RestControllerAdvice
-
@EnableWebMvc
-
-
掌握接收请求参数的方式
-
将请求参数直接声明在参数列表
-
将若干个请求参数进行封装,并将封装的类型声明在参数列表中
-
如果是URL中的路径,需要使用@PathVariable
-
-
掌握响应JSON格式的正文
-
处理请求的方法必须添加@ResponseBody,或当前控制器类添加@ResponseBody,或当前控制器类添加@RestController
-
在SpringMVC配置类上添加
@EnableWebMvc
-
在项目的
pom.xml
中添加jackson-databind
-
处理请求的方法返回自定义的数据类型
-
-
掌握响应JSON格式的正文,统一的响应类型的类的设计
-
了解Restful风格
-
掌握统一处理异常
-
掌握拦截器的创建与配置
附:关于POJO
继承是一种利用已有的类快速创建新的类的机制
POJO:所有用于封装属性的类型都可以统称为POJO
常见的POJO后缀:BO,DO,VO,DTO
VO/DTO 就是Value Object和Data Transform object就是作为数据使用的对象