数据校验[validator](SpringMVC)

    xiaoxiao2022-07-13  147

    数据校验

    用于后端对前端传过来的数据进行二次校验, 以防一些数据传输问题. 可以进行一些如: 用户名字是否为空, 密码格式是否正确 的判断 此功能需要引入一个jar包 Hibernate Validator 步骤: ① 引入jar包 ② 在实体类中想要校验的属性上加上相关的校验注解 [message为错误信息] 例:

    // bookName属性值不能为空, 否则返回错误信息"书名不能为空" @NotNull(message = "书名不能为空") private String bookName;

    ③ 在需要校验的参数前面加上@Validated注解, 并加上一个参数BindingResult result,可以通过BindingResult对象拿到校验错误信息 注意!!! : 该参数必须紧跟着被校验的对象的后面

    如果没有错误则正常执行, 出现错误则跳转到error.jsp页面显示错误信息errors [即存放在model中的errors属性].

    @RequestMapping("/book/create") public String create(@Validated BookBean book, BindingResult result, Model model){ // 判断是否有校验的错误 if (result.hasErrors()){ for (FieldError error : result.getFieldErrors()) { // 获取被校验对象得到所有错误信息 String message = error.getDefaultMessage(); System.out.println(message); } // 可以直接把错误信息的集合放到model里面 model.addAttribute("errors",result.getFieldErrors()); return "error.jsp"; } return "success.jsp"; }

    但是

    我们编程时通常会遇到许多情况, 比如登录,注册. 注册时需要接收校验 : 用户名, 密码, 电话号, 邮箱 等等 登录时只需要接收校验 : 用户名, 密码就可以了, 但是用上面的那种形式,却全部校验了,会导致登录时可能会因为没有填写电话号, 邮箱等标记了@NotNull的属性, 而返回错误信息, 导致代码不能如期运行. 这时我们就需要给每个属性的校验添加一个范围, 让他们仅在所指定的范围内执行, 其他时候不进行校验. 步骤如下:

    分组校验

    ① 在实体类中创建内部接口 用于标记范围 (例: public interface LoginGroup{} public interface RegisterGroup{} )

    @Component public class UserBean { // 创建内部接口 用于标记 public interface LoginGroup{} public interface RegisterGroup{} @NotNull private String username;

    ② 在校验注解中, 有一个groups属性, 表示此注解所生效的范围 在groups属性中填上注解生效的范围. 如下:

    @NotNull(groups = {LoginGroup.class,RegisterGroup.class}) private String username; @Length(min = 6,max = 20,groups = {LoginGroup.class,RegisterGroup.class}) private String password; @Pattern(regexp = "1[3-9][\\d]{9}",groups = {RegisterGroup.class}) private String mobile;

    ③ 在controller中用的方法参数前面填上@Validated注解并填上用于标记的内部接口, 以给定参数需要执行的校验 如下:

    @RequestMapping("/login") public String login(@Validated(UserBean.LoginGroup.class)UserBean user){ return "success"; } @RequestMapping("/register") public String register(@Validated(UserBean.RegisterGroup.class)UserBean user){ return "success"; }

    这样小伙伴们就不用担心校验的时候出现,校验到没想校验的参数啦!!!

    最新回复(0)