三. JSR 303 验证。
JSR 303 的验证,主要是通过 注解的方式,在Bean 的属性上面进行添加注解,进行验证,直接作用在 Java Bean 上面,又叫做 Bean Validation .
官方参考的是Hibernate Validation. 所以,重点学习 Hibernate的验证, 而不是Apache 的验证。
需要导入相应的包:
三.一 JSR 303 验证注解
JSR 303 的注解,在 validation-api-1.1.0.Final.jar 包里面。 javax.validation.constraints
注解 | 功能 | 范例 |
@Null | 验证对象为 null | @Null private String description; |
@NotNull | 验证不为空,只验证基本数据, 不能验证长度为0的字符串 |
@NotNull private Integer age; |
@AssertTrue | 验证为 true | @AssertTrue private boolean isMarriage; |
@AssertFalse | 验证为false | @AssertFalse private String isMarriage; |
@Max(value) | 整数数字类型的,最大值为value | @Max(120) private Integer age; |
@Min(value) | 整数数字类型的,最小值为value | @Min(18) private Integer age; |
@DecimalMax(value) | 浮点型,最大值,value为字符串形式 | @DecimalMax(value=“100.00”) private double score; |
@DecimalMin(value) | 浮点型,最小值,value为字符串形式 | @DecimalMin(value=“100.00”) private double score; |
@Digits(integer,fraction) | 浮点型是否符合格式,integer为整数, fraction为小数 |
@Digits(integer=3,fraction=2) private double score; |
@Size(min,max) | 数组,List,Map,Set,String,的最大值和最小值 | @Size(min=2,max=10) private List hobbys; |
@Past | 日期 Date 或者是日历 Calendar 对象 是否在当前时间 now 之前 |
@Past private Date birthday; |
@Future | 日期 Date 或者是日历 Calendar 对象 是否在当前时间 now 之后 |
@Future private Date invalid; |
@Pattern | 正则表达式验证,用regexp来表达式 | @Pattern(regexp=“1[0~9]{10}”) private String phone; |
三.二 Hibernate 扩展的验证注解
Hibernate 除了支持 上面 的JSR 303的注解之外,还添加了一些新的注解。
在 hibernate-validator-5.2.4.Final.jar 包里面。 org.hibernate.validator.constraints
注解 | 功能 | 范例 |
@NotBlank | 不为空,长度不能为0. 只能是字符串 会将字符串先trim()去除左右空格 |
|
@URL | 合法的url | @URL private String mainUrl; |
合法的Email 地址 | @Email private String email; |
|
@CreditCardNumber | 合法的信用卡号 | @CreditCardNumber private String card; |
@Length(min,max) | 字符串的长度在 min与max的范围之内 | @Length(min=6,max=15) private String password; |
@NotEmpty | 判断是否为空或者是Empty, 用于Array,Map,Collection,String | @NotEmpty private String name; |
@Range(min,max,message) | 数字的范围,min为最小值,max为最大值 message为提示信息 |
@Range(min=18,max=100,message=“年龄需要在18~100之间”) private Integer age; |
四. JSR 303 验证数据
四.一 引入jar包
四.二 在User.java 的各个属性上添加不同的约束注解
public class User implements Serializable{ private static final long serialVersionUID = 1L; private Integer id; @NotBlank(message="用户名不能为空12341") @Length(max=10,message="用户名不能超过10个字") private String name; @NotBlank(message="密码不能为空") @Length(min=6,max=15,message="密码长度应在6~15之间") private String password; @Range(min=18,max=100,message="年龄需要在18~100之间") private Integer age; @NotBlank(message="描述不能为空") private String description; @DecimalMin(value="0.00",message="成绩的最小值为0") @DecimalMax(value="100.00",message="成绩的最大值不能超过100") @NumberFormat(pattern="###,##") private double score; //定义一个日期类 @DateTimeFormat(pattern="yyyy-MM-dd") @Past(message="填写的出生日期必须要在当前日期之前") private Date birthday; @Pattern(regexp="1[3456789]\\d{9}",message="请输入正确的电话号码") private String phone; @Email private String email; // 后面,就是setter和getter方法了。 }
四.三 springmvc.xml 的配置文件,将hibernate进行配置
<mvc:annotation-driven validator="validator"></mvc:annotation-driven> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <!-- hibernate校验器 --> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> </bean>
四.四 后端,Action 进行处理
@Controller @RequestMapping(value="/user") public class UserAction { //转到登录的页面 @RequestMapping(value="toLogin") public String toLogin(Model model){ model.addAttribute("user",new User()); return "user/login"; } //绑定到user对象。 @RequestMapping(value="login") public String login(@Validated User user, BindingResult bindingResult,Model model){ model.addAttribute("user",user); if(bindingResult.hasErrors()){ //有错的话,就返回登录页面。 return "user/login"; } return "user/list"; } }
四.五 前端显示代码
<body> <h2>两个蝴蝶飞,数据验证使用</h2> <form:form commandName="user" action="login.action" method="post"> <form:label path="name">姓名:</form:label> <form:input path="name"/> <form:errors path="name"></form:errors> <br/> <form:label path="password">密码:</form:label> <form:input path="password"/> <!--为了能看见值,这里用 form:input,而不是form:password --> <form:errors path="password"></form:errors> <br/> <form:label path="age">年龄:</form:label> <form:input path="age"/> <form:errors path="age"></form:errors> <br/> <form:label path="description">描述:</form:label> <form:input path="description"/> <form:errors path="description"></form:errors> <br/> <form:label path="score">成绩:</form:label> <form:input path="score"/> <form:errors path="score"></form:errors> <br/> <form:label path="birthday">出生日期:</form:label> <form:input path="birthday"/> <form:errors path="birthday"></form:errors> <br/> <form:label path="phone">联系方式:</form:label> <form:input path="phone"/> <form:errors path="phone"></form:errors> <br/> <form:label path="email">邮箱:</form:label> <form:input path="email"/> <form:errors path="email"></form:errors> <br/> <form:button>提交</form:button> </form:form> </body>
四.六 重启服务器,进行验证
情况组合太多,老蝴蝶在这里只简单列举几个。
JSR 303验证是正确的,可以进行验证。