1. 程式人生 > >struts2 validation.xml 驗證

struts2 validation.xml 驗證

當使用struts2的validation.xml進行驗證時,需要注意如下幾個方面:
1.表單一般使用struts2標籤<s:form validate="false"/>關閉客戶端驗證,使用<s:textfield type="text" name="name"/>name對應action中的屬性
2.在Action配置中一定要設定input返回頁面<result name="input"/>

3.新增驗證只要建立驗證的xml檔案,在Action同包下,建立:Action類名-validation.xml

4.對於int型和Date型如果客戶端傳來的格式不對,後臺會提示警告報錯,需要用javascript正則表示式驗證。

  1. <!DOCTYPE validators PUBLIC  
  2.         "-//Apache Struts//XWork Validator 1.0.2//EN"  
  3.         "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
  4. <validators>
  5.     <fieldname="name">
  6.         <field-validatortype="requiredstring">
  7.             <paramname="trim">true
    </param>
  8.             <message>請填寫使用者名稱</message>
  9.         </field-validator>
  10.         <field-validatortype="stringlength">
  11.             <paramname="minLength">4</param>
  12.             <paramname="maxLength">32</param>
  13.             <message>使用者名稱長度應在4到32個字元間
    </message>
  14.         </field-validator>
  15.     </field>
  16.     <fieldname="pass">
  17.         <field-validatortype="requiredstring">
  18.             <message>請填寫密碼</message>
  19.         </field-validator>
  20.         <field-validatortype="stringlength">
  21.             <paramname="minLength">6</param>
  22.             <paramname="maxLength">32</param>
  23.             <message>為了您賬號的安全,請設定6個字母以上的密碼(最長可設定32個字母)</message>
  24.         </field-validator>
  25.     </field>
  26.     <fieldname="age">
  27.         <field-validatortype="int">
  28.             <paramname="min">1</param>
  29.             <paramname="max">70</param>
  30.             <message>請輸入1-70之間</message>
  31.         </field-validator>
  32.     </field>
  33.     <fieldname="birth">
  34.         <field-validatortype="date">
  35.             <paramname="min">1900-01-01</param>
  36.             <paramname="max">2050-02-21</param>
  37.             <message>生日必須在{min}到{max}之間</message>
  38.         </field-validator>
  39.     </field>
  40. </validators>

1,輸入校驗介紹

Struts2提供了功能強大的輸入校驗機制,通過Struts2內建的輸入校驗器,應用無需書寫任何程式碼,即可完成大部分的校驗功能,並可以同時完成客戶端和伺服器端的校驗。如果應用的輸入校驗規則特別,Struts2也允許通過重寫validate方法來完成自定義校驗,另外Struts2的開放性還允許開發者提供自定義的校驗器。

表現層的資料處理包括兩個方面:一是資料型別的轉化,因為Web應用接收到的所有資料都是字串型別的;另一個就是輸入校驗,因為開發者必須全面考慮使用者輸入的各種情況,尤其需要注意那些非正常輸入。

客戶端的校驗最基礎的方法就是在頁面寫javascript程式碼手工校驗,伺服器端的校驗最基礎的方法就是在處理請求的Servlet的service()方法中新增校驗程式碼。

Struts2中可以通過重寫validate方法來完成輸入校驗。如果我們重寫了validate方法,則該方法會應用於此Action中的所有提供服務的業務方法。Struts2支援校驗特定方法的validateXxx()方法。例如某個Action中有一個regist()業務方法,我們可以寫一個validateRegist()方法來進行regist()的特殊校驗,客戶端請求呼叫的次序如下:validateRegist()--------------->validate()-------------->regist()

Struts2的輸入校驗流程如下:

1,型別轉換器負責對字串的請求引數執行型別轉換,並將這此值設定成Action的屬性值。

2,在執行型別轉換過程中可能出現異常,如果出現異常,將異常資訊儲存到ActionContext中,conversionError攔截器負責將其封裝到fieldError裡,然後執行第3步;如果轉換過程沒有異常資訊,則直接進入第3步。

