无论复选框的状态如何,UISelectBoolean isSelected()始终返回false

时间:2014-07-16 19:45:47

标签: jsf

我有以下HTML块:

<div data-enhance="false">
  <label for="qc_20012" data-iconpos="right">Text</label>
  <div class="wrapper">
    <input id="qc_20012" type="checkbox" name="qc_20012">
    <label for="qc_20012"></label>
  </div>
</div>

我只想使用Java提取复选框的状态(isSelected true / false),如下所示:

//id is the id of the HTML input (in this case, qc_20012)
UIComponent uiComponent = findComponent(id);
if (uiComponent instanceof UISelectBoolean) {
    UISelectBoolean comp = (UISelectBoolean) uiComponent;
    //always prints out 'false'
    System.out.println(comp.isSelected());
}

此处findComponent。说实话,我真的不明白在那里发生了什么,所以很可能这就是问题所在。我已经尝试过深入挖掘,但在那里一切看起来都是正确的:

private UIComponent findComponent(final String id) {
    FacesContext context = FacesContext.getCurrentInstance();
    UIViewRoot root = context.getViewRoot();
    final UIComponent[] found = new UIComponent[1];
    root.visitTree(new FullVisitContext(context), new VisitCallback() {
            @Override
            public VisitResult visit(VisitContext context, UIComponent component) {
                if (component.getId() != null && component.getId().equals(id)) {
                    found[0] = component;
                    return VisitResult.COMPLETE;
                }
                return VisitResult.ACCEPT;
            }
        });
    return found[0];
}

无论如何,comp.isSelected()行打印出false。如果在页面上选中,取消选中或取消选中复选框,则无关紧要。

这是启动最终调用此代码的链的实际JSF:

<a4j:commandButton id="#{cc.attrs.id}"
                       value="#{cc.attrs.label}"
                       onclick="#{cc.attrs.onclick}"
                       data="#{cc.attrs.data}"
                       onbegin="#{cc.attrs.onbegin}"
                       onbeforedomupdate="#{cc.attrs.onbeforedomupdate}"
                       oncomplete="#{cc.attrs.oncomplete}"
                       immediate="#{cc.attrs.immediate}"
                       render="#{cc.attrs.render}"
                       execute="#{cc.attrs.execute}"/>

1 个答案:

答案 0 :(得分:-1)

由于您使用的复选框组件不是JSF组件,因此它在JSF组件树中不可用。所以在findComponent()方法中找不到它。替换

  

&lt; input id =“qc_20012”type =“checkbox”name =“qc_20012”/&gt;

  

&lt; h:selectBooleanCheckbox id =“qc_20012”name =“qc_20012”/&gt;

它会起作用。