用struts验证器验证一个List
论坛里有一篇「struts使用list提交多行表单(提供完整示例)」,我能理解并且能实现list提交多行表单的问题。
现在我还有个问题,各位大侠们解答一下,我提交的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<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统一报出来。
谢谢了。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多好,把所需要的数据对象,全部都传给你了,你只是按需要
取自已感兴趣的东西,再把自已需要影响的数据放入相应的数据对象中去就可以了.
基于框架编程就这样,把所有要处理的数据全部分类封装起来,在所有的处理框架接口中转悠,向各个接口传递资料,收集资料.框架就做这种活,而具体的实际应用,全由用户处理.题外话,扯远了.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); } }}
2 validators.xml--------在src路径下自建的文件(编译后在classpath根路径下)
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator Config 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd"><validators> <validator name="abc" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> </validators>注意:使用自写的检验器,系统自带的检验器需要在这里重新注册才能用。因为系统的检验器注册文件根本没加载。
3hai.java---------action类,位于src/java/hai 下面
package hi;import com.opensymphony.xwork2.ActionSupport;public class Hai extends ActionSupport { private String msg; //省略掉getter and setter @Override public String execute() throws Exception { return "success"; } }4Hai-validation.xml--------检验器使用配置文件,与hai.java位于同一位置src/ava/hai。这是struts系统要求检验文件要与类文件在同一位置。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN""http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"><validators> <field name="msg"> <field-validator type="abc"> <message>不能输入abc</message> </field-validator> <field-validator type="requiredstring"> <message>不能为空</message> </field-validator> </field></validators>
5 hai.jsp---------部份代码
<s:form action="hai.action" > <s:textfield name="msg" label="msg" /> <s:submit /> </s:form>
6 action配置。在struts.xml中进行。
<action name="hai" > <result name="success">/hai.jsp</result> <result name="input">/hai.jsp</result> <result name="err">/hai.jsp</result> </action>
7 web.xml配置略
11 楼 lingyunlujixin 2008-11-10 yunhaifeiwu ,jeff.chuh 两位仁兄,
提供的思想我已经认真阅读过了,首先感谢两位提供帮助,由于我初学struts不久仅仅出于初级阶段,struts2更是不了解,我会实验一下上面给出的例子。谢谢宁波的yunhaifeiwu (*^_^*)
来自沈阳的jeff.chuh在最后的回复中提到:
---------------------------------
我看配置文件了,是配置到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")后,框架也许再次重新设值,那样就没意义了。
解决问题要靠自己
---------------------------------
,思想我是明白的,可是在实现上对于初学的我有些困难,比如如何得到那个error_key。现在在项目开发中我也不可能每天在这里死钻牛角尖,我已经用另一种形式实现了,可是仍旧需要您的解答。
12 楼 chbest 2008-11-10 美女?捧场一下 13 楼 ibuji 2009-01-02 既然可以实现一个 你就对每个字段进行校验啊!!!
我们都是这样做的。。
能达到你说的那种效果啊... 14 楼 sosu1314 2011-12-22 不知道楼主还在这个论坛不? 我希望得到你的解决方法 是在后台action中实现的吗?