3,通過反射呼叫validateXxx()方法,其中Xxx是即將處理使用者請求的處理邏輯所對應的方法名。

4,呼叫Action類裡的validate()方法。

5,如果經過上面4步都沒有出現fieldError,將呼叫Action裡處理使用者請求的處理方法;如果出現了fieldError,系統將轉入input邏輯檢視所指定的檢視資源。

2,Struts2的輸入校驗

1,最基礎的Struts2輸入校驗

Struts2中單獨對每一個Action指定一個校驗檔案,它的命名方式為<Action-name>-validation.xml。它存放在與Action相同的包中,校驗只需要配置一個校驗檔案即可實現。系統的其它地方不需要改動,系統會自動載入該檔案。校驗檔案RegistAction-validation.xml如下例:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<!-- 校驗檔案的根元素 -->
<validators>
<!-- 校驗Action的name屬性 -->
<field name="name">
   <!-- 指定name屬性必須滿足必填規則 -->
   <field-validator type="requiredstring">
    <!-- 校驗前去掉name屬性的前後空格 -->
    <param name="trim">true</param>
    <!-- 提示資訊 -->
    <message>必須輸入名字</message>
   </field-validator>
   <!-- 指定name屬性必須滿足匹配指定的正則表示式 -->
   <field-validator type="regex">
    <param name="expression"><![CDATA[(/w{4,25})]]></param>
    <message>您輸入的使用者名稱只能是字母和陣列,且長度必須在4到25之間</message>
   </field-validator>
</field>

<field name="pass">
   <field-validator type="requiredstring">
    <param name="trim">true</param>
    <message>必須輸入密碼</message>
   </field-validator>
   <field-validator type="regex">
    <param name="expression"><![CDATA[(/w{4,25})]]></param>
    <message>您輸入的密碼只能是字母和陣列,且長度必須在4到25之間</message>
   </field-validator>
</field>
<field name="age">
   <!-- 指定age屬性必須在指定的範圍內 -->
   <field-validator type="int">
    <param name="min">1</param>
    <param name="max">150</param>
    <message>年紀必須在1到150之間</message>
   </field-validator>

    </field>
<field name="birth">
   <!-- 指定age屬性必須在指定的範圍內 -->
   <field-validator type="date">
    <param name="min">1900-01-01</param>
    <param name="max">2050-02-21</param>
    <message>年紀必須在${min}到${max}之間</message>
   </field-validator>

</field>
</validators>

2,Struts2中輸入校驗提示資訊的國際化

在Struts2的校驗中應用國際化也非常簡單,請看如下xml配置程式碼: <field name="name">
   <field-validator type="requiredstring">
    <param name="trim">true</param>
   <message key="name.requried"/>
   </field-validator>
   <field-validator type="regex">
    <param name="expression"><![CDATA[(/w{4,25})]]></param>
  <message key="name.regex"/>
   </field-validator>
</field>

message元素指定key屬性指定的是國際化資源中對應的key。還可以使用以下配置獲取國際化資源中的資訊:<message>${getText("name.requried")}</message> 這種方式是通過呼叫ActionSupport類的getText()方法來獲取國際化資源的。

3,Struts2中應用客戶端輸入校驗

使用客戶端輸入校驗可以減輕伺服器的負擔。Struts2對客戶端的輸入校驗進行了封裝,使得我們開發時特別容易。

1,JSP頁面程式碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>註冊頁面</title>
</head>
<body>
<s:form action="regist" validate="true">
<s:textfield label="使用者名稱" name="name"></s:textfield>
<s:password label="密碼" name="pass"></s:password>
<s:textfield label="年齡" name="age"></s:textfield>
<s:textfield label="生日" name="birth"></s:textfield>
<s:submit></s:submit>
</s:form>
</body>
</html>

