<s:fielderror />
<s:form id="loginForm" name="loginForm" method="post" namespace="/validate" action="validateAction_login.action" theme="simple">
用戶名: <s:textfield name="username" /><br>
密 碼: <s:textfield name="password" /><br>
年 齡: <s:textfield name="age" /><br>
<s:submit value="login" /><br>
</s:form>
2. 定義校驗(yàn)規(guī)則:
用戶名不能為null, 或者空字符串;
密碼不能為null或者空字符串, 密碼中只能包含[0-9a-zA-Z], 不能存在非法字符, 且長度在6-8位之間;
年齡必須為整型, 且不能為負(fù)數(shù).
采用基本驗(yàn)證的方式校驗(yàn)表單
1. 創(chuàng)建ValidateAction類, 繼承ActionSupport并實(shí)現(xiàn)Validateable接口.
public class ValidateAction extends ActionSupport implements Validateable {
private String username;
private String password;
private Integer age;
public String login() {
return "success";
}
@Override
public void validate() {
if (username == null || "".equals(username.trim())) {
this.addFieldError("username", "用戶名不能為空");
}
if (password == null || "".equals(password.trim())) {
this.addFieldError("password", "密碼不能為空");
} else if (!password.matches("[0-9a-zA-Z]{6, 8}")) {
this.addFieldError("password", "密碼的長度應(yīng)該在6-8位之間");
}
if (age < 0 ) {
this.addFieldError("age", "年齡不能為負(fù)數(shù)");
}
}
// 省略getter和setter方法
}
validate()方法在業(yè)務(wù)方法之前執(zhí)行. 通過查看底層源代碼可以獲知, this.addFieldError(String fieldName, String errorMessage)方法最終將在ValidationAwareSupport類的fieldErrors成員中添加一條記錄 (fieldErrors是一個(gè)Map<String, List<String>>集合). validate()方法執(zhí)行完成之后, 如果fieldErrors集合中不包含錯(cuò)誤信息, 表示校驗(yàn)通過, 接下來將執(zhí)行l(wèi)ogin方法. 否則表示校驗(yàn)沒有通過, 不再執(zhí)行l(wèi)ogin()方法.
默認(rèn)情況下, validate()方法將對所有的業(yè)務(wù)方法進(jìn)行驗(yàn)證, 如果只想驗(yàn)證login()方法, 將validate()改名為validateLogin()即可.
2. 配置ValidateAction:
<action name="validateAction_*" class="cn.xing.validate.ValidateAction" method="{1}">
<result name="success">/validate/success.jsp</result>
<result name="input">/validate/login.jsp</result>
</action>
表單校驗(yàn)的執(zhí)行流程
1. 類型轉(zhuǎn)換器對請求參數(shù)執(zhí)行類型轉(zhuǎn)換, 并把轉(zhuǎn)換后的值賦給action中的屬性.
2. 如果在執(zhí)行類型轉(zhuǎn)換的過程中出現(xiàn)異常, 系統(tǒng)會將異常信息保存到ActionContext, conversionError攔截器將異常信息封裝到fieldErrors里, 然后執(zhí)行第3步. 如果類型轉(zhuǎn)換沒有出現(xiàn)異常, 則直接進(jìn)入第3步.
3. 系統(tǒng)通過反射技術(shù)調(diào)用action中的validateXxx()方法, Xxx為方法名.
4. 調(diào)用action中的validate()方法.
5. 經(jīng)過上面4步, 如果系統(tǒng)中的fieldErrors存在錯(cuò)誤信息(即存放錯(cuò)誤信息的集合的size大于0), 系統(tǒng)自動(dòng)將請求轉(zhuǎn)發(fā)至名稱為input的視圖. 如果系統(tǒng)中的fieldErrors沒有任何錯(cuò)誤信息, 系統(tǒng)將執(zhí)行action中的業(yè)務(wù)方法.
基于XML配置方式實(shí)現(xiàn)輸入校驗(yàn)
1. 創(chuàng)建Action類, 繼承ActionSupport或?qū)崿F(xiàn)Validateable接口:
public class ValidateXmlAction extends ActionSupport implements Validateable {
private String username;
private String password;
private Integer age;
public String login() {
System.out.println("login");
return "success";
}
// 省略getter和setter方法
}
2. 配置ValidateXmlAction:
<action name="validateXmlAction_*" class="cn.xing.validate.ValidateXmlAction" method="{1}">
<result name="success">/validate/success.jsp</result>
<result name="input">/validate/loginxml.jsp</result>
</action>
3. 在ValidateXmlAction的同級目錄中創(chuàng)建用于校驗(yàn)表單的xml文件, 文件名為ValidateXmlAction-validation.xml(用于校驗(yàn)表單的xml文件的文件名規(guī)定為ActionClassName- validation.xml):
<?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:表示驗(yàn)證的字段名稱, 對應(yīng)的值是訪問的action中的屬性. 這里是ValidateXmlAction中的username屬性
-->
<field name="username">
<!--
field-validator表示字段校驗(yàn)器, type屬性指定使用的校驗(yàn)規(guī)則
-->
<field-validator type="requiredstring">
<!-- 調(diào)用RequiredStringValidator中setTrim(true) -->
<param name="trim">true</param>
<!-- 給出錯(cuò)誤提示信息 -->
<message><![CDATA[用戶名不能為空!!!]]></message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message><![CDATA[密碼不能為空!!!]]></message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^[a-zA-Z0-9]+$]]></param>
<message><![CDATA[密碼中不能包含非法字符]]></message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^[a-zA-Z0-9]{6,8}$]]></param>
<message><![CDATA[密碼的長度應(yīng)該在6-8位之間]]></message>
</field-validator>
</field>
<field name="age">
<field-validator type="ageValidate">
<message><![CDATA[年齡不能為負(fù)數(shù)!!!]]></message>
</field-validator>
</field>
</validators><span style="white-space: normal; background-color: #ffffff;"> </span>
4. 上述xml文件中使用名稱為ageValidate的校驗(yàn)規(guī)則對age字段進(jìn)行校驗(yàn). ageValidate是一個(gè)自定義的校驗(yàn)規(guī)則.
自定義校驗(yàn)規(guī)則首先需要?jiǎng)?chuàng)建一個(gè)類, 繼承FieldValidatorSupport類:
public class AgeValidate extends FieldValidatorSupport {
/**
* @param object: 是Action對象, 其中封裝了待驗(yàn)證的字段. 此例中object為ValidateXmlAction對象
*/
public void validate(Object object) throws ValidationException {
// 獲取需要驗(yàn)證的字段的名稱
String fielsName = this.getFieldName();
// 獲取該字段的值
Object value = this.getFieldValue(fielsName, object);
// 判斷表單提交的該字段的值是否為整型
if (value instanceof Integer) {
Integer ivalue = (Integer) value;
if (ivalue < 0) {
// 增加錯(cuò)誤信息到fieldError集合中
this.addFieldError(fielsName, object);
}
}
}
}
接下來需要注冊上述自定義的校驗(yàn)規(guī)則. 在src下創(chuàng)建 validators.xml文件(文件名稱固定):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<!-- 注冊自定義的驗(yàn)證器 -->
<validator name="ageValidate" class="cn.xing.validate.AgeValidate"></validator>
</validators>
5. 默認(rèn)情況下將對Action中的所有業(yè)務(wù)方法進(jìn)行校驗(yàn). 如果只想對Action中的某個(gè)業(yè)務(wù)方法進(jìn)行校驗(yàn), 可以將用于校驗(yàn)的xml文件命名為ActionClassName-ActionName_methodName-validation.xml. 本例中只對login()方法進(jìn)行校驗(yàn), 只需將ValidateXmlAction-validation.xml文件更名為ValidateXmlAction- validateXmlAction_login-validation.xml即可.
posted on 2011-11-21 09:55
墻頭草 閱讀(1355)
評論(1) 編輯 收藏