JSF使用可选字段和大量依赖项验证整个表单

时间:2016-10-06 08:02:26

标签: forms validation jsf

只是想问一下解决问题的最佳方法: 我有一个带有多个输入/选择的表单,还有按钮,用于将新对象添加到表单后面的数据库。现在我的问题是验证。例如:在其中一个选项中我选择了一个选项。如果选择此选项,则用户必须将特定类型的对象添加到表单后面的大型数据库中。通过在另外两个选择中选择值来完成。一旦选择了这些(它们由ajax提交),用户就可以通过点击"添加"来生成新对象。按钮。

在提交时,这些添加的对象(由两个值组成)必须具有特定的枚举类型,具体取决于第一个选定的值等等。

现在应该验证所有(以及更多),并且应该在视图中添加错误/信息消息

现在我的问题:最好的方法是什么?错误消息必须位于视图中的特定位置。

我想到了多个hidden input字段并使用" validate"属性调用底层bean的验证方法(也需要bean值)。然后在隐藏字段的位置渲染错误消息。这是一个好的解决方案吗? 使用validator属性并验证整个表单会导致用户尚未输入任何内容的区域出现错误消息,对吧?我想避免这种情况,只是验证当前区域。这可能是通过使用一个bean?否则我将不得不使用具有许多属性的多个验证器,或者使用beanManager来获取我的底层bean?

提前致谢!

1 个答案:

答案 0 :(得分:1)

JSF验证是按组件完成的,而不是按表单完成的。这是设计(它有一个很好的目的)。关于这一点存在很多误解,许多团队犯了错误,将他们的业务逻辑验证强制转换为组件验证,因为单词" validation"对他们说得对。

您需要的验证不同 - 它是业务级别验证。您并不真正验证单个组件的状态,而是确保组件后面的数据的一致性。您仍然可以使用消息框架在您想要的位置显示错误。

清洁和适当的"在JSF中这样做的方法是:

  • 跳过JSF组件验证(因为它是针对不同情况而设计的);您希望组件中的所有值都放入您的支持bean;

  • 将您需要的任何地方显示错误消息;

  • 在您的操作方法中编写验证逻辑。您可以使用Bean Validation Framework或手动编写逻辑;

  • 如果未找到错误,则操作方法执行操作;

  • 出错时,根据错误,在适当的位置显示消息(使用组件ID);

  • 如果发生任何错误,请不要执行操作并从操作方法返回。

动作方法应该看起来像这样(这不是复制粘贴示例,它只是为了让您了解流程):

  public void doSomething() {
     boolean valid = true;

     if (startData.after(expiryDate)) {
        FacesContext.getCurrentInstance().addMessage("expiryDate", new FacesMessage("Expiry date should come after creation date"));
        valid = false;
     }

     // other checks

     // checks could also make use of BVF validator - but then it's better to switch the BFV validation for the whole form
     // (if you don't, then any single field validation will disable error checking for the business validation, which
     // will look strange for your users)
     if (!valid) {
        // if we returned immediately upon detecting an error, we would only display the first one.
        return;
     }

     // do the real stuff

  }