注意這裡要用Struts2的標籤,form的validate屬性要設定為true,並且不要將theme屬性指定為simple.(simple表示struts2將把這個解析成普通的HTML標籤)

2,校驗配置檔案:這裡的校驗配置檔案同原先的配置檔案並沒有不同,但是這裡使用<message key="name.requried"/>無法從全域性國際化資源中獲取資訊,只能使用<message>${getText("name.requried")}</message>方式獲取國際化資源。

3,部署後的JSP頁面程式碼:

大家可以看到部署後的JSP頁面中自動生成了我們在校驗配置檔案中對應的javascript程式碼。

<!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>註冊頁面</title>
</head>
<body>
<script src="/lovely/struts/xhtml/validation.js"></script>
  
<form namespace="" id="regist" name="regist" onsubmit="return validateForm_regist();"action="/lovely/regist.action" method="POST">
<table class="wwFormTable">
<tr>
    <td class="tdLabel"><label for="regist_name" class="label">使用者名稱:</label></td>
    <td
><input type="text" name="name" value="" id="regist_name"/>
</td>
</tr>

<tr>
    <td class="tdLabel"><label for="regist_pass" class="label">密碼:</label></td>
    <td
><input type="password" name="pass" id="regist_pass"/>
</td>
</tr>

<tr>
    <td class="tdLabel"><label for="regist_age" class="label">年齡:</label></td>
    <td
><input type="text" name="age" value="" id="regist_age"/>
</td>
</tr>

<tr>
    <td class="tdLabel"><label for="regist_birth" class="label">生日:</label></td>
    <td
><input type="text" name="birth" value="" id="regist_birth"/>
</td>
</tr>

<tr>
    <td colspan="2"><div align="right"><input type="submit" id="regist_0" value="Submit"/>
</div></td>
</tr>

</table></form>

<script type="text/javascript">
    function validateForm_regist() {
        form = document.getElementById("regist");
        clearErrorMessages(form);
        clearErrorLabels(form);

        var errors = false;
        // field name: name
        // validator name: requiredstring
        if (form.elements['name']) {
            field = form.elements['name'];
            var error = "必須輸入使用者名稱!";
            if (field.value != null && (field.value == "" || field.value.replace(/^/s+|/s+$/g,"").length == 0)) {
                addError(field, error);
                errors = true;
            }
        }
        // field name: name
        // validator name: regex
        if (form.elements['name']) {
            field = form.elements['name'];
            var error = "您輸入的使用者名稱只能是字母和陣列,且長度必須在4到25之間";
            if (field.value != null && !field.value.match("(
//w{4,25})")) {
                addError(field, error);
                errors = true;
            }
        }
        // field name: pass
        // validator name: requiredstring
        if (form.elements['pass']) {
            field = form.elements['pass'];
            var error = "必須輸入密碼";
            if (field.value != null && (field.value == "" || field.value.replace(/^/s+|/s+$/g,"").length == 0)) {
                addError(field, error);
                errors = true;
            }
        }
        // field name: pass
        // validator name: regex
        if (form.elements['pass']) {
            field = form.elements['pass'];
            var error = "您輸入的密碼只能是字母和陣列,且長度必須在4到25之間";
            if (field.value != null && !field.value.match("(
//w{4,25})")) {
                addError(field, error);
                errors = true;
            }
        }
        // field name: age
        // validator name: int
        if (form.elements['age']) {
            field = form.elements['age'];
            var error = "年紀必須在1到150之間";
            if (field.value != null) {
                if (parseInt(field.value) <
                     1 ||
                        parseInt(field.value) >
                           150) {
                    addError(field, error);
                    errors = true;
                }
            }
        }
        // field name: birth
        // validator name: date
        if (form.elements['birth']) {
            field = form.elements['birth'];
            var error = "年紀必須在00-1-1到50-2-21之間";
        }

        return !errors;
    }
</script>

</body>
</html>

從上面Struts2自動