輸入校驗

在Struts2中,可以對Action的所有方法進行校驗或者對Action的指定方法進行校驗。

對于輸入校驗Struts2提供了兩種實現方法:
1、采用手工編寫代碼實現
2、基于xml配置方式實現


一、手工編寫代碼

1、實現對action中的所有方法輸入校驗

主要通過重寫validate()方法實現,validate()方法會校驗action中所有與execute方法簽名相同的方法。當某個數據校驗失敗時,我們應該調用addFieldError()方法往系統添加校驗失敗信息(為了使用addFieldError()方法,actio可以繼承ActionSupport),如果系統的fieldErrors包含失敗星系,Struts2會將請求轉發至input的result。在input的視圖可以通過<s:fielderror/>顯示校驗失敗信息。

實現代碼如下:
struts.xml

<package name="vadicate" namespace="/vadicate" extends="struts-default">
    <action name="testVadicate_*" class="cn.itcast.action.TestVadicate" method="{1}">
            <result name="success">/WEB-INF/logon.jsp</result>
            <result name="input">/WEB-INF/index.jsp</result>
    </action>
    
    <action name="index">
        <result name="success">/WEB-INF/index.jsp</result>
    </action>
    </package>

具體的Action:

public class TestVadicate extends ActionSupport {
    private static final long serialVersionUID = -2811237247567867172L;
    private String username;
    private String mobile;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getMobile() {
        return mobile;
    }

    public void setMobile(String mobile) {
        this.mobile = mobile;
    }

    @Override
    public void validate() {
        if (username == null || "".equals(username.trim())) {
            this.addFieldError("username", "用戶名不可以為空");
        }
        if (mobile == null || "".equals(mobile.trim())) {
            this.addFieldError("mobile", "手機號不可以為空");
        } else {
            if (!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile.trim()).matches()) {
                this.addFieldError("mobile", "手機號格式錯誤");
            }
        }
    }

    public String login() {
        
        return "success";
    }

}

兩個對應的jsp:
index.jsp

<form method="post" action="${pageContext.request.contextPath}/vadicate/testVadicate_login">
    姓名:<input type="text" name="username"><br>
    手機號:<input type="text" name="mobile"><br>
    <input type="submit" value="提交"/>
    </form>

logon.jsp:

<body>
驗證成功
</body>
2、手工編寫代碼實現對action指定方法進行輸入校驗

1、通過vadicateXxx()方法實現,vadicateXxx()只會校驗ation中方法名為Xxxx的方法,其中Xxxx的第一個字母要大寫。當某個數據校驗失敗時,我們應該調用addFieldError()方法往系統的fieldError添加校驗失敗信息。(為了使用了addFieldError()方法,action可以繼承Actionupport),如果系統的fieldErrors包含失敗信息,Struts2會將請求轉發到名為input的result,在input視圖中可以通過<s:fielderror/>顯示失敗信息。
例如:

public void validateLogin() {
        if (username == null || "".equals(username.trim())) {
            this.addFieldError("username", "用戶名不可以為空");
        }
        if (mobile == null || "".equals(mobile.trim())) {
            this.addFieldError("mobile", "手機號不可以為空");
        } else {
            if (!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile.trim()).matches()) {
                this.addFieldError("mobile", "手機號格式錯誤");
            }
        }
    }

    public String login() {
        
        return "success";
    }

3、手工代碼輸入校驗的流程

1、類型轉換器對請求參數執行類型轉換,并把轉換后的值賦值給action中的屬性。
2、如果在執行類型轉換的過程中出現異常,系統會將異常信息保存的ActionContext中,conversionError攔截器會將異常信息添加到fieldErrors里。不管轉換類型是否出現異常,都會進入第三步。
3、系統通過反射技術先調用action中的validateXxx()方法,Xxxx為方法名。
4、再調用action中的validate()方法。
5、經過上面4步,如果系統中的fieldErrors存在錯誤信息(即存在錯誤信息的集合的size大于0)系統自動 將請求轉發至名稱為input的的視圖,如果系統中的fieldErrors沒有任何錯誤信息,系統將自動執行action中的處理方法。

二、基于XML配置方式

1、實現對action的所有方法進行輸入校驗

