文:阿蜜果
日期:2008-1-2——1-3
1. 文件結構
validation.xml文件的文檔結構是由validator_1_1_3.dtd文件定義,其文件頭部內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
其頂層元素為:<form-validation>,它包含<formset>和<global>子元素。一般只需要定義<formset>元素,<formset>元素定義格式如下:
<formset>
<constant></constant>
<form></form>
</formset>
其中<constant />為可選子元素,而<form />子元素至少需要出現一次。<form />子元素的定義格式如下:
<form name="">
<field property=""></field>
..............
<field property="" depends="" page="" indexedListProperty=""></field>
</form>
其中屬性描述如下:
l name:指定了表單的名字與配置文件中的form-bean的name相同;
l field:對應表單中驗證的字段;
l property:對應ActionForm的屬性;
l depends:指定驗證規則,例如:required、maxlength等;
l page:ActionForm若是跨頁表單,則與表單中的page屬性對應。
2. <field>子元素配置舉例
2.1 必填(或非空)驗證
非空驗證的depends屬性值為required,配置舉例如下:
<form name="UserForm">
<field property="loginName" depends="required">
<arg0 key="UserForm.loginName" />
</field>
<field property="name" depends="required">
<arg0 key="UserForm.name" />
</field>
<field property="password" depends="required">
<arg0 key="UserForm.password" />
</field>
</form>
其中<arg0 key="UserForm.password" />中的key跟資源文件中的鍵對應。
注意:為了使默認的驗證產生正確的信息,開發人員還需要在資源文件中添加errors.required等默認的錯誤信息,具體操作時,開發人員可在簡體中文的資源文件:ApplicationResources_zh_CN.properties.bak中添加如下信息:
errors.required = {0}不能為空
errors.maxlength = {0}長度不能大于{1}個字符
errors. minlength = {0}長度不能小于{1}個字符
errors.short = {0}必須是一個整數
errors.integer = {0}必須是一個整數
errors.long={0}必須是一個整數
errors.float={0}必須是一個浮點數
errors.double ={0}必須是一個雙精度型
errors.date={0}必須是一個日期
errors.range = {0}必須是 {1} 到 {2}之間的整數
errors.creditcard={0}必須是一個有效的信用卡號碼
errors.email = {0}是無效e-mail地址
在英文資源文件ApplicaitonResources.properties中添加如下內容:
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
2.2 最大長度和最小長度驗證
可在<field>元素的depends屬性中添加maxlength和minlength來限制對于那個字段的最大長度和最小長度,使用舉例如下:
<field property="password" depends = "required, maxlength, minlength">
<arg0 key = "UserForm.password"/>
<var>
<var-name>maxlength</var-name>
<var-value>12</var-value>
</var>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>
2.3 Email驗證
在Struts中還可以添加email驗證,此時depends為email,使用舉例如下:
<field property="email" depends="required, email">
<arg0 key="UserForm.email" />
</field>
2.4 日期驗證
在Struts中還可以添加日期驗證,此時depends為date,使用舉例如下:
<field property="begintime" depends="date">
<arg0 key="HistoryForm.begintime" />
</field>
2.5 整數范圍驗證
在Struts中還提供了驗證整數是否在某個范圍之間,例如下述的例子驗證整數是否在1到9999之間,配置如下:
<field property="score" depends="intRange">
<arg0 key="TestForm.score" />
<arg1 name="intRange" key="${var:min}" resource="false" />
<var>
<var-name>min</var-name>
<var-value>1</var-value>
</var>
<arg2 name="intRange" key="${var:max}" resource="false" />
<var>
<var-name>max</var-name>
<var-value>99999</var-value>
</var>
</field>
2.6 自定義驗證
在Struts中的驗證機制提供了擴展,開發人員可以添加自定義的驗證規則,例如可添加文件類型的驗證。此時需要編寫的Java類、在validator-rules.xml添加該驗證規則以及添加驗證的js。
自定義驗證的Java類CustomValidator的代碼如下所示:
package com.amigo.struts.validation;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;
/**
* Struts自定義驗證類.
*/
public class CustomValidator {
/**
* 判斷文件類型
*/
public static boolean validateFileType(Object bean, ValidatorAction va,
Field field, ActionMessages errors, Validator validator,
HttpServletRequest request) {
String value = ValidatorUtils.getValueAsString(bean, field
.getProperty());
String inputType = value.substring(value.lastIndexOf('.'));
String type[] = field.getVarValue("fileTypeProperty").split(";");
if (!GenericValidator.isBlankOrNull(value)) {
try {
boolean judge = false;
for (int i = 0; i < type.length; i++) {
Pattern p = Pattern.compile(type[i],
Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(inputType);
judge = m.matches();
if (judge) {
break;
}
}
if (!judge) {
errors.add(field.getKey(), Resources.getActionMessage(
validator, request, va, field));
return false;
}
} catch (Exception e) {
errors.add(field.getKey(), Resources.getActionMessage(
validator, request, va, field));
return false;
}
}
return true;
}
}
接著還需要在validator-rules.xml這個驗證規則文件中添加如下內容:
<!-- 判斷文件類型-->
<validator name="fileType" classname="com.cotel.comm.EarlyValidator" method="validateFileType"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
msg="errors.fileType">
<javascript>
<![CDATA[
function validateFileType(form) {
var isValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
var formName = form.getAttributeNode("name");
oFileType = eval('new ' + formName.value + '_fileType()');
for (x in oFileType) {
var field = form[oFileType[x][0]];
if ((field.type == 'hidden' ||
field.type == 'text' ||
field.type == 'file' ||
field.type == 'textarea') &&
field.disabled == false) {
var iMax =oFileType[x][2]("fileTypeProperty").split(";");
var index = field.value.lastIndexOf(".");
var length = field.value.length;
var fileType= field.value.substring(index, length);
var judege=false;
if(length>0 && fileType!=""){
for (var j = 0; j < iMax.length; j++) {
if (iMax[j].toLowerCase() == fileType.toLowerCase()) {
judege = true;
break;
}
}
if (!judege) {
if (i == 0) {
focusField = field;
}
fields[i++] = oFileType[x][1];
isValid = false;
}
}
}
}
if (fields.length > 0) {
focusField.focus();
alert(fields.join('"n'));
}
return isValid;
}
]]>
</javascript>
</validator>
利用上面這個自定義的驗證可以驗證文件的類型,在下面的例子中驗證文件的類型是否為jpg的,舉例如下:
<field property="picPath" depends="required,fileType">
<arg0 key="TestForm.picPath" />
<var>
<var-name>fileTypeProperty</var-name>
<var-value>.jpg</var-value>
</var>
</field>
3. 完整配置實例
本小節舉一個validation.xml配置的完整例子,本例匯總,對兩個表單添加了驗證規則。內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="UserinfoForm">
<field property="email" depends="email">
<arg0 key="UserinfoForm.email" />
</field>
<field property="mobile" depends="required">
<arg0 key="UserinfoForm.mobile" />
</field>
<field property="description" depends="maxlength">
<arg0 key="UserinfoForm.description" />
<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>200</var-value>
</var>
</field>
</form>
<form name="PasswordForm">
<field property="newPass" depends="required">
<arg0 key="PasswordForm.newPass" />
</field>
<field property="oldPass" depends="required">
<arg0 key="PasswordForm.oldPass" />
</field>
<field property="conPass" depends="required">
<arg0 key="PasswordForm.conPass" />
</field>
</form>
</formset>
</form-validation>
posted on 2008-01-05 12:37
阿蜜果 閱讀(8732)
評論(2) 編輯 收藏 所屬分類:
Struts