JSF2:如何验证两个相关的复选框?

时间:2010-12-08 12:34:38

标签: jsf validation jsf-2

我在JSF2中有一个带有2个复选框(<h:selectBooleanCheckbox>)的表单。至少应检查其中一个。两个检查都没问题,但是如果没有选中,则应该有错误。

此验证也适用于ajax,即当用户检查/取消检查时,错误消息应该消失/出现。

因此,我将两个复选框绑定到UISelectBoolean个元素,并为每个元素添加了验证器。在验证器中,我检查第二个复选框的值,如果为false,并且当前复选框也设置为false,则生成errormessage。 Smth喜欢:

if (newValue == false && secondCheckbox.getValue() == false) {
  throw new ValidationException();
}

问题是当用户取消选中页面上的复选框,而另一个也未选中时,此错误值不会转到模型,也不转到UISelectBoolean。

情景:

  1. 最初两者都未经检查
  2. 用户检查复选框1。
  3. newValuetrue,所以这是有效的,转到UISelectBoolean和model。
  4. 用户取消选中复选框1。 Checkbox2为falsenewValuefalse,因此会引发异常。 由于验证失败,此false值不会转到模型,也不会转到UISelectBoolean元素。
  5. 用户检查复选框2。 True值转到模型和UISelectBoolean。
  6. 用户取消选中复选框2。 Checkbox1仍在页面上未选中,但在模型和UISelectBoolean中仍然有true。因此验证通过并且没有错误消息。在页面上,两个复选框都未选中,但在模型中复选框1仍为true
  7. 如何解决这样的问题?

1 个答案:

答案 0 :(得分:1)

考虑<h:selectManyCheckbox required="true">。这是一个启动示例:

<h:form>
    <h:selectManyCheckbox id="options" value="#{bean.checked}" required="true">
        <f:selectItems value="#{bean.options}" />
        <f:ajax render="optionsMessage" />
    </h:selectManyCheckbox>
    <h:message id="optionsMessage" for="options" />

    <h:commandButton value="Submit" action="#{bean.submit}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
    <h:messages globalOnly="true" />
</h:form>

使用

@ManagedBean
@RequestScoped
public class Bean {

    private List<String> checked;
    private List<String> options = Arrays.asList("first", "second");

    public void submit() {
        System.out.println("Checked: " + checked);
    }

    // ...
}

f:ajax在这里运作正常。可能您使用event="click"而不是(默认)event="valueChange",这将导致渲染后不会保留复选标记。在检查标记可视化设置之前,即调用click。渲染将阻止可视化设置的复选标记。