SpringMvc中的数据校验
Hibernate校验框架中提供了很多注解的校验,如下:
注解 | 运行时检查 |
---|---|
@AssertFalse | 被注解的元素必须为false |
@AssertTrue | 被注解的元素必须为true |
@DecimalMax(value) | 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 |
@DecimalMin(Value) | 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 |
@Digits(integer=, fraction=) | 被注解的元素必须为一个数字,其值必须在可接受的范围内 |
@Future | 被注解的元素必须是日期,检查给定的日期是否比现在晚 |
@Max(value) | 被注解的元素必须为一个数字,其值必须小于等于指定的最小值 |
@Min(value) | 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 |
@NotNull | 被注解的元素必须不为null |
@Null | 被注解的元素必须为null |
@Past(java.util.Date/Calendar) | 被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早 |
@Pattern(regex=, flag=) | 被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配 |
@Size(min=, max=) | 被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays) |
@Valid | 递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验 |
@CreditCardNumber | 对信用卡号进行一个大致的验证 |
被注释的元素必须是电子邮箱地址 | |
@Length(min=, max=) | 被注解的对象必须是字符串的大小必须在制定的范围内 |
@NotBlank | 被注解的对象必须为字符串,不能为空,检查时会将空格忽略 |
@NotEmpty | 被注释的对象必须为空(数据:String,Collection,Map,arrays) |
@Range(min=, max=) | 被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 ) |
@URL(protocol=, host=, port=, regexp=, flags=) | 被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件 |
下面我们来看一下例子:
我们需要对成绩进行非空验证,以及最小值为0,最大值为100的数据校验;其次是对姓名进行非空验证,以及对姓名的字符进行验证;然后是对电话进行非空验证以及正则表达式的数据校验,提示信息等等.....
第一步:springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包,如下:
第二步:创建配置文件进行配置验证器和包扫描器,以及web.xml文件配置
<!-- 配置包扫描器--> <context:component-scan base-package="cn.happy.controller"></context:component-scan> <!-- 配置验证器 --> <bean id="myvalidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> <property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property> </bean> <mvc:annotation-driven validator="myvalidator"/>
<?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> <!-- 编码过滤器 --> <filter> <filter-name>CharacterEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 配置*调度器 --> <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:applicationContext.xml</param-value> </init-param> <!-- TOmcat启动的时候,Servlet对象就存储到内存 正整数 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
第三步:创建UserInfo实体,并且标注注解等
public class UserInfo { //成绩 @NotNull //不能为空 @Min(value=0,message="成绩最小值为{value}") //最小值 @Max(value=100,message="成绩最大值为{value}") //最大值 private Integer score; //姓名 @NotNull @Size(min=6,message="名称至少6个字符") //字符 private String name; //成绩 @NotNull @Pattern(regexp="^1[3,4,5,6,7,8,9]\\d{9}$",message="手机号码格式不正确") private String phone; public Integer getScore() { return score; } public void setScore(Integer score) { this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
第四步:创建contorller控制器
@Controller public class MyController { @RequestMapping("/first.do") public ModelAndView firstDo(@Valid UserInfo info,BindingResult br) { ModelAndView mv=new ModelAndView(); mv.setViewName("/welcome.jsp"); int count = br.getErrorCount(); if(count>0) { FieldError score = br.getFieldError("score"); FieldError name = br.getFieldError("name"); FieldError phone = br.getFieldError("phone"); if(score!=null) { mv.addObject("scoremsg",score.getDefaultMessage()); } if(name!=null) { mv.addObject("namemsg",name.getDefaultMessage()); } if(phone!=null) { mv.addObject("phonemsg",phone.getDefaultMessage()); } mv.setViewName("/index.jsp"); } return mv; } }
如果数据校验通过的话,那么跳转到welcome.jsp页面,失败则跳到index.jsp页面
<h1>数据校验</h1> <form action="${pageContext.request.contextPath }/first.do" method="post"> 成绩:<input name="score" /> <span>${scoremsg }</span><br/><br/> 姓名:<input name="name"/><span>${namemsg }</span><br/><br/> 电话:<input name="phone"/><span>${phonemsg }</span><br/><br/> <input type="submit" value="提交"/> </form>
<h1>WELCOME</h1>
效果如下: