Struts 2的輸入校驗(一)

9 Struts 2的輸入校驗

輸入校驗有兩種:客戶端和服務器端校驗。客戶端校驗一般是通過JavaScript來完成,這種校驗可減輕服務器壓力。服務器校驗主要通過服務器端編程的方式來完成。

(1) 客戶端校驗

客戶端校驗一般是通過JavaScript來完成,這種校驗可減輕服務器壓力。

(2) 服務器端校驗

有了客戶端驗證爲何還要服務器端驗證? —— 爲了防止客戶端驗證失敗。

服務器端驗證一般是通過後臺的硬編碼Servlet來實現的。

9.1 Struts 2中手工實現輸入校驗

Struts 2中最底層、最原始的數據校驗方法——手工實現數據校驗。

(1) 重寫validate方法校驗單個處理邏輯

重寫ActionSupport類的validate方法校驗單個處理邏輯,如下Action中重寫validate的代碼:

/** Struts2手工驗證:實現ActionSupport類的validate方法

* 先執行到validate方法,再執行到execute方法*/

@Override

publicvoid validate() {

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user", "user name is not null!");

//addFieldError添加錯誤信息,在JSP頁面中用<s:fielderror>標記取出

}else{

Pattern p = Pattern.compile("\\w{6,20}");

Matcher m = p.matcher(user.getName().trim());

if(m.matches()==false){

this.addFieldError("user","用戶名必須是字母數字下劃線6-20個字符!");}}}

JSP頁面顯示錯誤信息的代碼:

<!--<s:fielderror>標記用來顯示Action中的addFieldError方法封裝的錯誤信息  -->

<s:fielderror></s:fielderror>

(2) 重寫validateXX方法校驗多個處理邏輯

多個表單對應一個Action可以減少類的數量。

在同一個Action類中添加validateXX方法可實現同一個Action中對不同表單的校驗

Action示例:

publicclass OneAction extends ActionSupport{

/** * 多個表單對應一個Action類:重寫validateXX方法 */

privatestaticfinallongserialVersionUID = 1L;

private User user;//領域對象,在JSP頁面中用user.name來獲取name

get/set方法

@Override

public String execute() throws Exception {

returnsuper.execute();

}

public String login(){

returnSUCCESS;

}

public String reg(){

returnSUCCESS;

}

/**

* 添加validateXX方法,在同一個Action中實現對不同的表單的校驗

*/

publicvoid validateReg(){//對reg的方法進行校驗

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user","用戶名不能爲空");

}

}

publicvoid validateLogin(){//對login方法校驗

if(!"admin".equals(user.getName())||!"000".equals(user.getPass())){this.addFieldError("user","用戶名或密碼錯誤");

}}}

Action類中:this.addFieldError("user","用戶名或密碼錯誤");

將錯誤信息添加到fielderror中,在JSP中用s:fielderror來顯示。

s:fielderror標記,用來顯示Action頁面中添加進去的錯誤信息:

在Action類中寫法:this.addFieldError("user","用戶名不能爲空");

<s:fielderror></s:fielderror>

9.2 基於Struts 2驗證框架的輸入校驗

Struts 2提供了更高效,簡易的校驗框架,用戶只需設置校驗配置文件即可完成輸入校驗。基於驗證框架來完成輸入校驗,只需在與Action同目錄下下創建一個xml格式的驗證文件即可,而無需validate方法。

實現了Action類與配置文件的分離,在配置文件中實現對Action類中某字段的校驗。

(1) 編輯校驗規則文件

校驗文件是XML格式,命名規則:<Action類名>-validation.xml ,每一個Action都可以對應有一個這樣的校驗配置文件,用來對當前Action進行校驗。

field用來指定Action中要校驗的屬性字段,屬性字段名稱應該與field的name屬性值相同 ,在field中一般添加field-validator標記,用來指定驗證規則(是否爲空規則、字符組成規則)param用來指定正則表達式,message指定不符合規則的錯誤提示信息。

<Action>-validation.xml文件示例:

(2) 字段校驗和非字段校驗:

<validators>

<!-- 字段校驗field -->

<fieldname="name">

<field-validatortype="requiredstring">

//requiredstring指的是必填字符串校驗器 ,也就是說校驗規則是必填字符串校驗器

<paramname="trim">true</param>

<message>必須輸入用戶名!!!</message>

</field-validator>

<field-validatortype="regex">

<paramname="expression"><![CDATA[(\w{4,25})]]></param>

<message>用戶名只能是字母和數字,且長度在4-25之間</message>

</field-validator>

</field>

<!-- 非字段校驗 validator-->

<validatortype="校驗器名稱">

<paramname="fieldName">要被校驗的字段</param>

<paramname="參數名">參數值</param>

<message>校驗錯誤提示信息</message>

</validator>

</validators>

字段校驗和非字段校驗可混合在同一個XX-validation.xml文件中,但是有順序:所有非字段優於字段,非字段先校驗,若某個字段的非字段校驗失敗,則字段方式校驗都不執行,反之,字段校驗卻不會影響非字段。

(3) 配置校驗文件

XX-validation.xml校驗文件示例:

<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphony Group//XWork Validator 1.0.2//EN"

"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>

//字段校驗field

<fieldname="password">

<field-validatortype="requiredstring">

<messagekey="error.password.required"/>

</field-validator>

<field-validatortype="stringlength">

<paramname="trim">true</param>

<paramname="minLength">4</param>

<paramname="maxLength">10</param>

<messagekey="errors.range"/>

</field-validator>

</field>

<fieldname="password2">

<field-validatortype="requiredstring">

<messagekey="error.password2.required"/>

</field-validator>

</field>

//非字段校驗validator

<validatortype="expression">

<paramname="expression">password eq password2</param>

<messagekey="error.password.match"/>

</validator>

</validators>

配置中的兩個問題:

一、驗證器名稱

xwork-2.0.4.jar 包中/com/opensymphony/xwork2/validator/validators 路徑下default.xml文件中有所有 Struts2 自帶的輸入校驗器定義

分爲以下幾種:

1.required必填

2.requiredstring必填字符串

3.int整數

4.long

5.short

6.double

7.date日期

8.expression

9.fieldexpression字段表達式

10.email郵件地址

11.url網址

12.visitor

13.conversion

14.stringlength字符串長度

15.regex正則表達式

16.conditionalvisitor

二、用於輸出的提示信息用一個key來表示

message標籤的key屬性,其實是在一個用戶自定義的資源文件中提前定義好了的,方便實現國際化。

***用法:

首先自定義一個資源文件errorMsgs.properties

然後,將該資源文件在struts.xml中進行配置:

<constantname="struts.custom.i18n.resources"value="errorMsgs"></constant>

最後纔可以在驗證文件中使用:

<fieldname="pass">

<field-validatortype="requiredstring">

<paramname="trim">true</param>

<messagekey="pass.required"/>

</field-validator>

</field>

9.3 使用客戶端校驗

Struts2要完成客戶端校驗,視圖頁面就必須使用Struts2標籤庫。然後在<s:form>標籤中添加validate=true屬性即可。formtheme不能是simple

<s:formaction="validateAction"validate="true"></s:form>

其他任何文件不作改動,查看頁面源碼發現多了兩個JS文件,但效果並無太大區別。

<script type="text/javascript" src="/Struts2_Validate_ByFrame/struts/xhtml/validation.js"></script>

<script type="text/javascript" src="/Struts2_Validate_ByFrame/struts/utils.js"></script>

9 Struts 2的輸入校驗

輸入校驗有兩種:客戶端和服務器端校驗。客戶端校驗一般是通過JavaScript來完成,這種校驗可減輕服務器壓力。服務器校驗主要通過服務器端編程的方式來完成。

(1) 客戶端校驗

客戶端校驗一般是通過JavaScript來完成,這種校驗可減輕服務器壓力。

(2) 服務器端校驗

有了客戶端驗證爲何還要服務器端驗證? —— 爲了防止客戶端驗證失敗。

服務器端驗證一般是通過後臺的硬編碼Servlet來實現的。

9.1 Struts 2中手工實現輸入校驗

Struts 2中最底層、最原始的數據校驗方法——手工實現數據校驗。

(1) 重寫validate方法校驗單個處理邏輯

重寫ActionSupport類的validate方法校驗單個處理邏輯,如下Action中重寫validate的代碼:

/** Struts2手工驗證:實現ActionSupport類的validate方法

* 先執行到validate方法,再執行到execute方法*/

@Override

publicvoid validate() {

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user", "user name is not null!");

//addFieldError添加錯誤信息,在JSP頁面中用<s:fielderror>標記取出

}else{

Pattern p = Pattern.compile("\\w{6,20}");

Matcher m = p.matcher(user.getName().trim());

if(m.matches()==false){

this.addFieldError("user","用戶名必須是字母數字下劃線6-20個字符!");}}}

JSP頁面顯示錯誤信息的代碼:

<!--<s:fielderror>標記用來顯示Action中的addFieldError方法封裝的錯誤信息  -->

<s:fielderror></s:fielderror>

(2) 重寫validateXX方法校驗多個處理邏輯

多個表單對應一個Action可以減少類的數量。

在同一個Action類中添加validateXX方法可實現同一個Action中對不同表單的校驗

Action示例:

publicclass OneAction extends ActionSupport{

/** * 多個表單對應一個Action類:重寫validateXX方法 */

privatestaticfinallongserialVersionUID = 1L;

private User user;//領域對象,在JSP頁面中用user.name來獲取name

get/set方法

@Override

public String execute() throws Exception {

returnsuper.execute();

}

public String login(){

returnSUCCESS;

}

public String reg(){

returnSUCCESS;

}

/**

* 添加validateXX方法,在同一個Action中實現對不同的表單的校驗

*/

publicvoid validateReg(){//對reg的方法進行校驗

if(user.getName()==null||"".equals(user.getName().trim())){

this.addFieldError("user","用戶名不能爲空");

}

}

publicvoid validateLogin(){//對login方法校驗

if(!"admin".equals(user.getName())||!"000".equals(user.getPass())){this.addFieldError("user","用戶名或密碼錯誤");

}}}

Action類中:this.addFieldError("user","用戶名或密碼錯誤");

將錯誤信息添加到fielderror中,在JSP中用s:fielderror來顯示。

s:fielderror標記,用來顯示Action頁面中添加進去的錯誤信息:

在Action類中寫法:this.addFieldError("user","用戶名不能爲空");

<s:fielderror></s:fielderror>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章