输入校验分为客户端校验和服务器校验,客户端校验主要是过滤正常用户的误操作,通常通过javaScript代码完成,服务器端校验是整个应用阻止非法数据的最后防线,遇到异常输入时应用程序直接返回,提示用户重新输入。
JSR303是java为Bean数据合法性校验所提供的一个标准规范,叫做BeanValidation,是JAVAEE 6 中的一项子规范。其官方参考实现是HibernateValidator。
Bean Validation为javaBean验证定义了相应的原数据类型和API,在应用程序当中,通过在Bean属性上标注类似于@NotNull、@Max等标准的注解指定校验规则,并通过标注的验证接口对Bean进行验证。BeanValidation是一个运行时的数据验证框架,在验证之后验证的错误信息会被马上返回。
JSR 303中定义了一套可标注在成员变量、属性方法上的注解:
@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=) 被注释的元素必须符合指定的正则表达式
HibernateValidator 附加的 constraint
@NotBlank(message=) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
JSR 303的使用:
1. 工程的目录结构:
2. JSR 303的jar包:(使用时还需加上SpringMVC的jar包)![]()
SpringMVC数据校验-JSR 303 3.web.xml:![]()
SpringMVC数据校验-JSR 303 4.springmvc.xml:<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
5.校验信息配置文件(ValidationMessages.properties)<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd "> <!-- spring自动扫描base-pack下的包或子包下面的java文件 如果扫描到有spring的相关注解的类,则把这些类注册为spring的bean --> <context:component-scan base-package="com.sf.controller,com.sf.validator" /> <!-- 默认装配 --> <mvc:annotation-driven /> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <!-- 校验错误信息配置文件 --> <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> <!-- 资源文件名 --> <property name="basenames"> <list> <value>classpath:ValidationMessages</value> </list> </property> </bean> </beans>
6.前端的jsp页面(registerForm.jsp)![]()
SpringMVC数据校验-JSR 303 7.User类:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- 需要用到SpringMVC标签库 --> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2>-------测试JSR 303 验证--------</h2> <form:form modelAttribute="user" action="login" method="post"> <table> <tr> <td>登录名:</td> <td><form:input path="loginname"/></td> <td><form:errors path="loginname" cssStyle="color:red"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> <td><form:errors path="password" cssStyle="color:red"/></td> </tr> <tr> <td>用户名:</td> <td><form:input path="username"/></td> <td><form:errors path="username" cssStyle="color:red"/></td> </tr> <tr> <td>年龄:</td> <td><form:input path="age"/></td> <td><form:errors path="age" cssStyle="color:red"/></td> </tr> <tr> <td>邮箱:</td> <td><form:input path="email"/></td> <td><form:errors path="email" cssStyle="color:red"/></td> </tr> <tr> <td>生日:</td> <td><form:input path="birthday"/></td> <td><form:errors path="birthday" cssStyle="color:red"/></td> </tr> <tr> <td>电话:</td> <td><form:input path="phone"/></td> <td><form:errors path="phone" cssStyle="color:red"/></td> </tr> <tr> <td><input type="submit" value="提交"/></td> </tr> </table> </form:form> </body> </html>
8.UserController类:package com.sf.po; import java.io.Serializable; import java.util.Date; import javax.validation.constraints.Past; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; public class User implements Serializable { @NotBlank(message = "{NotBlank.user.loginname}") private String loginname; @NotBlank(message = "{NotBlank.user.password}") @Length(min = 6, max = 10, message = "{Length.user.password}") private String password; @NotBlank(message = "{NotBlank.user.username}") private String username; @Range(min = 0, max = 150, message = "{Range.user.age}") private Integer age; @Email(message = "{Email.user.email}") private String email; //进行日期数据的转换 String-->Date @DateTimeFormat(pattern = "yyyy-MM-dd") @Past(message = "{Past.user.birthday}") private Date birthday; @Pattern(regexp = "[1][3,7,8][3,6,9][0-9]{8}", message = "{Pattern.user.phone}") private String phone; public String getLoginname() { return loginname; } public void setLoginname(String loginname) { this.loginname = loginname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "User [loginname=" + loginname + ", password=" + password + ", username=" + username + ", age=" + age + ", email=" + email + ", birthday=" + birthday + ", phone=" + phone + "]"; } }
9. success.jsppackage com.sf.controller; import javax.validation.Valid; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.Errors; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.sf.po.User; /** * 测试SpringMVC数据校验的使用 * * @author sf * @time 2017-4-9 下午2:44:42 */ @Controller public class UserController { @RequestMapping(value = "/{formName}") public String loginForm(@PathVariable String formName, Model model) { User user = new User(); model.addAttribute("user", user); //动态跳转页面 return formName; } /* * 数据校验使用@Valid,后面跟着Errors对象保存校验信息 */ @RequestMapping(value = "/login") //注意:下面的@Valid和Errors必须放在一块儿,中间不能有其他属性,否则报错 public String login(@Valid @ModelAttribute User user, Errors errors, Model model) { model.addAttribute("user", user); if (errors.hasErrors()) { return "registerForm"; } return "success"; } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h2>-------测试JSR 303 验证--------</h2> 登录名:${user.loginname }<br> 密码:${user.password }<br> 用户名:${user.username }<br> 年龄:${user.age }<br> 邮箱:${user.email }<br> 生日:<fmt:formatDate value="${user.birthday }" pattern="yyyy年MM月dd日"/><br> 电话:${user.phone } </body> </html>
运行结果:
在浏览器中输入地址:http://localhost:8080/SpringMVC_JSR303_validation/registerForm
1).输入错误的注册信息:
2)输入符合验证规则的注册信息:![]()
SpringMVC数据校验-JSR 303 ![]()
SpringMVC数据校验-JSR 303