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

JSF2:如何验证两个相关复选框?,jsf,validation,jsf-2,Jsf,Validation,Jsf 2,我在JSF2中有一个表单,有两个复选框()。至少应检查其中一个。两个都选中也可以,但如果没有选中,则应该有错误 这种验证应该也适用于ajax,即当用户选中/取消选中时,错误消息应该消失/出现 因此,我将这两个复选框绑定到UISelectBoolean元素,并为每个元素添加了验证器。在验证器中,我检查第二个复选框的值,若它为false,并且当前复选框也设置为false,则生成errormessage。Smth类似: if (newValue == false && secondCh

我在JSF2中有一个表单,有两个复选框(
)。至少应检查其中一个。两个都选中也可以,但如果没有选中,则应该有错误

这种验证应该也适用于ajax,即当用户选中/取消选中时,错误消息应该消失/出现

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

if (newValue == false && secondCheckbox.getValue() == false) {
  throw new ValidationException();
}
问题是,当用户取消选中页面上的复选框,而另一个复选框也未选中时,此假值不会进入模型,也不会进入UISelectBoolean事件

情景:

  • 最初,两者都未选中
  • 用户检查复选框1
  • newValue
    true
    ,因此这是有效的,转到UISelectBoolean and model
  • 用户取消选中复选框1。复选框2为
    false
    newValue
    false
    ,因此引发异常。 由于验证失败,此
    false
    值不会进入模型,甚至不会进入布尔元素
  • 用户检查复选框2
    True
    值将转到模型并选择布尔值
  • 用户取消选中复选框2。页面上的复选框1仍处于未选中状态,但在模型和UISelectBoolean中仍存在
    true
    。因此验证通过,并且没有错误消息。在页面上,两个复选框均未选中,但在型号中,复选框1仍为
    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
    @请求范围
    公共类Bean{
    检查私人名单;
    私有列表选项=Arrays.asList(“第一”、“第二”);
    公开作废提交(){
    System.out.println(“选中:“+Checked”);
    }
    // ...
    }
    
    f:ajax
    在这里工作得很好。您可能使用了
    event=“click”
    而不是(默认)
    event=“valueChange”
    ,这将导致在渲染后不会保留复选标记。
    单击
    即在复选标记设置之前调用。渲染将阻止在视觉上设置复选标记。

    请考虑
    。以下是一个启动示例:

    <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
    @请求范围
    公共类Bean{
    检查私人名单;
    私有列表选项=Arrays.asList(“第一”、“第二”);
    公开作废提交(){
    System.out.println(“选中:“+Checked”);
    }
    // ...
    }
    

    f:ajax
    在这里工作得很好。您可能使用了
    event=“click”
    而不是(默认)
    event=“valueChange”
    ,这将导致在渲染后不会保留复选标记。
    单击
    即在复选标记设置之前调用。渲染将阻止在视觉上设置复选标记。

    您不能使用
    的任何原因?是的,我不知道:)谢谢!我能补充一下吗?看起来f:ajax不起作用。请参阅答案。提示:若要通知其他人关于非自己帖子的评论回复,请使用
    @昵称
    。另请参见,否则,您将依赖于他们在以后查看问题的热情。您不能使用
    的任何原因?是的,我不知道:)谢谢!我能补充一下吗?看起来f:ajax不起作用。请参阅答案。提示:若要通知其他人关于非自己帖子的评论回复,请使用
    @昵称
    。另请看,否则,您将依赖于他们的热情,以便在以后的时间回顾问题。谢谢@BalusC!:)我唯一的问题是,我在另一个表中创建了一个。比我在该元素后放置的任何内容都显示在表的复选框下面。有没有办法在“之后”表格中显示它?我的意思是在同一级别,在复选框表的右侧。使用CSS将其设置为
    display:inline或<代码>浮动:左侧。战斧的
    也可能有帮助。你可以在任何你想要的地方定位。所以,完全控制标记。谢谢@BalusC!:)我唯一的问题是,我在另一个表中创建了一个。比我在该元素后放置的任何内容都显示在表的复选框下面。有没有办法在“之后”表格中显示它?我的意思是在同一级别,在复选框表的右侧。使用CSS将其设置为
    display:inline或<代码>浮动:左侧。战斧的
    也可能有帮助。你可以在任何你想要的地方定位。因此,完全控制标记。