在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的校驗文件會被搜索到。