`
lingyunlujixin
  • 浏览: 16868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

用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
分享到:
评论
14 楼 sosu1314 2011-12-22  
不知道楼主还在这个论坛不? 我希望得到你的解决方法 是在后台action中实现的吗?
13 楼 ibuji 2009-01-02  
    既然可以实现一个 你就对每个字段进行校验啊!!!
我们都是这样做的。。
能达到你说的那种效果啊...
12 楼 chbest 2008-11-10  
美女?捧场一下
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。现在在项目开发中我也不可能每天在这里死钻牛角尖,我已经用另一种形式实现了,可是仍旧需要您的解答。
10 楼 yunhaifeiwu 2008-11-09  
下面是一个简单检验器例子.至于你的需求,你自已相应改动吧.

自定义校验器
struts2提供了校验器的接接口有:
引用
Validator,FieldValidator, ShortCircuitableValidator,
而 FieldValidatorSupport实现了它们,但FieldValidatorSupport是一个抽象类。


引用
自定义校验器,通常继承FieldValidatorSupport,然后覆盖validate方法。还要在classpath根目录下建一个validators.xml文件进行注册,再像预定义一样使用。


例:
自定义了一个限止输入”abc”的检验器;并使用它。
1 MyValidator.java-------自定义的检验器
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="hi.MyValidator"/>
    <!--当使用自定义检验器后,struts不再装默认的检验器注册表文件,
        因此这里要注册struts2已经写好的检验器 -->
     <validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
                
</validators>
注意:使用自写的检验器,系统自带的检验器需要在这里重新注册才能用。因为系统的检验器注册文件根本没加载。

3 hai.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"; } 
    
}


4 Hai-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" class="hi.Hai" >
            <result name="success">/hai.jsp</result>
            <result name="input">/hai.jsp</result>
            <result name="err">/hai.jsp</result>
        </action>

7  web.xml配置略
9 楼 yunhaifeiwu 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多好,把所需要的数据对象,全部都传给你了,你只是按需要
取自已感兴趣的东西,再把自已需要影响的数据放入相应的数据对象中去就可以了.

基于框架编程就这样,把所有要处理的数据全部分类封装起来,在所有的处理框架接口中转悠,向各个接口传递资料,收集资料.框架就做这种活,而具体的实际应用,全由用户处理.题外话,扯远了.
8 楼 jeff.chuh 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")后,框架也许再次重新设值,那样就没意义了。
解决问题要靠自己
7 楼 lingyunlujixin 2008-11-07  
jeff.chuh 写道
你可以把错误message拼成字符串,放到request中

错误的msg配置不是在validation.xml配置的吗? 而这个方法的返回值只有true or false,这是我不明白的地方,怎么修改方法,或者配置文件,请赐教。
6 楼 jeff.chuh 2008-11-07  
你可以把错误message拼成字符串,放到request中
5 楼 lingyunlujixin 2008-11-07  
jeff.chuh 写道
你就在validateMyList里遍历list,然后对每个bean取相应字段的值进行验证不就可以了,什么地方有难点吗

遍历list很容易,可是遇到输入不合法的字段值,然后把所有不合法字段报出的error messages放在一起报出来怎么实现呢?大哥你帮我实现一下好吗?感谢了。
4 楼 jeff.chuh 2008-11-06  
你就在validateMyList里遍历list,然后对每个bean取相应字段的值进行验证不就可以了,什么地方有难点吗
3 楼 lingyunlujixin 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统一报出来。

谢谢了。
2 楼 jeff.chuh 2008-11-06  
好像没写清楚,validateDate是共通的方法吗,如果是的话应该有相应的配置文件吧,你可以自定义处理list的逻辑吧
1 楼 lingyunlujixin 2008-11-06  
哇,怎么没人理这篇文章啊,谁帮我指点一下呢?

相关推荐

    用struts2 实现注册

    用struts2实现用户的注册,涉及到的知识点包括用户名和密码的校验(正则表达式验证);国际化;radio,checkboxlist,optiontransferselect等标签的使用,文件的上传等。

    深入浅出Struts2(附源码)

    17.3 使用一个自定义的“等待”页面 265 17.4 小结 266 第18章定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 ...

    使用struts2+Ajax+jquery验证用户名是否已被注册

    在使用struts2+ajax时候,通常我们会返回json类型的数据,但是像上面的例子,我们只希望返回一个1和0有助于进行后续判断即可,没必要返回json类型,返回一个text字符串就可以了. regist.jsp(这里只提供[removed]部分): ...

    struts2讲义_吴峻申

    第4章 另一Struts2核心技术:拦截器 47 4.1 拦截器在Struts2中的缺省应用 47 4.2 拦截器原理实现 50 4.3 在Struts2中配置自定义的拦截器 53 4.3.1 扩展拦截器接口的自定义拦截器配置 54 4.3.2 继承抽象拦截器的...

    Struts2 Spring hibernate 国际化 表单验证 安全退出

    添加以下方法 ,loginaction的条件用这个来改 public boolean login(String username, String password) { // TODO Auto-generated method stub String param[]={username,password}; List list= this....

    Struts2-登录验证码

    完整的Struts2框架,联系oracle数据库实现登录验证 验证码功能:点击图片切换验证码,验证码错误提示 登录成功后变量session中的list集合 内含备注

    struts2.1宝典

    18第一个Ajax例子 Ajax+struts2 6 8.标签 7 8.Select标签 7 9.Checkbox 10 10.checkboxlist 12 11.combobox 14 12.datepicker 17 9.总结 21 10.国际化资源文件占位符 为资源文件传参数 22 没有JUNIT 22 OGNL 22 ...

    struts2入门实例1

    把一个商品变成了两个 4.Struts2_03_TypeConverter3 把上面的局部的转换器改成全局的了 xwork-conversion.properties 5.Struts2_03_TypeConverter4 把前面的继承改成了strutstypeconverter了 6.Struts2_03...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    17.3 使用一个自定义的“等待”页面 265 17.4 小结 266 第18章 定制拦截器 267 18.1 Interceptor接口 267 18.2 编写一个自定义的拦截器 268 18.3 使用DataSourceInjectorInterceptor拦截器 269 18.4 小结 273 第19...

    struts2入门实例3 经典入门必备

    把一个商品变成了两个 4.Struts2_03_TypeConverter3 把上面的局部的转换器改成全局的了 xwork-conversion.properties 5.Struts2_03_TypeConverter4 把前面的继承改成了strutstypeconverter了 6.Struts2_03...

    struts2入门实例4 经典入门必备

    把一个商品变成了两个 4.Struts2_03_TypeConverter3 把上面的局部的转换器改成全局的了 xwork-conversion.properties 5.Struts2_03_TypeConverter4 把前面的继承改成了strutstypeconverter了 6.Struts2_03...

    struts2入门实例2 经典入门必备

    把一个商品变成了两个 4.Struts2_03_TypeConverter3 把上面的局部的转换器改成全局的了 xwork-conversion.properties 5.Struts2_03_TypeConverter4 把前面的继承改成了strutstypeconverter了 6.Struts2_03...

    通过Ajax两种方式讲解Struts2接收数组表单的方法

    使用struts2表单传值,可以传一个或者是作为一个对象的各个属性传,都非常灵活便捷。但是如果我们需要传一个数组并希望struts正确接收,该怎么处理呢? 下面我将通过普通表单和ajax两种方式讲解。首先我们有如下一个...

    Struts2JQueryJson

    学习时做的一个struts2框架下前台页面获取后台json格式的数据,list,map等。页面包含多级联动页面,登陆验证页面,获取后台map,list格式的json格式数据的页面。分享给大家学习。

    基于Struts2的图书管理系统源代码

    2. 模糊查询时,因同时需要进行where筛选,SQL语句无法执行,只好分开查询,先进行模糊查询,查询结果存放到list表中,再通过遍历list表进行判断是否符合where的条件,若符合,则存入另一个list表中。这种方法虽然...

    java面试宝典

    139、当我使用一个结果集时,如何防止字段为"null"的字域显示在我的HTML输入文本域中? 35 140、如何中SERVLET或JSP下载一个文件(如:binary,text,executable)? 36 141、使用useBean标志初始化BEAN时如何接受初始化...

    外文翻译 stus MVC

    ActionErrors is Struts way of keeping up with a list of errors. The ActionMapping class An incoming event is normally in the form of an HTTP request, which the servlet Container turns into an ...

    基于SSH三大框架项目管理系统

    1,该系统使用SSH三大框架实现,Struts2主要用于流程控制、Spring的控制反转能起到解耦合的作用、Hibernate是一个优秀的ORM框架主要用于数据持久化 2,登录模块分为三种角色业务员、研究员、管理员 业务员:主要负责...

Global site tag (gtag.js) - Google Analytics