【SpringBoot】---接收参数与验证数据

【SpringBoot】---接收参数与验证数据

一、在方法中使用参数

1、获取路径中的值

@GetMapping("article/{id}")
public String getArticle(@PathVariable("id") Integer id){
    System.out.println(id);

    return "id是"+id;
}

测试:

image-20210916132838304

2、获取路径中的参数

@RequestMapping("/addUser")
    public String addUser(String username){
        System.out.println(username);
        
        return "username是:"+username;
    }

测试:

image-20210916133209790

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();
    }

测试:

image-20210916133658840

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();
}

测试:

image-20210916134257779

5、通过HttpServletRequest接收参数

@RequestMapping("/adduser3")
public String adduser3(HttpServletRequest request){
    System.out.println("name:"+request.getParameter("uname"));

    return request.getParameter("uname");
}

测试:

image-20210916134608829

6、用@RequestParam绑定入参

当请求参数不存在时会发生异常,可以通过设置属性"required=false"来解决。

@RequestMapping("/adduser4")
public String adduser4(@RequestParam(value = "unm") String username){
    System.out.println(username);

    return username;
}

测试:

image-20210916134926244

7、用@RequestBody接收JSON数据

@RequestMapping("/adduser5")
public String adduser5(@RequestBody User user){
    System.out.println(user.getUserName());

    return user.getUserName();
}

测试:

注意userName一定要和实体类定义的驼峰命名一模一样。否则Spring识别不到,就接收不到哦。

image-20210916135253324

二、验证数据

1、内置的验证器Hibernate-validator

​ Hibernate-validator可以实现数据的验证,它是对JSR(Java Specification Requests)标准的实现。在Web开发中,不需要额外为验证再导入其他的依赖,只需要添加web依赖即可。web依赖已经将其集成。

2、Validator验证的常用注解

注解 作用类型 说明
@NotBlank(message=) 字符串 验证字符串非null,且长度必须大于0
@Email 字符串 被注释的元素必须是电子邮箱地址
@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";

    }
}
posted @ 2021-09-16 18:15  DarkerG  阅读(404)  评论(0编辑  收藏  举报