进行jsf表单验证的最佳方法

进行jsf表单验证的最佳方法,jsf,Jsf,如果我在一个表单中有许多输入控件(每个输入控件都有单独的验证器-如required、length等),那么有一个命令按钮提交表单并调用操作方法。要求是——尽管输入控制值(比如说)可以单独使用——这些值的组合应该可以在表单提交后一起处理它们——我应该将验证它们的代码放在哪里 1) 我可以为命令按钮添加自定义验证器并一起验证组合吗?像validate(FacesContext arg0,UIComponent arg1,Object value)但即使这样,我也不会有其他输入控件的值,除了命令按钮的

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

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

2) 我是否可以在操作方法中对组合进行验证,并使用
FacesMessage
添加验证消息

或者你有没有其他建议


谢谢您的时间。

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

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

波佐已经回答了第2点。就用吧。
null
客户端ID将允许它进入
。像
formId:inputId
这样的固定客户端ID将允许它进入

第1点是可行的,您可以使用以下方法获取validator方法中的其他组件:

但是,您需要将
f:validator
放在最后一个
UIInput
组件中。将其放入
ui命令
组件(如按钮)将无法工作


诚然,硬编码客户机ID是令人讨厌的,但这是JSF中有点不灵活的验证机制的回报。

我刚刚在你的帖子上提出了同样的问题

我迄今阅读的文章指出,有四种验证类型,用于以下目的:

  • 内置于组件中(订阅单个字段;必需=true、LengthValidator等)
  • “应用程序验证”添加到支持Bean中的操作(业务逻辑)
  • 自定义验证器(订阅单个字段)
  • 方法,用作自定义验证器(订阅各个字段)
  • 关于验证器:JSF中的验证机制旨在验证单个组件

    如果您希望将整个表单作为字段的逻辑分组进行验证,那么标准JSF/Apache MyFaces似乎最适合作为应用程序验证,因为此时单个字段集具有集体的业务意义

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


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

    按照第二种方法添加消息后,如何停止执行?谢谢Bozho。我更愿意使用第二种方法。
    UIInput otherInput = (UIInput) context.getViewRoot().findComponent("formId:otherInputId");
    String value = (String) otherInput.getValue();