在平時浏覽網頁,遊戲的注冊登入等等,我們都會發現不是随便輸入就可以通過驗證的,比如使用者名隻能字母和數字,密碼長度不夠等等,這些都是表單校驗,在你輸入請求的時候就在用戶端驗證,這樣減輕了伺服器端的任務。表單校驗顧名思義就是對輸入表單中的資料進行校驗,如果符合要求的輸入格式才可以進入下一步工作。在項目開發中,幾乎每一個項目都會涉及到類似操作,使用者注冊登入、填寫一些表單資料等等,為了讓使用者有一個良好的使用者體驗,但是又不能讓使用者随意的輸入一些非法的資料和不符合要求的資料,這時程式就有必要對使用者輸入的一系列參數進行校驗,校驗分為前端校驗和後端校驗,如果僅僅隻有前端校驗的話,如果浏覽器設定了禁用js,那麼所有的js代碼都會失效,對應的校驗代碼也會失效,是以後端的校驗是很有必要的,Hibernate Validator 中提供了一系列校驗的封裝注解。是以接下來我們學習一下springmvc中的表單校驗。
常用的校驗規則:
最常用的幾種校驗規則:
@Length(min=,max=) 被注釋的字元串的大小必須在指定的範圍内
@NotBlank(message =“不能為空”) 驗證字元串非null,且長度必須大于0
@Email 被注釋的元素必須是電子郵箱位址
@Range(min=,max=,message=) 被注釋的元素必須在合适的範圍内
@Pattern(regex=) 被注釋的元素必須符合指定的正規表達式
@Min(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Size(max=, min=) 被注釋的元素的大小必須在指定的範圍内
@NotNull 被注釋的元素必須不為 null ( 這裡注意如果沒有寫内容為空,但是不為null )
還有一些不太常用的規則:
@Null 被注釋的元素必須為 null
@AssertTrue 被注釋的元素必須為 true
@AssertFalse 被注釋的元素必須為 false
@DecimalMin(value) 被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Past 被注釋的元素必須是一個過去的日期
@Future 被注釋的元素必須是一個将來的日期
下面通過一個案例來簡單的學習一下表單的校驗。
開發步驟:
1、由于用到了 Hibernate Validator 第三方的東西,我們需要導入必須的jar包
2、在springmvc.xml配置檔案中添加下面内容:
<mvc:annotation-driven />
3、編寫jsp發送請求
4、編寫轉發器類,然後處理請求,将使用者的資訊存在域對象中去
5、通過form标簽庫擷取資料,将資料顯示在form表單中
6、然後發送請求,這一次請求發送先要經過轉發器類,我們對表單中的資料進行校驗,如果全部通過,符合要求,我們才跳轉,否則回顯到表單也,而且将錯誤資訊回顯在表單中。
下面貼上自己案例的代碼:
同樣對于配置檔案springmvc.xml和web.xml沒有任何改變,隻是添加了一個小資訊,上面有提到
java代碼:
Admin.java
package com.yxc.domain;
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;
/**
* 一個管理者類
* 通過這個實體,注解實作springmvc的表單的校驗
*<p>title:</p>
*TODO
* @author yxc
*2019年9月22日下午7:06:17
*/
public class Admin {
@NotBlank(message="使用者名不能為空")
@Length(min=6,max=13,message="使用者名必須在6到13位之間")
private String username;
@NotBlank(message="密碼不能為空")
private String password;
@Email(message="郵箱格式不正确")
private String email;
@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "請輸入正确的手機号格式")
private String teltphone;
@Range(min=0,max=200,message="請輸入合法的年齡範圍")
private int age;
private String sex;
@Past(message="請輸入正确的時間")
private Date date;
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTeltphone() {
return teltphone;
}
public void setTeltphone(String teltphone) {
this.teltphone = teltphone;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Admin [username=" + username + ", password=" + password + ", email=" + email + ", teltphone="
+ teltphone + ", age=" + age + ", sex=" + sex + ", date=" + date + "]";
}
}
Mycontroller.java
package com.yxc.web;
import java.util.Date;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxc.domain.Admin;
/**
* 表單的檢驗
*<p>title:</p>
*TODO
* @author yxc
*2019年9月23日下午3:12:53
*/
@Controller
public class MyController1 {
@RequestMapping("update1")
public String checkFrom(Model model) {
//建立對象,然後對對象進行指派
Admin admin=new Admin();
admin.setUsername("從心開始");
admin.setPassword("123456789");
admin.setAge(23);
admin.setSex("男");
admin.setDate(new Date());
admin.setEmail("[email protected]");
admin.setTeltphone("17369320451");
model.addAttribute(admin);
return "/update.jsp";
}
@RequestMapping("update2")
public String check(@Valid Admin admin,BindingResult result) {
//這裡有一個注解,用它來實作指定那個實體類中需要校驗的
//BindingResult results是對結果的處理,可以擷取不和要求的個數以及資訊
System.out.println(admin);
//這邊結果處理,如果有錯誤才會處理,沒有處理直接進行更新操作
if(result.getErrorCount()!=0) {
//如果校驗有錯誤 就将所有的錯誤擷取到,然後提示使用者
// List<FieldError> fieldErrors = result.getFieldErrors();
// for (FieldError fieldError : fieldErrors) {
// System.out.println(fieldError.getDefaultMessage());
// }
return "/update.jsp";
}
return "/success1.jsp";
}
}
三個jsp頁面:
request.jsp(發送請求)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>發送請求</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/update1.action" target="_blank" rel="external nofollow" >更新資料</a>
</body>
</html>
update.jsp(通過form标簽庫的使用擷取資料)
這裡面還有一個就是<fm:errors path=“username” cssStyle=“Color:red”></fm:errors>這其實就是将出錯的資訊回顯到表單中,并且字型變紅
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入标簽庫-->
<%@taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跟新使用者資訊</title>
</head>
<body>
<fm:form modelAttribute="admin" action="${pageContext.request.contextPath }/update2.action" method="put">
使用者名:<fm:input path="username"/><fm:errors path="username" cssStyle="Color:red"></fm:errors><br><br>
密碼:<fm:password path="password" value="${admin.password}"/><fm:errors path="password" cssStyle="Color:red"></fm:errors><br><br>
年齡:<fm:input path="age"/><fm:errors path="age" cssStyle="Color:red"></fm:errors><br><br>
性别:<fm:input path="sex"/><fm:errors path="sex" cssStyle="Color:red"></fm:errors><br><br>
電話:<fm:input path="teltphone"/><fm:errors path="teltphone" cssStyle="Color:red"></fm:errors><br><br>
郵箱:<fm:input path="email"/><fm:errors path="email" cssStyle="Color:red"></fm:errors><br><br>
日期:<fm:input path="date"/><fm:errors path="date" cssStyle="Color:red"></fm:errors><br><br>
<input type="submit" value="更新">
</fm:form>
</body>
</html>
success1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>更新成功</h2>
</body>
</html>
在上面的代碼中,對于手機号碼的驗證還出現一個有意思的東西
“^1(3|4|5|7|8)\d{9}$” 正規表達式,要求我們輸入的數字必須是1開頭,而且第二位隻能是34578中的任意一個,然後後面九位都必須是0到9的數字組成。
表單的驗證其實是一個很常用的應用,是以掌握簡單的使用可以幫助我們提高開發的效率。
下面一張圖是部分出錯提示: