文章目录
- 1 控制器介绍
- 2 控制器工作流程
- 3 控制器中的方法
- 4 匹配请求路径到控制器方法
- 5 RequestMapping
- 6 控制器方法参数类型与可用返回值类型
- 7 接收请求参数
- 8 验证参数
- 8.1 Bean Validation
- 8.2 分组校验
- 8.3 ValidationAutoConfiguration
1 控制器介绍
(1)什么是控制器?
控制器是一种由Spring 管理的 Bean 对象,赋予角色是“控制器”。作用是处理请求,接收浏览器发送过来的参数,将数据和视图应答给浏览器或者客户端 app 。
控制器是一个普通的 Bean,使用@Controller 或者@RestController 注释。@Controller 被声明为@Component。所以它就是一个 Bean 对象。
(2)如何创建控制器
在java类上加入@Controller或者@RestController。
其中@RestController包含@Controller,@RestController在@Controller基础上加入了@ResponseBody
2 控制器工作流程
3 控制器中的方法
- 注解@RequestMapping(value=“请求的url地址”):表示这个url的请求由当前方法去处理
@GetMapping @PostMapping @PutMapping @DeleteMapping - 控制器方法的形参,接收请求参数,多种方法接收请求参数
- 控制方法的返回值,表示应答的结果(包括数据,或者视图)。
4 匹配请求路径到控制器方法
(1)路径匹配策略
有path_pattern_parser(性能好)和ant_pattern_parser
(2)path_pattern_parser规定的关于uri的定义
通配符:
? : 一个字符
*
: 0 或多个字符。在一个路径段中匹配字符
**
:匹配 0 个或多个路径段,相当于是所有
正则表达式: 支持正则表达
(3)RESTFul 的支持路径变量
- {变量名}
- {myname:[a-z]+}: 正则匹配 a-z 的多个字面,路径变量名称“myname”。@PathVariable(“myname”)
- {*myname}: 匹配多个路径一直到 uri 的结尾
通配符 | 匹配 |
---|---|
? | 匹配只有一个字符 |
* | 匹配一个路径段中的 0 或多个字 |
** | 匹配 0 或多段路径 |
@GetMapping(“/order/{*id}”) | {*id} 匹配 /order 开始的所有请求, id 表示 order 后面直到路径末尾的所有内容。id 自定义路径变量名称。与@PathVariable 一样使用 |
@GetMapping(“/pages/{fname:\\w+ }.log”) |
表中红色是正则表达式。
5 RequestMapping
- value:别名 path 表示请求的
- method:请求方式,支持 GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE。
如果不用method,可以使用如下的快捷注解代替:
@GetMapping: 表示 get 请求方式的@RequestMapping
@PostMapping:表示 post 请求方式的@RequestMapping
@PutMapping:表示 put 请求方式的@RequestMapping
@DeleteMapping: 表示 delete 请求方式的@RequestMapping
6 控制器方法参数类型与可用返回值类型
7 接收请求参数
接收请求参数的方式:
请求参数与形参一一对应,适用简单类型。形参可以有合适的数据类型,比如 String,Integer ,int 等。
对象类型,控制器方法形参是对象,请求的多个参数名与属性名相对应。
@RequestParam 注解,将查询参数,form 表单数据解析到方法参数,解析 multipart 文件上传。
@RequestBody,接受前端传递的 json 格式参数。
HttpServletRequest 使用 request 对象接受参数, request.getParameter(“…”)
@RequestHeader ,从请求 header
(1)一对一
【 ParameterController.java】
(2)使用对象
【ParameterController.java】
(3)使用HttpServletRequest
【ParameterController.java】
(4)使用@RequestParam
【ParammaterController.java】
(5)使用@RequestHeader
控制器方法:
相应结果
(6) 使用@RequestBody
(7)Reader-InputStream
(8)数组参数
8 验证参数
8.1 Bean Validation
(1)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
(2)使用Bean Validation
package com.sdnu.quickweb.vo;
import lombok.Data;
import javax.validation.constraints.*;
@Data
public class ArticleVO {
//文章主键
private Integer id;
@NotNull(message = "必须有作者")
private Integer userId;
//同一个属性可以指定多个注解
@NotBlank(message = "文章必须有标题")
//@Size 中 null 认为是有效值.所以需要@NotBlank
@Size(min = 3,max = 30,message = "标题必须 3 个字以上")
private String title;
@NotBlank(message = "文章必须副标题")
@Size(min = 8,max = 60,message = "副标题必须 30 个字以上")
private String summary;
@DecimalMin(value = "0",message = "已读最小是 0")
private Integer readCount;
@Email(message = "邮箱格式不正确")
private String email;
}
package com.sdnu.quickweb.controller;
import com.sdnu.quickweb.vo.ArticleVO;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class ArticleController {
@RequestMapping("/article/add")
public Map<String, Object> articleAdd(@Validated @RequestBody ArticleVO articleVO, BindingResult br) {
// service方法处理文章业务
// 返回数据
Map<String, Object> errorMap = new HashMap<>();
if (br.hasErrors()) {
List<FieldError> list = br.getFieldErrors();
list.forEach(fieldError -> {
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
});
}
return errorMap;
}
}
测试:
测试结果:
8.2 分组校验
AddArticleGroup和EditArticleGroup的区别是id的校验不同,其它相同
vo:
controller控制器:
测试AddArticleGroup
测试EditArticleGroup