天天看点

SpringMVC数据校验-JSR 303

       输入校验分为客户端校验和服务器校验,客户端校验主要是过滤正常用户的误操作,通常通过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. 工程的目录结构:

SpringMVC数据校验-JSR 303
2. JSR 303的jar包:(使用时还需加上SpringMVC的jar包)
SpringMVC数据校验-JSR 303
3.web.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>
           
4.springmvc.xml:
<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>
           
5.校验信息配置文件(ValidationMessages.properties)
SpringMVC数据校验-JSR 303
6.前端的jsp页面(registerForm.jsp)
<%@ 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>
           
7.User类:
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 + "]";
	}

}
           
8.UserController类:
package 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";

	}
}
           
9. success.jsp
<%@ 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).输入错误的注册信息:

SpringMVC数据校验-JSR 303
2)输入符合验证规则的注册信息:
SpringMVC数据校验-JSR 303