使用XML配置方式實現輸入校驗時,Action也需要繼承ActionSupport,并且提供校驗文件和action類放在同一個包下,文件的取格式為:ActionClassName-validation.xml,其中該文件ActionClassName為action的簡單類名,-validation.xml為固定的寫法。
<field>指定action中要校驗的屬性,<field-validator>指定校驗器,上面指定的校驗器requiredstring由系統提供,系統提供了滿足大部分驗證需求的校驗器,這些校驗器可以在xwork-2.xxx.jar中的com.opensymphony.xwork2.validator.validators下的default.xml中找到。
<message>為校驗失敗后的提示信息,如果需要國際化,可以為message指定key屬性,key的值為資源文件中的key。在這個校驗文件中,對action中的字符串類型額username屬性進行驗證,首先要求調用trim()方法去掉空格,然后判斷用戶是否為空。
具體如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用戶名不能為空!</message>
        </field-validator>
    </field>
    <field name="mobile">
        <field-validator type="requiredstring">
            <message>手機號不能為空!</message>
        </field-validator>
        <field-validator type="regex">
             <param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
             <message>手機號格式不正確!</message>
        </field-validator>
    </field>
</validators>

**注意使用xml文件進行校驗時也是需要配置input視圖的~

系統提供的校驗器:
required(必填校驗器,field的值不能為空)
requiredstring(必填字符校驗器,要求field的值不能為努力,并且長度大于0,默認情況下,會對字符串去前后空格)
stringlength(字符串產股校驗器,要求field的值必須在指定的范圍內,否則校驗校驗失敗,minLength參數指定最小長度,maxLength參數指定最大長度,trim參數指定校驗field之前是否取出字符串前后的空格)
regex(正則表達式校驗器,檢查被校驗的field是否匹配一個正則表達式expression參數指定正則表達式,caseSensitive參數指定正則表達式匹配是我,是否區分大小寫,默認值為true)
int(整數校驗器,要求field的整數值必須在指定的范圍內,min指定最小值,max指定最大值)
double(雙精度浮點校驗器,要求field的雙精度浮點數必須在指定的范圍,min指定最小值,max指定最大值)
fieldexpression(字段ognl表達式校驗器,要求field滿足一個ognl表達式,expression參數指定ognl表達式。該邏輯表達式基于ValueStack進行求值,返回true時校驗通過,否則不通過)
email(郵件地址校驗器,要求如果filed的值非空,則必須是合法的郵件地址)
url(網址校驗器,要求如果filed的值非空,則必須是合法的網址)
date(日期校驗器,要求field的日期必須在指定范圍內,min指定最小值,max指定最大值)
conversion(轉換校驗器,指定在類型轉換失敗時,提示錯誤信息)
visitor(用于校驗action中的符合屬性,它指定一個校驗文件用于校驗復合屬性中的屬性)
expression(OGNL表達式校驗器,expression參數指定OGNL表達式,該邏輯表達式基于ValueStack進行求值,返回true值時校驗通過,否則不通過,該校驗器不可用在字段校驗器風格的配置中)

2、基于xml文件配置方式對指定的action方法實現校驗

當校驗文件的取名為ActionClassName-validation.x
ml
時,會對action中的所有處理方法實施輸入驗證。如果你只需要對Action中的某一個action方法進行驗證,可以改名為ActionClassName-ActionName-validation.xml
其中ActionName為struts.xml的名稱。

3、基于xml文件進行校驗的一些特點
當為某個action提供了ActionClassName-validation.x
ml和ActionClassName-ActionName-validation.xml兩種規則的校驗文件時2,系統按下面的順序尋找校驗文件:;
1、ActionClassName-validation.x
ml
2、ActionClassName-ActionName-validation.xml
系統找到第一個校驗文件時還會繼續搜索后面的校驗文件,當搜索到所有校驗文件時,會把校驗文件里的所有校驗規則匯總后,然后全部應用于action方法的校驗。如果兩個校驗文件中指定的校驗規則沖突時,則只使用后面文件中的校驗規則。
當action繼承了另外一個action,父類action的校驗文件會被搜索到。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,881評論 18 139
  • 標簽 如果要配置的標簽,那么必須要先配置標簽,代表的包的概念。 包含的屬性 name包的名稱,要求是唯一的,管理a...
    偷偷得路過閱讀 1,394評論 0 0
  • Struts2 輸入校驗 Struts2 的表單輸入校驗有多種方法。 重寫 ActionSupport 類的 va...
    藝龍閱讀 147評論 0 0
  • 在表現層的數據處理方面主要分為兩種類型,一種是類型轉換,這點我們上篇已經簡單介紹過,另外一種則是我們本篇文章將要介...
    Single_YAM閱讀 624評論 1 7
  • 1. validate 輸入校驗方式 在Web系統項目中有大量的視圖頁面需要用戶自行輸入很多數據。這些數據的類型有...
    Ystrator閱讀 322評論 0 1