輸入校驗分為用戶端校驗和伺服器校驗,用戶端校驗主要是過濾正常使用者的誤操作,通常通過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