Spring MVC 資料校驗
資料校驗是 Web 應用必須處理的內容,Spring MVC 提供了兩種方法來對使用者的輸入資料進行校驗,一種是 Spring 自帶的 Validation 校驗框架,另一種是利用 JRS-303 驗證框架進行驗證。
Hibernate-Validator 實現了 JSR-303 驗證框架支援註解風格的驗證。
Hibernate-Validator 主要的校驗註解說明:
註解 | 功能 |
---|---|
@Null | 驗證物件是否為 null |
@NotNull | 驗證物件是否不為 null |
@AssertTrue | 驗證 Boolean 物件是否為 true |
@AssertTrue | 驗證 Boolean 物件是否為 false |
@Max(value) | 驗證 Number 和 String 物件是否小於等於指定值 |
@Min(value) | 驗證 Number 和 String 物件是否大於等於指定值 |
@DecimalMax(value) | 驗證註解的元素值小於等於 @DecimalMax 指定的 value 值 |
@DecimalMin(value) | 驗證註解的元素值大於等於 @DecimalMin 指定的 value 值 |
@Digits(integer,fraction) | 驗證字串是否符合指定格式的數字,integer 指定整數精度,fraction 指定小數精度 |
@Size(min,max) | 驗證物件長度是否在給定的範圍內 |
@Past | 驗證 Date 和 Calendar 物件是否在當前時間之前 |
@Future | 驗證 Date 和 Calendar 物件是否在當前時間之後 |
@Pattern | 驗證 String 物件是否符合正則表示式的規則 |
@NotBlank | 檢查字串是不是 Null,被 Trim 的長度是否大於0,只對字串,且會去掉前後空格 |
@URL | 驗證是否是合法的 url |
驗證是否是合法的郵箱 | |
@CreditCardNumber | 驗證是否是合法的信用卡號 |
@Length(min,max) | 驗證字串的長度必須在指定範圍內 |
@NotEmpty | 檢查元素是否為 Null 或 Empty |
@Range(min,max,message) | 驗證屬性值必須在合適的範圍內 |
這裡給個 Hibernate-Validator 驗證註冊資訊的簡單例子:
環境
- JDK1.7
- Tomcat 7
- Spring MVC 4.2.0 RELEASE
注:Spring MVC 相關 jar 包我已經上傳到 這裡 ,包括 Spring 的全部 jar、commons 相關 jar 和 Hibernate-Validator 的相關 jar。
專案結構
1 新建專案工程
(1)首先在 Eclipse 裡新建一個動態 Web 工程(Dynamic Web Project),命名為 ValidatorTest
,並自動生成 web.xml。
(2)將前面下載的 jar 包拷貝到工程的 WebContent/WEB-INF/lib/
目錄下。
2 配置 web.xml 檔案
修改 web.xml 檔案內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>ValidatorTest</display-name>
<!-- 配置 Spring MVC DispatchcerServlet 前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Servlet 對映宣告 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 避免中文亂碼 -->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 springmvc-config.xml 檔案
在 WebContent/WEB-INF/
目錄下新建 Spring MVC 配置檔案 springmvc-config.xml
,新增如下程式碼:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<context:component-scan base-package="gler.bind.controller" />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
4 實體類
在專案目錄 Java Resources/src
的包 gler.bind.entity
下新建類 User.java
,包含 username、password、age、phone 和 email 屬性,在 User 類要校驗的屬性前新增必要的 Hibernate Validator 註解對前臺提交的資料進行驗證,程式碼如下:
package gler.bind.entity;
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;
public class User {
@NotBlank(message = "使用者名稱不能為空")
private String username;
@NotBlank(message = "密碼不能為空")
@Length(min = 6, max = 16, message = "密碼的長度必須在6~16位之間")
private String password;
@Range(min = 18, max = 60, message = "年齡必須在18歲到60歲之間")
private Integer age;
@Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "請輸入正確格式的手機號")
private String phone;
@Email(message = "請輸入合法的郵箱地址")
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
5 Controller 類的實現
在包 gler.bind.controller
下新建 Controller 類 UserController.java
,程式碼如下:
package gler.bind.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.RequestMapping;
import gler.bind.entity.User;
@Controller
public class UserController {
// 進入註冊頁面
@RequestMapping(value = "/registerform")
public String registerform(Model model) {
model.addAttribute("user", new User());
return "register";
}
// 註冊請求的響應方法
@RequestMapping(value = "/register")
public String register(@Valid @ModelAttribute("user") User user, Errors errors,Model model) {
if(errors.hasErrors()){
return "register";
}
model.addAttribute("user", user);
return "success";
}
}
其中 @Valid @ModelAttribute("user") User user
的 @Valid
意思是在把資料繫結到 @ModelAttribute("user")
後就進行驗證。後面跟著 Errors 物件儲存校驗資訊,如果 errors 中有錯誤資訊,則返回 register 頁面,驗證成功則跳轉到 success 頁面。
6 JSP 頁面
(1)register.jsp
在 WebContent/WEB-INF
目錄下新建資料夾 views
,並在該路徑下新建一個 JSP 頁面命名為 register.jsp,新增 <form:errors>
標籤顯示屬性的錯誤資訊,程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊頁面</title>
</head>
<body>
<div id="global">
<form:form modelAttribute="user" method="post" action="register">
<fieldset>
<legend>註冊</legend>
<p>
<label>使用者名稱:</label>
<form:input path="username" />
<form:errors path="username" cssStyle="color:red"/>
</p>
<p>
<label>密 碼:</label>
<form:password path="password" />
<form:errors path="password" cssStyle="color:red"/>
</p>
<p>
<label>年 齡:</label>
<form:input path="age" />
<form:errors path="age" cssStyle="color:red"/>
</p>
<p>
<label>電 話:</label>
<form:input path="phone" />
<form:errors path="phone" cssStyle="color:red"/>
</p>
<p>
<label>郵 箱:</label>
<form:input path="email" />
<form:errors path="email" cssStyle="color:red"/>
</p>
<p id="buttons">
<input id="submit" type="submit" value="註冊"> <input
id="reset" type="reset" value="重置">
</p>
</fieldset>
</form:form>
</div>
</body>
</html>
(2)success.jsp
在 WebContent/WEB-INF/views
目錄下新建一個 JSP 頁面命名為 success.jsp,程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<h5>註冊成功,個人資訊如下:</h5>
使用者名稱:${user.username}
<br />密 碼:${user.password}
<br />年 齡:${user.age}
<br />電 話:${user.phone}
<br />郵 箱:${user.email}
<br />
</body>
</html>
7 執行測試
在 Tomcat 上執行 BindTest,開啟瀏覽器輸入 URL http://localhost:8080/ValidatorTest/registerform
:
什麼註冊資訊都不填,點選註冊:
填寫部分不合格資訊:
如果資訊驗證通過,跳轉至成功頁面,顯示使用者的基本資訊:
參考連結