`
lingyunlujixin
  • 浏览: 17337 次
  • 性别: 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  
哇,怎么没人理这篇文章啊,谁帮我指点一下呢?

相关推荐

    struts1.2 from表单提交包含list的对象

    这个Bean应该包含一个List属性,例如`List&lt;Product&gt;`,其中Product是另一个Bean,包含了商品的各个属性。在表单提交后,Struts的默认数据绑定机制会尝试将请求参数自动绑定到ActionForm的属性上。 接着,Action类会...

    一个Struts1多文件上传实例(附Form中传List示例)

    在Struts1中,ActionForm类需要有一个对应的List字段来接收这些值,这样在提交表单时,Struts1的默认Binding机制会自动将这些值绑定到List中。 4. **配置文件**: 配置文件(struts-config.xml)需要添加相应的...

    Struts2的转换器与验证框架

    例如,创建一个包含学生列表的Action属性,并在JSP页面中使用迭代器为每个学生创建输入字段。然后,通过配置`Action-conversion.properties`文件,指定一个转换器将表单数据转换为相应的对象,如Student类的实例,再...

    Struts2+ajax+json返回list.docx

    在`struts.xml`配置文件中,我们需要定义一个Action,指定其结果类型为`json`。这样,当Action执行完成后,Struts2会自动将Action中的属性序列化为JSON格式并返回给客户端。配置如下: ```xml &lt;!-- 配置Struts2...

    Struts2转换器、拦截器、验证以及国际化

    拦截器是Struts2框架中的一个重要组成部分,它允许在执行Action之前或之后插入一系列预处理或后处理操作。拦截器的设计基于责任链模式,可以用于执行如类型转换、数据校验、日志记录、会话管理等多种任务。 **默认...

    struts2.0一个简单的入门实例

    以下是一个简单的入门实例,帮助初学者理解如何配置和使用Struts2.0。 首先,我们需要创建一个新的Web项目。在MyEclipse中,你可以新建一个Web项目,例如命名为"Struts2入门实例"。接下来,你需要导入Struts2运行所...

    Struts中List里嵌套Map

    在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构,用于构建可维护性高、结构清晰的Web应用程序。在处理复杂数据结构时,Struts框架提供了灵活的数据绑定能力,其中包括在List中嵌套Map的...

    struts2标签使用例子

    Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建企业级Java Web应用程序。在Struts2框架中,标签库是其一大特色,它提供了丰富的自定义标签,使得开发者能够更加便捷地创建动态页面。这些标签极大地简化...

    提交多行数据到Struts的ActionForm的List属性中

    在Java Web开发中,Struts框架是一个非常流行的MVC(模型-视图-控制器)架构,它简化了处理用户请求和展示响应的方式。当我们需要在客户端提交多行数据时,通常会利用表单来收集信息,然后将这些数据传递到服务器端...

    Struts常见的Form(一)

    Struts框架是Java Web开发中的一个经典模型-视图-控制器(MVC)框架,它极大地简化了构建基于JSP的Web应用。在Struts中,Form Bean是用于处理用户输入的重要组件,它充当了模型层与视图层之间的桥梁。本篇文章将深入...

    struts上传问题研究

    Struts是Apache软件基金会(ASF)的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。Struts2作为其后续版本,为开发者提供了更强大的功能,包括动作调度、结果处理、表单...

    Struts2漏洞2.0.xx升级为Struts-2.5.12步骤

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。然而,随着时间的推移,Struts2的早期版本暴露了一些安全漏洞,这使得系统容易受到攻击。本教程将详细解释如何将Struts2的...

    Struts2案例翻译篇-Using Struts2 Tag

    Struts2是一个强大的Java web框架,它提供了丰富的功能来构建MVC(模型-视图-控制器)架构的应用程序。在Struts2中,Tag库是其核心组件之一,极大地简化了视图层的开发,使得开发者可以更方便地创建动态网页。本篇将...

    配置第一个Struts2的简单登陆程序

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。它简化了开发过程,提供了丰富的插件和动作支持,使得开发者能够更高效地组织和管理代码。本教程将指导新手配置第一个基于...

    struts2使用手册

    在项目的`src`目录下新建一个名为`struts.xml`的文件,并添加基本的配置信息。 ```xml &lt;!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ...

    struts2实现的多个文件上传

    Struts2是一个强大的Java web框架,它为开发者提供了丰富的功能,包括处理用户请求、数据绑定、验证、国际化等。在处理文件上传时,Struts2提供了便捷的API和配置方式,使得开发人员能够轻松实现多文件上传的功能。...

    Struts(二)List_Map_LookupDispatchAction_Validate

    当请求到达时,Struts会根据配置创建一个新的Action实例,调用validate()进行验证,然后调用execute()方法执行业务逻辑。验证失败会阻止execute()的执行,并将错误信息返回给视图。 5. **Struts配置文件**: 在...

    struts简易增删改查

    在"struts简易增删改查"这个主题中,我们将探讨如何使用Struts框架来实现一个基本的数据操作功能,包括添加(Add)、删除(Delete)、修改(Update)和查询(Search)数据。这些功能是任何数据库驱动的应用程序的...

    Struts2 标签使用简介

    除了预定义的标签外,Struts2还允许开发者自定义标签,这需要创建一个继承自`org.apache.struts2.views.jsp.TagSupport`的Java类,并在JSP页面中使用`&lt;s:tag&gt;`进行调用。 五、标签库的扩展性 Struts2的标签库不仅...

    使用struts1.x上传多个文件的一中方法

    在Java Web开发中,Struts1.x框架是一个广泛使用的MVC(Model-View-Controller)框架,它提供了处理用户请求、业务逻辑和视图展示的能力。在Struts1.x中,实现文件上传功能是一个常见的需求,特别是在处理用户提交的...

Global site tag (gtag.js) - Google Analytics