Struts2中的collection验证

Struts2提供了Collection的转换器,可以直接把页面传递过来的参数转换成List Set类型,使用这个转换器能为我们节省不少手指运动量,但Collection的验证就成了一个问题.google之后,找到了这个资料[url=http://www.iteye.com/topic/176026]webwork数组形式提交表单及validation研究[/url].但文中的collection是xwork1的验证器,在xwork2中并不存在,于是想到把它从xwork1中转移过来.并修改了少许,使之可以支持多个验证器.

有2个类,CollectionFieldValidator和DefaultActionValidatorManager,因为都是xwork1的类,所以我们还要稍微改动一下.
[b]CollectionFieldValidator.java[/b]

//propertyname,e.g:persons.name
private String property;
public String getProperty() { return this.property; }
public void setProperty(String collection) { this.property = collection; }

//all validatorRef split with ","
private String validatorRefs;
public String getValidatorRefs() { return this.validatorRefs; }
public void setValidatorRefs(String validatorRefs) { this.validatorRefs = validatorRefs; }

//a validator's param key start with it's ref
private Map validatorParams = new LinkedHashMap();
public void setValidatorParams(Map validatorParams) { this.validatorParams = validatorParams; }
public Map getValidatorParams() { return validatorParams; }

//get all validator and set them then validate
public void validate(Object object) throws ValidationException {...}

//find all propertyname and put them into result (a recursion method)
protected void populateValue(Object obj, CloneableIterator iterator, List result, String overallPropertyName) throws OgnlException, CloneNotSupportedException {...}
}

因为CollectionFieldValidator.java中调用了xwork1的DefaultActionValidatorManager.java中的validate(Object object, List validators, ValidatorContext validatorContext)方法,但该方法在xwork2中不存在,甚至ActionValidatorManager中不存在这个方法接口,只能自己动手了.

[b]Xwork1DefaultActionValidatorManager.java[/b]

//继承了xwork2的DefaultActionValidatorManager
public class Xwork1DefaultActionValidatorManager extends DefaultActionValidatorManager{

//仅仅从xwork1的DefaultActionValidatorManager.java中拷贝过来
public void validate(Object object, List validators, ValidatorContext validatorContext) throws ValidationException {...}
}


使用方法如下:
[b]validators.xml[/b]

<validators>
<validator name="collection" class="com.ddl.tools.CollectionFieldValidator"/>
</validators>

[b]ActionName-validattion.xml[/b]

<validators>
<!-- Action 中 Field 名-->
<field name="sentForm">
<field-validator type="collection">
<!-- 需要验证的属性,其中details是collection-->
<param name="property">sentForm.details.requestQty</param>
<!-- 以逗号分隔 -->
<param name="validatorRefs">required,int</param>
<!-- 验证器引用名_参数名-->
<param name="validatorParams['required_messageKey']">receivedocument.requestQty.validate.required</param>
<param name="validatorParams['int_messageKey']">receivedocument.requestQty.validate.int</param>
<message>...</message>
</field-validator>
</field>
<field name="sentForm">
<field-validator type="collection">
<param name="property">sentForm.details.item</param>
<param name="validatorRefs">requiredstring</param>
<param name="validatorParams['requiredstring_messageKey']">receivedocument.item.validate.required</param>
<message>...</message>
</field-validator>
</field>
</validators>

可能有人注意到使用方法和上面提供的链接中稍有不同,这是因为原来的collection验证不能有多验证器.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值