天天看點

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

繼續閱讀