Struts2提供了Collection的转换器,可以直接把页面传递过来的参数转换成List Set类型,使用这个转换器能为我们节省不少手指运动量,但Collection的验证就成了一个问题.google之后,找到了这个资料webwork数组形式提交表单及validation研究.但文中的collection是xwork1的验证器,在xwork2中并不存在,于是想到把它从xwork1中转移过来.并修改了少许,使之可以支持多个验证器.?
有2个类,CollectionFieldValidator和DefaultActionValidatorManager,因为都是xwork1的类,所以我们还要稍微改动一下.?
CollectionFieldValidator.java?
- //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中不存在这个方法接口,只能自己动手了.??
Xwork1DefaultActionValidatorManager.java
- //继承了xwork2的DefaultActionValidatorManager??
- public?class?Xwork1DefaultActionValidatorManager?extends?DefaultActionValidatorManager{??
- ??
- //仅仅从xwork1的DefaultActionValidatorManager.java中拷贝过来??
- public?void?validate(Object?object,?List?validators,?ValidatorContext?validatorContext)?throws?ValidationException?{...}??
- }??
使用方法如下:?
validators.xml?
- <validators>??
- ????<validator?name="collection"?class="com.ddl.tools.CollectionFieldValidator"/>??
- </validators>??
ActionName-validattion.xml?
- <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验证不能有多验证器.