【SpringBoot】---接收参数与验证数据
【SpringBoot】---接收参数与验证数据
一、在方法中使用参数
1、获取路径中的值
@GetMapping("article/{id}")
public String getArticle(@PathVariable("id") Integer id){
System.out.println(id);
return "id是"+id;
}
测试:
2、获取路径中的参数
@RequestMapping("/addUser")
public String addUser(String username){
System.out.println(username);
return "username是:"+username;
}
测试:
3、通过Bean接收HTTP提交的对象
package com.example.canshu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {
private String userName;
}
//下面是对应的接口
@RequestMapping("/user")
public String userModel(User user){
System.out.println(user.getUserName());
return "username是:"+user.getUserName();
}
测试:
4、用注解@ModelAttribute获取参数
用于从Model、Form或URL请求参数中获取属性值
@RequestMapping(value = "/adduser2",method = RequestMethod.POST)
public String adduser2(@ModelAttribute("user") User user){
System.out.println(user.getUserName());
return "username是:"+user.getUserName();
}
测试:
5、通过HttpServletRequest接收参数
@RequestMapping("/adduser3")
public String adduser3(HttpServletRequest request){
System.out.println("name:"+request.getParameter("uname"));
return request.getParameter("uname");
}
测试:
6、用@RequestParam绑定入参
当请求参数不存在时会发生异常,可以通过设置属性"required=false"来解决。
@RequestMapping("/adduser4")
public String adduser4(@RequestParam(value = "unm") String username){
System.out.println(username);
return username;
}
测试:
7、用@RequestBody接收JSON数据
@RequestMapping("/adduser5")
public String adduser5(@RequestBody User user){
System.out.println(user.getUserName());
return user.getUserName();
}
测试:
注意userName一定要和实体类定义的驼峰命名一模一样。否则Spring识别不到,就接收不到哦。
二、验证数据
1、内置的验证器Hibernate-validator
Hibernate-validator可以实现数据的验证,它是对JSR(Java Specification Requests)标准的实现。在Web开发中,不需要额外为验证再导入其他的依赖,只需要添加web依赖即可。web依赖已经将其集成。
2、Validator验证的常用注解
注解 | 作用类型 | 说明 |
---|---|---|
@NotBlank(message=) | 字符串 | 验证字符串非null,且长度必须大于0 |
字符串 | 被注释的元素必须是电子邮箱地址 | |
@Length(min=,max=) | 字符串 | 被注释的字符串的大小必须在指定的范围内 |
@NotEmpty | 字符串 | 被注释的字符串非空 |
@NotEmptyPattern | 字符串 | 在字符串不为空的情况下,是否匹配正则表达式 |
@DateValidator | 字符串 | 验证日期格式是否满足正则表达式,local为英语 |
@DateFormatCheckPattern | 字符串 | 验证日期格式是否满足正则表达式,local是自己手动指定的 |
@CreditCardNumber | 字符串 | 验证信用卡号码 |
@Range(min=,max=,message=) | 数值类型、字符串、字节 | 被注释的元素必须在合适的范围内 |
@Null | 任意 | 被注释的元素必须为null |
@NotNUll | 任意 | 被注释的元素必须部位null |
@AssertTrue | 布尔值 | 被注释的元素必须为true |
@AssertFalse | 布尔值 | 被注释的元素必须为flase |
@Min(value) | 数字 | 被注释的元素必须是一个数组,且大于或等于指定的最小值 |
@Max(value) | 数字 | 被注释的元素必须是一个数字,且小于或等于指定的最大值 |
@DecimalMin(value) | 数字 | 被注释的元素必须是一个数字,且大于或等于指定的最小值 |
@DecimalMax(value) | 数字 | 被注释的元素必须是一个数字,且小于或等于指定的最大值 |
@Size(max=,min=) | 数字 | 被注释的元素的大小必须在指定范围内 |
@Digits(integer,fraction) | 数字 | 备注是的元素必须是一个数字,且在可接收的范围内 |
@Past | 日期 | 被注释的元素必须是一个过去的日期 |
@Future | 日期 | 被注释的元素必须是一个未来的日期 |
@Pattern(regex=,flag=) | 正则表达式 | 被注释的元素必须符合指定的正则表达式 |
@ListStringPattern | List<String> | 验证集合中的字符串是否满足正则表达式 |
3、自定义验证功能
SpringBoot的验证功能可以满足大多数的验证需求,如果需要自定义的话,需要提供两个类:
- 自定义注解类
- 自定义验证业务逻辑类
其中@Constraint注解需要导包
<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
①自定义注解类
package com.example.canshu.Constraint;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//限定使用范围————只能使用在字段上
@Target({ElementType.FIELD})
//表明注解的声明周期,他在代码运行时可以通过反射获取到注解
@Retention(RetentionPolicy.RUNTIME)
//@Constraint注解,里面传了一个validatedBy字段,以指定该注解的校验逻辑
@Constraint(validatedBy = MyCustomConstraintValidator.class)
public @interface MyCustomConstraint {
//错误体质
String message() default "请输入中国政治或者经济中心的城市名";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
②自定义验证业务逻辑类
package com.example.canshu.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MyCustomConstraintValidator implements ConstraintValidator<MyCustomConstraint,String> {
//String为校验的类型
@Override
public void initialize(MyCustomConstraint constraintAnnotation) {
//在启动时候执行
}
//自定义校验逻辑
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if (!(s.equals("北京")||s.equals("上海"))){
return false;
}
return true;
}
}
③使用
创建实体
package com.example.demo.entity;
import com.example.demo.MyConstraint;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.io.Serializable;
@Data
public class User implements Serializable {
/**
* 主键ID
*/
private Long id;
@NotBlank(message = "用户名不能为空")
@Length(min = 5, max = 20, message = "用户名长度为5-20个字符")
private String name;
@NotNull(message = "年龄不能为空")
@Min(value = 18 ,message = "最小18岁")
@Max(value = 60,message = "最大60岁")
private Integer age;
/* @NotBlank(message = "电话不可以为空")
@Length(min = 1, max = 13, message = "电话长度需要在13个字符以内")
private String phone;*/
@Email(message = "请输入邮箱")
@NotBlank(message = "邮箱不能为空")
private String email;
/* @NotNull(message = "必须指定用户状态")
@Min(value = 0, message = "用户状态不合法")
@Max(value = 1, message = "用户状态不合法")
private Integer status;*/
@MyConstraint
private String answer;
}
编写验证控制器
package com.example.demo.controller;
import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.validation.Valid;
@Controller
public class TestValidator {
@GetMapping("/test")
public String showForm(User user) {
return "form";
}
@GetMapping("/results")
public String results() {
return "results";
}
@PostMapping("/test")
public String checkUser(@Valid User user, BindingResult bindingResult, RedirectAttributes attr) {
//特别注意实体中的属性必须都验证过了,不然不会成功
if (bindingResult.hasErrors()) {
return "form";
}
/**
* @Description:
* 1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为?name=long&age=45
* 2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
* 这里的redirect必须是方法映射路径。你会发现redirect后的值只会出现一次,刷新后不会出现了,对于重复提交可以使用此来完成。
*/
attr.addFlashAttribute("user", user);
return "redirect:/results";
}
}