【问题标题】:How to validate if at least one of multiple input fields is entered?如何验证是否输入了多个输入字段中的至少一个?
【发布时间】:2012-10-22 13:10:01
【问题描述】:

我有一个包含 3 个字段的表单和提交按钮。单击按钮时,如果在 3 个字段中都没有输入,则抛出验证消息。如果输入了 3 个字段中的任何一个,则处理数据并使用数据表在同一页面中显示结果。我可以为一个字段抛出验证消息,但不能为 2 个或更多字段抛出验证消息。这是我的代码。同样,如果我需要传递一个 long 值,并验证我该怎么做,因为 long 值无法验证为 isEmpty() 或 isNull()。

这是我的代码,我想将它与多个字段一起使用,并且对具有长值的字段进行验证。

<h:inputText id="userName" value="#{user.userName}" required="true"
    requiredMessage="Please enter username" />

<h:inputText id="empId" value="#{user.empId}" required="true"
    requiredMessage="Please enter Employee Id" />

<h:inputText id="acctNm" value="#{user.acctNm}" required="true" 
    requiredMessage="Please enter Employee Id" />

【问题讨论】:

  • 您的问题是什么?为什么不能只更改search() 方法来检查所有字段?使用Long 检查空值。
  • 即使我将其更改为 null,但在前端它会在文本框中显示一个值 0,用于长值。我怎样才能摆脱填充0?是的,我可以更改搜索方法以检查所有字段,但是如何获取它们?如果我使用面上下文的 void 方法,UIComponent,对象值不起作用。
  • 将empId 和acctNm 添加到您的user bean。将两者都设为java.lang.Long。
  • 如果您使用的是 Eclipse,请在复制粘贴代码之前按Ctrl+Shift+F。问题中的那个格式错误,这使得它更难解释。

标签: validation jsf


【解决方案1】:

只需让每个字段的required 属性检查其他字段的提交值是否存在。提交的值在参数映射#{param}中可用客户端ID作为键。

这是一个启动示例:

<h:form id="form">
    <h:inputText id="field1" ... required="#{empty param['form:field2'] and empty param['form:field3']}" />
    <h:inputText id="field2" ... required="#{empty param['form:field1'] and empty param['form:field3']}" />
    <h:inputText id="field3" ... required="#{empty param['form:field1'] and empty param['form:field2']}" />
</h:form>

随着字段数量的增加,它只会变得更加丑陋。

或者,您可以使用OmniFaces &lt;o:validateOneOrMore&gt;:

<h:form id="form">
    <h:inputText id="field1" ... />
    <h:inputText id="field2" ... />
    <h:inputText id="field3" ... />

    <o:validateOneOrMore id="oneOrMore" components="field1 field2 field3" />
    <h:message for="oneOrMore" />
</h:form>

请注意,在操作方法中执行验证是糟糕的设计。您应该为此使用标准 JSF 验证工具,例如 requiered、validator、&lt;f:validator&gt; 和/或 &lt;f:validateXxx&gt;。

【讨论】:

  • 实际上我应该使用icefaces1.8,但是由于我的机器上没有安装icefaces,所以我使用jsf标签进行了操作。无论如何..让我们说如果验证通过,意味着用户在 3 个字段之一中输入了一些值,那么我需要将数据获取到同一页面上的数据表中。我可以使用 action 或 actionListener 吗?我该如何处理这些?在 validate 方法里面?
  • 与命令按钮绑定的操作方法中的常用方法。当验证失败时,无论如何都不会调用 action 方法。至于 ICEfaces 限制;请注意,OmniFaces 不是一个组件库,它是一个实用程序库。您可以将它与每个 JSF 组件库一起使用。
  • 谢谢它工作正常,唯一的问题是我能收到一条错误消息而不是 3 条吗?喜欢请在其中一个字段中输入至少一个值。现在我收到如下错误消息:form:userName: Validation Error: Value is required.form:empId: Validation Error: Value is required., form:acctNm: Validation Error: Value is required
  • 从其他 2 个字段中删除 required 或使用 &lt;o:validateOneOrMore&gt;。
【解决方案2】:

至少对于 iceFaces 而言,跨多个字段进行验证的另一种方法,尤其是当验证比“必需”更复杂时,是在支持 bean 中使用应用程序级验证。

@见Custom Validator in Backing Beans

  • 将验证器属性添加到您的 rcomponent 并将其指向支持 bean 中的验证方法
  • 在 backing bean 中,您现在可以访问所有表单字段并进行交叉验证

问候

罗伯

【讨论】:

  • 这不是 ICEfaces 特有的。那只是标准的JSF。我建议花更多时间学习基本的 JSF。毕竟,您仍然没有详细回答具体问题。您只是在暗示它可以使用自定义 JSF 验证器来完成,但您无法准确地告诉 如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
相关资源
最近更新 更多