1. 程式人生 > >Struts2學習總結(九):資料驗證

Struts2學習總結(九):資料驗證

在Struts2框架中,可以實現客戶端驗證和伺服器驗證;

伺服器驗證分為兩種方式:

  一,程式設計實現驗證 

    在之前的,已經對ActionSupport進行了瞭解。知道了ActionSupport類實現了Vaildateable介面,但對vaildate()方法的實現是一個空實現。在建立Action物件時,通過繼承ActionSupport類實現的,如果需要驗證資料的有效性時,直接重寫vaildate方法。

1.驗證流程:

   如果在一個Action類中編寫多個請求處理方法,而此重寫vaildate方法,在預設情況下,在執行每一個請求方法的過程中,都會經過validate()方法的驗證處理。驗證如果發生錯誤,可以根據錯誤的level選擇欄位級(fielderror)錯誤,還是動作級(actionerror)錯誤。並且可使用addFieldError或addActionError加入相應的錯誤資訊,如果存在Action或Field錯誤,Struts2 會返回“input”(<result name="input">xxx.jsp</result>)如果返回了“input”,Struts2 就不會再呼叫execute 方法了。如果不存在錯誤資訊,Struts2在最後會呼叫execute 方法。

2.新增錯誤資訊:

    addFieldError(String fieldName,String errorMessage),新增欄位的錯誤資訊
    addActionError(String anErrorMessage),新增與Action所處理業務相關的錯誤資訊
3.在頁面輸出結果:
  • <s:fielderror/>輸出一個或者所胡欄位的錯誤資訊
  • <s:actionerror/>輸出所有Action的錯誤資訊

 4.對Action指定的方法進行驗證:

      通過validateXxx()方法實現, validateXxx()只會校驗action中方法名為Xxx的方法。其中Xxx的第一個字母要大寫。當某個資料校驗失敗時,我們應該呼叫addFieldError()方法往系統的fieldErrors新增校驗失敗資訊(為了使用addFieldError()方法,action可以繼承ActionSupport ),如果系統的fieldErrors包含失敗資訊,struts2會將請求轉發到名為input的result。在input檢視中可以通過<s:fielderror/>顯示失敗資訊。

二,基於XML配置實現驗證(宣告式驗證)

1.驗證檔案的命名規則

        驗證檔案要遵循一定的命名規則,其驗證檔案的名稱必須為ActionName-validation.xml 或ActionName-AliasName-validation.xml的形式,ActionName為Action物件的名稱,AliasName為Action配置中的名稱,也就是struts.xml檔案中Action元素對應的name屬性的名稱。

    (1)  ActionName-validation.xml :

            以這個方式命名,資料的驗證會作用於整個Action物件,並驗證Action物件的請求業務處理流程。

           如果Action物件只存在單一的處理方法,或在多個請求處理方法中,驗證處理的規則都相同。可以用這個方式命名

    (2)ActionName-AliasName-validation.xml:

            如果一個Action物件包含多個請求處理方法,而又沒有必要對每一個方法進行驗證處理,只需要對Action物件中的特定方法進行處理,就可以用這種方法。

            與上一種方式進行比較,這種命名方式更加靈活。

2.編寫驗證檔案

(1)宣告式驗證程式可以分為兩類:

  •    欄位驗證:判斷某個欄位屬性的輸入是否有效。程式碼示例如下:
  </field>
    <field name="pass">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密碼不能為空</message>
        </field-validator>
    </field>
  •    非欄位驗證:不知針對某個欄位,而是針對多個欄位的輸入值之間的邏輯關係進行校驗。程式碼示例如下:
<field-validator type="fieldexpression">
			<param name="expression"><![CDATA[(pass==rpass)]]></param>
			<message>兩次輸入密碼不一致</message>
		</field-validator>

(2)使用一個宣告式驗證程式的步驟:

  •  確定哪些Action欄位需要驗證
  •  編寫一個驗證程式的配置檔案,命名方式就是上面講的兩種方式
  •  確定驗證失敗時的響應頁面:在struts.xml檔案中定義一個<result name="input">的元素
  •  顯示錯誤訊息: 表單使用非simple主題。則自動顯示錯誤訊息;使用的是simple主題,需要自動編寫顯示的錯誤訊息,s:filedErrors標籤或直接使用EL表達方式(使用OGNL)

