锁定老帖子 主题:用struts验证器验证一个List
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-06
最后修改:2008-11-06
现在我还有个问题,各位大侠们解答一下,我提交的list数据可以通过form里的validate来验证,可是为了层次清晰更想通过validator验证器来验证,怎么编写自己的验证器方法可以实现。 以下是验证器自定义方法,怎么填充这个方法可以实现验证list呢? 我的list里面有很多字段,我是想用验证器来验证很多字段。 validator-rules.xml配置如下: <form-validation> <global> <validator name="validateList" classname="org.apache.struts.validator.FieldChecks" method="validateMyList" 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.××××××" /> </global> </form-validation> validation.xml配置如下: <form-validation> <global /> <formset> <form name="MyForm"> <!-- 我自定义的form中的list --> <field property="myList" depends="validateList"> <msg name="validateList" key="error.×××××××" /> <arg key="×××××" resource="true" position="0"/> </field> </form> </formset> </form-validation> 现在我要单独写一个上述‘validator-rules.xml’中提到的validateMyList方法来做验证,传统的都是验证某一个字段,现在我要验证一个list,list里包含很多字段。validateMyList应该怎么实现呢? 在org.apache.struts.validator.FieldChecks类里我定义了如下的方法: public static boolean validateMyList( Object bean, ValidatorAction action, Field field, ActionMessages message, Validator validator, HttpServletRequest req) { List target = null; String pattern = null; target = ValidatorUtils.getValueAsList(bean, field.getProperty()); 怎么实现…………… return Boolean.FALSE; } 我要验证的list定义如下: /** * mylist */ private List<CooperationClient> myList; 而CooperationClient类的定义如下: package ja.co.eisho.master.template.search; /** * <pre> * * </pre> * * @author 東方標準 LUJX */ public class CooperationClient { /** * */ private String clientCategoryID; /** * */ private String clientCategoryName; /** * */ private String templateID; /** * <pre> * * </pre> * * @param String templateID */ public void setTemplateID(String templateID) { this.templateID = templateID; } /** * <pre> * * </pre> * * @return String templateID */ public String getTemplateID() { return templateID; } /** * <pre> * * </pre> * * @param String clientCategoryID */ public void setClientCategoryID(String clientCategoryID) { this.clientCategoryID = clientCategoryID; } /** * <pre> * * </pre> * * @return String clientCategoryID */ public String getClientCategoryID() { return clientCategoryID; } } 这个方法怎么写可以实现list的验证,难点在于把list里所有的字段都验证,然后把error messages统一报出来。 谢谢了。 欢迎讨论,能解决最好。本人初学不久理解不透彻。 msn:lingyunlujixin@msn.com 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-06
哇,怎么没人理这篇文章啊,谁帮我指点一下呢?
|
|
返回顶楼 | |
发表时间:2008-11-06
好像没写清楚,validateDate是共通的方法吗,如果是的话应该有相应的配置文件吧,你可以自定义处理list的逻辑吧
|
|
返回顶楼 | |
发表时间:2008-11-06
最后修改:2008-11-06
jeff.chuh 写道 好像没写清楚,validateDate是共通的方法吗,如果是的话应该有相应的配置文件吧,你可以自定义处理list的逻辑吧
我的list里面有很多字段,我是想用验证器来验证很多字段。 validator-rules.xml配置如下: <form-validation> <global> <validator name="validateList" classname="org.apache.struts.validator.FieldChecks" method="validateMyList" 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.××××××" /> </global> </form-validation> validation.xml配置如下: <form-validation> <global /> <formset> <form name="MyForm"> <!-- 我自定义的form中的list --> <field property="myList" depends="validateList"> <msg name="validateList" key="error.×××××××" /> <arg key="×××××" resource="true" position="0"/> </field> </form> </formset> </form-validation> 现在我要单独写一个上述‘validator-rules.xml’中提到的validateMyList方法来做验证,传统的都是验证某一个字段,现在我要验证一个list,list里包含很多字段。validateMyList应该怎么实现呢? 在org.apache.struts.validator.FieldChecks类里我定义了如下的方法: public static boolean validateMyList( Object bean, ValidatorAction action, Field field, ActionMessages message, Validator validator, HttpServletRequest req) { List target = null; String pattern = null; target = ValidatorUtils.getValueAsList(bean, field.getProperty()); 怎么实现…………… return Boolean.FALSE; } 我要验证的list定义如下: /** * mylist */ private List<CooperationClient> myList; 而CooperationClient类的定义如下: package ja.co.eisho.master.template.search; /** * <pre> * * </pre> * * @author 東方標準 LUJX */ public class CooperationClient { /** * */ private String clientCategoryID; /** * */ private String clientCategoryName; /** * */ private String templateID; /** * <pre> * * </pre> * * @param String templateID */ public void setTemplateID(String templateID) { this.templateID = templateID; } /** * <pre> * * </pre> * * @return String templateID */ public String getTemplateID() { return templateID; } /** * <pre> * * </pre> * * @param String clientCategoryID */ public void setClientCategoryID(String clientCategoryID) { this.clientCategoryID = clientCategoryID; } /** * <pre> * * </pre> * * @return String clientCategoryID */ public String getClientCategoryID() { return clientCategoryID; } } 这个方法怎么写可以实现list的验证,难点在于把list里所有的字段都验证,然后把error messages统一报出来。 谢谢了。 |
|
返回顶楼 | |
发表时间:2008-11-06
你就在validateMyList里遍历list,然后对每个bean取相应字段的值进行验证不就可以了,什么地方有难点吗
|
|
返回顶楼 | |
发表时间:2008-11-07
jeff.chuh 写道 你就在validateMyList里遍历list,然后对每个bean取相应字段的值进行验证不就可以了,什么地方有难点吗
遍历list很容易,可是遇到输入不合法的字段值,然后把所有不合法字段报出的error messages放在一起报出来怎么实现呢?大哥你帮我实现一下好吗?感谢了。 |
|
返回顶楼 | |
发表时间:2008-11-07
你可以把错误message拼成字符串,放到request中
|
|
返回顶楼 | |
发表时间:2008-11-07
jeff.chuh 写道 你可以把错误message拼成字符串,放到request中
错误的msg配置不是在validation.xml配置的吗? 而这个方法的返回值只有true or false,这是我不明白的地方,怎么修改方法,或者配置文件,请赐教。 |
|
返回顶楼 | |
发表时间:2008-11-07
我看配置文件了,是配置到validation.xml中的,
但是对于你的这种情况,配置到validation.xml的错误信息就没意义了。 话说回来,配置到validation.xml是由框架处理这个错误信息, 你认为框架会怎么处理呢,想要在画面显示这条信息的话, 我想框架一定是把这条信息以一个固定的key放到request中, 具体的存储方式可能是一个String,也可能是一个list需要你调查了。 如果是list的话你只要找到这个key是什么,然后在validateMyList中把拼好的错误信息加入到list中就可以了 List list = request.getAttribute("error_key") list.add("your message") 但放到request的对象是String的话, 在validateMyList中调用request.setAttribute("error_key","your message")后,框架也许再次重新设值,那样就没意义了。 解决问题要靠自己 |
|
返回顶楼 | |
发表时间:2008-11-09
最后修改:2008-11-09
你认真看一下,自定义检验器的例子嘛!
当用户自定的检验器,实现了struts2相关的接口,该接口会传相应的数据对象进来,你得到这些对象处理后,把出错信息,放入相应的出错数据对象里就可以了. 这是自定义检验器的简单例子 package hi; import com.opensymphony.xwork2.validator.ValidationException; import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport; public class MyValidator extends FieldValidatorSupport { public void validate(Object arg0) throws ValidationException { String fdName=getFieldName(); String fdValue=(String) this.getFieldValue(fdName, arg0); if (fdName.equals("msg") & fdValue.equals("abc")){ this.addFieldError(fdName, arg0); } } } 说明: 这是使用了struts2检验器抽象类,实现接口工作量会比接大,用抽象类要方便一点. 当struts2调用你写的检验器后,会把所有的输入输出数据打包成arg0,具体是什么格式,写个简单的检验器,下个断点, 用调试窗口查看一下嘛. 通过上面的例子可看出:父对象的getFieldName方法,取得表单中字段名,而父对象的getFieldValue取得 表单的字段值;也有可能得到的是action中的值,自已用调试的方法确认一下嘛. 父对象的addFieldError,是把出错信息,加入到了struts2的出错信息数据存储对象中了. 而arg0则是在检验器配置中的出错信息了,你看struts2多好,把所需要的数据对象,全部都传给你了,你只是按需要 取自已感兴趣的东西,再把自已需要影响的数据放入相应的数据对象中去就可以了. 基于框架编程就这样,把所有要处理的数据全部分类封装起来,在所有的处理框架接口中转悠,向各个接口传递资料,收集资料.框架就做这种活,而具体的实际应用,全由用户处理.题外话,扯远了. |
|
返回顶楼 | |