当前位置: 代码迷 >> Web前端 >> (转)Struts2中的collection印证
  详细解决方案

(转)Struts2中的collection印证

热度:460   发布时间:2012-11-23 22:54:33.0
(转)Struts2中的collection验证

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

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

Java代码??收藏代码
  1. //propertyname,e.g:persons.name??
  2. private?String?property;??
  3. ????public?String?getProperty()?{?return?this.property;?}??
  4. ????public?void?setProperty(String?collection)?{?this.property?=?collection;?}??
  5. ??????
  6. ????//all?validatorRef?split?with?","??
  7. ????private?String?validatorRefs;??
  8. ????public?String?getValidatorRefs()?{?return?this.validatorRefs;?}??
  9. ????public?void?setValidatorRefs(String?validatorRefs)?{?this.validatorRefs?=?validatorRefs;?}??
  10. ??????
  11. ????//a?validator's?param?key?start?with?it's?ref??
  12. ????private?Map?validatorParams?=?new?LinkedHashMap();??
  13. ????public?void?setValidatorParams(Map?validatorParams)?{?this.validatorParams?=?validatorParams;?}??
  14. ????public?Map?getValidatorParams()?{?return?validatorParams;?}??
  15. ??
  16. //get?all?validator?and?set?them?then?validate??
  17. public?void?validate(Object?object)?throws?ValidationException?{...}??
  18. ??
  19. //find?all?propertyname?and?put?them?into?result?(a?recursion?method)??
  20. protected?void?populateValue(Object?obj,?CloneableIterator?iterator,?List?result,?String?overallPropertyName)?throws?OgnlException,?CloneNotSupportedException?{...}??
  21. }??


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


Xwork1DefaultActionValidatorManager.java

Java代码??收藏代码
  1. //继承了xwork2的DefaultActionValidatorManager??
  2. public?class?Xwork1DefaultActionValidatorManager?extends?DefaultActionValidatorManager{??
  3. ??
  4. //仅仅从xwork1的DefaultActionValidatorManager.java中拷贝过来??
  5. public?void?validate(Object?object,?List?validators,?ValidatorContext?validatorContext)?throws?ValidationException?{...}??
  6. }??



使用方法如下:?
validators.xml?

Xml代码??收藏代码
  1. <validators>??
  2. ????<validator?name="collection"?class="com.ddl.tools.CollectionFieldValidator"/>??
  3. </validators>??


ActionName-validattion.xml?

Xml代码??收藏代码
  1. <validators>??
  2. <!--?Action?中?Field?名-->??
  3. <field?name="sentForm">??
  4. ????????<field-validator?type="collection">????
  5. <!--?需要验证的属性,其中details是collection-->??
  6. ????????????<param?name="property">sentForm.details.requestQty</param>????
  7. <!--?以逗号分隔?-->??
  8. ????????????<param?name="validatorRefs">required,int</param>?????
  9. <!--?验证器引用名_参数名-->??
  10. ????????????<param?name="validatorParams['required_messageKey']">receivedocument.requestQty.validate.required</param>??
  11. ????????????<param?name="validatorParams['int_messageKey']">receivedocument.requestQty.validate.int</param>??
  12. ????????????<message>...</message>??
  13. ????????</field-validator>????
  14. ????</field>??
  15. <field?name="sentForm">??
  16. ????????<field-validator?type="collection">????
  17. ????????????<param?name="property">sentForm.details.item</param>????
  18. ????????????<param?name="validatorRefs">requiredstring</param>?????
  19. ????????????<param?name="validatorParams['requiredstring_messageKey']">receivedocument.item.validate.required</param>??
  20. ????????????<message>...</message>??
  21. ????????</field-validator>????
  22. ????</field>??
  23. </validators>??


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

  相关解决方案