3.Struts2框架自建的驗證程式:

  • required: 確保某給定欄位的值不是空值 null         “”
  • requiredstring: 確保某給定欄位的值既不是空值 null, 也不是空白. 
  • trim 引數. 預設為 true, 表示 struts 在驗證該欄位值之前先剔除前後空格. 
  • stringlength: 驗證一個非空的欄位值是不是有足夠的長度. 
  • minLength: 相關欄位的最小長度. 若沒有給出這個引數, 該欄位將沒有最小長度限制
  • maxLength:相關欄位的最大長度. 若沒有給出這個引數, 該欄位將沒有最大長度限制
  • trim: 在驗證之前是否去除前後空格
  • date: 確保某給定日期欄位的值落在一個給定的範圍 :max:相關欄位的最大值. 若沒給出這個引數, 該欄位將沒有最大值限制;min:相關欄位的最小值. 若沒給出這個引數, 該欄位將沒有最小值限制
  • email: 檢查給定 String 值是否是一個合法的 email
  • url: 檢查給定 String 值是否是一個合法的 url
  • regex: 檢查某給定欄位的值是否與一個給定的正則表示式模式相匹配. 
  • expresssion*: 用來匹配的正則表示式
  • caseSensitive: 是否區分字母的大小寫. 預設為 true
  • trim: 是否去除前後空格. 預設為 true
  • int: 檢查給定整數字段值是否在某一個範圍:min: 相關欄位的最小值. 若沒給出這個引數, 該欄位將沒有最小值限制;max: 相關欄位的最大值. 若沒給出這個引數, 該欄位將沒有最大值限制
  • conversion: 檢查對給定 Action 屬性進行的型別轉換是否會導致一個轉換錯誤. 該驗證程式還可以在預設的型別轉換訊息的基礎上新增一條自定義的訊息
  • expression 和 fieldexpression: 用來驗證給定欄位是否滿足一個 OGNL 表示式. 
        前者是一個非欄位驗證程式, 後者是一個欄位驗證程式. 
        前者在驗證失敗時將生成一個 action 錯誤, 而後者在驗證失敗時會生成一個欄位錯誤

實現空表單資訊的提示:

1.先建立一個Strust2框架的工程,並配置好所需要的包到WEB-INF/lib下

2.Web.xml配置Struts2框架的過濾器

3.編寫一個Action(ZhuceAction)繼承ActionSupport

package action;

import com.opensymphony.xwork2.ActionSupport;

public class ZhuceAction extends ActionSupport{
    private String name;
    private String pass;
    private String repass;
    private int age;
    private String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public String getPass() {
        return pass;
    }

    public String getRepass() {
        return repass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public void setRepass(String repass) {
        this.repass = repass;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
}

編寫驗證檔案Zhuce-validation.xml (要注入引入dtd檔案的寫法)
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>使用者名稱不能為空</message>
        </field-validator>
    </field>
    <field name="pass">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密碼不能為空</message>
        </field-validator>
    </field>
    <field name="repass">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>確認密碼不能為空</message>
        </field-validator>
        <field-validator type="fieldexpression">
            <param name="expression"><![CDATA[(pass==rpass)]]></param>
            <message>兩次輸入密碼不一致</message>
        </field-validator>
    </field>
    <field name="phone">
        <field-validator type="requiredstring">

            <message>電話不能為空</message>
        </field-validator>

    </field>
</validators>


jsp檔案程式碼如下:
<%@ taglib prefix="s" uri="/struts-tags" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>註冊驗證</title>
  </head>
  <body>
     <h1>請輸入你的註冊資訊</h1>
     <s:form action="zhuce">
       <s:textfield label="姓名" name="name"/>
       <s:password label="密碼" name="pass"/>
       <s:password label="確認密碼" name="repass"/>
       <s:textfield label="年齡" name="age"/>
       <s:textfield label="電話" name="phone"/>
       <s:submit value="提交"/>
     </s:form>
  </body>
</html>

在輸入出錯時,出現資訊提示。截圖: