我有以下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}"/>
答案 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;
它会起作用。