struts2的數據校驗

數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分爲客戶端驗證和服務器端驗證,服務器端數據驗證主要特點:

·數據提交後在服務器端驗證

·防止繞過客戶端驗證提交的非法數據

·可以在服務器端處理數據前保證數據的合法性

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中服務器端數據校驗

Struts2.3 Ajax校驗配置

struts2 form標籤加上validate="true"就出錯的解決辦法



發佈了92 篇原創文章 · 獲贊 69 · 訪問量 56萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章