【SpringBoot】五:Web服务---SpringMVC---控制器

文章目录

  • 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
【SpringBoot】五:Web服务---SpringMVC---控制器_第1张图片
【SpringBoot】五:Web服务---SpringMVC---控制器_第2张图片

2 控制器工作流程

【SpringBoot】五:Web服务---SpringMVC---控制器_第3张图片

3 控制器中的方法

  • 注解@RequestMapping(value=“请求的url地址”):表示这个url的请求由当前方法去处理
    @GetMapping @PostMapping @PutMapping @DeleteMapping
  • 控制器方法的形参,接收请求参数,多种方法接收请求参数
  • 控制方法的返回值,表示应答的结果(包括数据,或者视图)。

4 匹配请求路径到控制器方法

(1)路径匹配策略

有path_pattern_parser(性能好)和ant_pattern_parser
【SpringBoot】五:Web服务---SpringMVC---控制器_第4张图片
(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】
【SpringBoot】五:Web服务---SpringMVC---控制器_第5张图片

(2)使用对象
【ParameterController.java】
【SpringBoot】五:Web服务---SpringMVC---控制器_第6张图片

(3)使用HttpServletRequest
【ParameterController.java】
【SpringBoot】五:Web服务---SpringMVC---控制器_第7张图片

(4)使用@RequestParam
【ParammaterController.java】
【SpringBoot】五:Web服务---SpringMVC---控制器_第8张图片

(5)使用@RequestHeader
控制器方法:
【SpringBoot】五:Web服务---SpringMVC---控制器_第9张图片

相应结果
【SpringBoot】五:Web服务---SpringMVC---控制器_第10张图片

(6) 使用@RequestBody
【SpringBoot】五:Web服务---SpringMVC---控制器_第11张图片
(7)Reader-InputStream
【SpringBoot】五:Web服务---SpringMVC---控制器_第12张图片
(8)数组参数
【SpringBoot】五:Web服务---SpringMVC---控制器_第13张图片

8 验证参数

8.1 Bean Validation

(1)添加依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-validationartifactId>
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;
    }
}

测试:
【SpringBoot】五:Web服务---SpringMVC---控制器_第14张图片
测试结果:
【SpringBoot】五:Web服务---SpringMVC---控制器_第15张图片

8.2 分组校验

AddArticleGroup和EditArticleGroup的区别是id的校验不同,其它相同
vo:
【SpringBoot】五:Web服务---SpringMVC---控制器_第16张图片
controller控制器:
【SpringBoot】五:Web服务---SpringMVC---控制器_第17张图片
测试AddArticleGroup
【SpringBoot】五:Web服务---SpringMVC---控制器_第18张图片
测试EditArticleGroup
【SpringBoot】五:Web服务---SpringMVC---控制器_第19张图片

8.3 ValidationAutoConfiguration

你可能感兴趣的:(SpringBoot,spring,boot,前端,java)