數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分爲客戶端驗證和服務器端驗證,服務器端數據驗證主要特點:
·數據提交後在服務器端驗證
·防止繞過客戶端驗證提交的非法數據
·可以在服務器端處理數據前保證數據的合法性
Struts2中有兩種實現服務器端驗證的方式。採用手工編寫代碼實現、基於XML配置方式實現。本文主要介紹基於XML配置方式實現。
在實際開發中,很多驗證是相同的,對於這些許重複實現的驗證,完全可以統一實現,struts2的驗證框架就實現了這一功能。使用驗證框架時,所有的驗證規則是寫在配置文件中,便於開發與維護,所以這裏詳細介紹一下驗證框架。
1、jsp代碼編寫
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加載struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊</title>
</head>
<body>
<form action="register" method="post">
<table>
<tr>
<td>郵箱:</td>
<td><input type="text" name="email"/></td>
<!-- 使用<s:fielderror/>標籤輸入相應的字段錯誤信息 -->
<td><s:fielderror >
<s:param>email</s:param>
</s:fielderror></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"/></td>
<td><s:fielderror>
<s:param>password</s:param>
</s:fielderror>
</tr>
<tr>
<td>重複密碼:</td><td>
<input type="password" name="repassword"/></td>
<td><s:fielderror>
<s:param>repassword</s:param>
</s:fielderror></td>
</tr>
<tr>
<td>電話:</td>
<td><input type="text" name="phone"/></td>
<td><s:fielderror>
<s:param>phone</s:param>
</s:fielderror></td>
</tr>
<tr>
<td><input type="submit" value="提交"/></td>
<td></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
2、編寫Action類和struts.xml配置文件
package struts.org;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
//需要校驗的字段必需在類中提供相應的字段和相應的get,set方法
private String email;
private String password;
private String repassword;
private String phone;
public String execute() throws Exception {
System.err.println(111);
return SUCCESS;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8" />
<constant name="struts.devMode" value="true"></constant>
<!-- <constant name="struts.ui.theme" value="simple"></constant> -->
<package name="/" extends="struts-default">
<action name="register" class="struts.org.RegisterAction">
<result name="success">success.jsp</result>
<!-- 校驗失敗後,struts2會把頁面轉到名爲"input"的頁面中 -->
<result name="input">register.jsp</result>
</action>
</package>
</struts>
3、編寫validation配置文件
配置文件的命名必須爲Xxx-yyy-validation.xml,Xxx爲對應的action類名,yyy爲配置文件中action元素的name屬性值,這個文件只要與對應action類放在同一目錄下就會被自動識別,這裏命名爲RegisterAction-register-validation.xml。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<!-- name值爲需要被校驗的字段,這裏對email字段進行校驗 -->
<field name="email">
<!-- type值爲校驗器名,requiredstring:非空字符串校驗器 -->
<field-validator type="requiredstring" short-circuit="true">
<message>${getText("email.not.empty")}</message>
</field-validator>
<!-- 一個字段可以配置多個校驗器,email:校驗郵箱格式 -->
<field-validator type="email">
<message>${getText("email.form.error")}</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring" short-circuit="true">
<message>${getText("pass.not.empty")}</message>
</field-validator>
<!-- stringlength:字符串長度校驗 -->
<field-validator type="stringlength">
<!-- 爲校驗器指定參數實現不同的校驗規則,minlength:最少長度 -->
<param name="minLength">6</param>
<message>${getText("pass.min.lenght")}</message>
</field-validator>
</field>
<!-- 校驗兩次密碼是否一致,使用 fieldexpression 校驗器。expression參數指定判斷用的表達式-->
<field name="repassword">
<field-validator type="fieldexpression">
<!-- 表達式要寫在 <![CDATA[]]> 內 -->
<param name="expression"><![CDATA[repassword==password]]></param>
<message>${getText("repass.not.same")}</message>
</field-validator>
</field>
<!-- 校驗電話格式,使用regex正則表達示校驗,regexExpression參數指定正則表達式 -->
<field name="phone">
<field-validator type="regex">
<!-- 注意!2.3.15後的版本使用 regexExpression 參數 2.3.15之前的版本爲expression<span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;"> </span><span style="line-height: 17.28px; font-family: Verdana, Arial, Helvetica, sans-serif;">--></span>
<param name="regexExpression"><![CDATA[\d{11}]]></param>
<message>${getText("tel.form.error")}</message>
</field-validator>
</field>
</validators>
實現效果:
另外可以使用Dojo插件實現類似於Ajax提交校驗的效果
1、首先引入struts2-dojo-plugin-2.3.15.3.jar包
2、修改jsp頁面(此處我使用的是另一個新的jsp)
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加載struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib prefix="sx" uri="/struts-dojo-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<sx:head/>
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊</title>
</head>
<body>
<s:form action="register" method="post" validate="false">
<table>
<tr>
<td>郵箱</td>
<td><s:textfield name="email"></s:textfield></td>
<td><s:fielderror fieldName="email" cssStyle="color:blue"></s:fielderror>
</td>
</tr>
<tr>
<td>手機</td>
<td>
<s:textfield name="phone"></s:textfield>
</td>
<td>
<s:fielderror fieldName="phone"></s:fielderror>
</td>
</tr>
<tr>
<td colspan="3">
<sx:submit validate="true"/>
</td>
</tr>
</table>
</s:form>
</body>
</html>
重要的是添加<sx:head/>和<sx:submit validate="true"/>部分
實現效果:
struts客戶端校驗很簡單,在要提交的表單<s:form>上加上validate="true"屬性即可實現。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 加載struts2標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<s:head/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>註冊</title>
</head>
<body>
<s:form action="register" method="post" validate="true">
<s:textfield label="郵箱" name="email"></s:textfield>
<s:textfield label="電話" name="phone"></s:textfield>
<s:submit ></s:submit>
</s:form>
</body>
</html>
不過需要注意兩點:
1、不能配置<constant name="struts.ui.theme" value="simple"></constant>;
2、form標籤必須使用struts的標籤,即<s:form></s:form>和<s:textfield></s:textfield>等;
3、不能直接訪問jsp頁面,否則會出現如下錯誤,需要經過action進入jsp。
如果不想使用通過action進入jsp的方法,那麼還有另一個解決辦法:
<s:form action="register.action" method="post" validate="true">
即在action屬性值後面加.action
實現效果:
資源下載
struts2.3.15.3.all包下載包含了struts2-dojo-plugin-2.3.15.3.jar包
參考資料:
struts2 form標籤加上validate="true"就出錯的解決辦法