服务器表单校验

为什么后端要做表单的校验呢,如果只使用前端来校验的话,如果浏览器把 JS 给禁用掉, 就完犊子啦

JSR

  • JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架,它已经包含在 JavaEE6.0 中
  • JSR 303 通过在 Bean 属性上标注类似于 @NotNull、@Max 等标准的注解
  • 指定校验规则,并通过标准的验证接口对 Bean 进行验证

Hibernate Validator

  • Hibernate Validator 是 JSR 303 的一个参考实现
  • 除了支持所有标准的校验注解外,它还支持以下的扩展注解

常用的校验规则

Bean Validation 中内置的约束

注解名称 作用
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=, flag=) 被注释的元素必须符合指定的正则表达式

Hibernate Validator 附加的约束

注解名称 作用
@NotBlank(message = ) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=, max = ) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的值必须非空
@Range(min =, max =,message = ) 被注释的元素必须在合适的范围内

使用 Hibernate Validator

导入相关 jar 包,或者引入相关依赖

修改配置文件 springmvc.xml 添加如下内容

<mvc:annotation-driven/>

在模型当中添加对应的校验规则,模型也就是 JavaBean 对象新建 User.java 类文件

/**
 * @author BNTang
 */
@Data
public class User {

    @NotNull
    private String username;

    @Max(value = 200, message = "请输入合法的年龄")
    private Integer age;

    @Email(message = "请输入正确的邮箱")
    private String email;

    @Pattern(regexp = "^1([34578])\\d{9}$", message = "请输入正确的手机号")
    private String phone;
}

在处理器的方法的入参标记 @valid 注解即可

/**
 * @author: BNTang
 */
@Controller
public class MyFirstController {

    @RequestMapping("/form")
    public String form(@Valid User user, BindingResult bindingResult) {
        int errorCount = bindingResult.getErrorCount();

        if (errorCount != 0) {
            // 获取校验错误字段及错误信息
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();

            fieldErrors.forEach(i -> System.out.println(i.getField() + " : " + i.getDefaultMessage()));
        }

        return "result.jsp";
    }
}

错误信息在页面中回显

使用原始表单显示错误信息,把错误信息写到 Model 中, 修改控制器代码

/**
 * @author: BNTang
 */
@Controller
public class MyFirstController {

    @RequestMapping("/form")
    public String form(@Valid User user, BindingResult bindingResult, Model model) {
        int errorCount = bindingResult.getErrorCount();

        if (errorCount != 0) {
            // 获取校验错误字段及错误信息
            List<FieldError> fieldErrors = bindingResult.getFieldErrors();

            fieldErrors.forEach(i -> model.addAttribute(i.getField(), i.getDefaultMessage()));
            return "index.jsp";
        }

        return "result.jsp";
    }
}

发送请求的表单内容如下, 如下的是 index.jsp 的内容

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>服务器表单校验</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/form">
    姓名:<input type="text" name="username" value="${user.username}"/>${username}
    <br/>
    年龄:<input type="text" name="age" value="${user.age}"/>${age}
    <br/>
    邮箱:<input type="email" name="email" value="${user.email}"/>${email}
    <br/>
    手机号:<input type="text" name="phone" value="${user.phone}"/>${phone}
    <br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

启动工程填写表单信息,效果如下图所示,当然没有填写错误的情况下是没有任何事情的,介绍完毕

result.jsp 的内容如下所示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>result</title>
</head>
<body>
<fm:error path="username"></fm:error>
</body>
</html>
posted @ 2020-11-29 16:25  BNTang  阅读(132)  评论(0编辑  收藏  举报