【问题标题】:best approach to do jsf form validation进行 jsf 表单验证的最佳方法
【发布时间】:2011-02-23 07:16:16
【问题描述】:

如果我在一个表单中有许多输入控件(每个输入控件都有单独的验证器 - 例如 required、length 等),那么有一个命令按钮可以提交表单并调用一个操作方法。要求是-尽管输入控件值可以单独使用-这些值的组合应该可以在表单提交后一起处理它们-我在哪里放置代码以一起验证它们?

1) 我可以为命令按钮添加自定义验证器并一起验证组合吗?像validate(FacesContext arg0, UIComponent arg1, Object value) 一样,但即便如此,除了命令按钮/组件的值之外,我不会有其他输入控件的值吗?

2) 我可以在操作方法中验证组合并使用FacesMessage 添加验证消息吗?

或者您是否建议任何其他方法?

感谢您的宝贵时间。

【问题讨论】:

    标签: jsf


    【解决方案1】:

    博卓已经回答了第 2 点。只需使用FacesContext#addMessage()null 客户端 ID 将让它登陆 <h:messages globalOnly="true">。像formId:inputId 这样的固定客户端ID 将让它登陆<h:message for="inputId">

    第 1 点是可行的,您可以使用 UIViewRoot#findComponent() 获取验证器方法中的其他组件:

    UIInput otherInput = (UIInput) context.getViewRoot().findComponent("formId:otherInputId");
    String value = (String) otherInput.getValue();
    

    但是,您需要将 f:validator 放在 last UIInput 组件中。将它放在UICommand 组件中(如按钮)将不起作用。

    的确,对客户端 ID 进行硬编码很讨厌,但这是 JSF 中有点不灵活的验证机制的回报。

    【讨论】:

    • 按照第二种方法添加消息后如何停止执行?
    【解决方案2】:

    在遇到同样的问题后,我刚刚登陆了你的帖子。

    到目前为止,我已阅读的文章指出,出于以下目的,有四种类型的验证:

    1. 内置于组件中(订阅各个字段;required=true、LengthValidator 等)
    2. “应用程序验证”添加到支持 Bean 中的操作(业务逻辑)
    3. 自定义验证器(订阅单个字段)
    4. Backing Bean 中用作自定义验证器的方法(订阅单个字段)。

    关于验证器:JSF 中的验证机制旨在验证单个组件。 (See S/O Question here)

    如果您想将 整个表单 验证为字段的逻辑分组,在标准 JSF/Apache MyFaces 中,最合适的做法是应用程序验证,因为在这一点上,一组单独的字段具有集体的商业意义。

    BalusC 提出了一种将表单验证硬塞到附加到最后一个表单项的单个验证器中的方法(再次,请参阅 S/O 问题 here 和他的网站上的另一个工作示例 here)但是它不是不一定可扩展/可重用,因为对表单 ID 的引用必须进行硬编码,因为您不能附加到 validate() 方法的签名。如果您只使用该表单一次,您将侥幸成功,但如果它弹出几次或者您以编程方式生成您的 ID,您就会陷入困境。

    Seam 的 JSF 实现部分有一个 <s:validateForm /> 控件,它可以将表单中其他地方的字段 ID 作为参数。不幸的是,似乎没有任何 MyFaces/Mojara/Sun JSF 实现具有等效项,因为它不是标准的一部分。

    【讨论】:

      【解决方案3】:

      我已经成功使用了第二种方法:

      FacesMessage facesMessage = 
            new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
      FacesContext.getCurrentInstance().addMessage(null, facesMessage);
      

      【讨论】:

      • 谢谢博卓。我更喜欢使用第二种方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2016-04-17
      • 2017-07-23
      • 2018-05-04
      • 2011-07-12
      • 2023-04-06
      相关资源
      最近更新 更多