我试图访问一个icefaces组件,确切地说一个Accordion,所以我可以从我的bean设置它的activeIndex。问题是返回值总是空的。这是我的代码。
public static UIComponent findComponentInRoot(String id) {
UIComponent component = null;
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext != null) {
UIComponent root = facesContext.getViewRoot();
component = findComponent(root, id);
}
return component;
}
public static UIComponent findComponent(UIComponent base, String id) {
if (id.equals(base.getId()))
return base;
UIComponent kid = null;
UIComponent result = null;
Iterator kids = base.getFacetsAndChildren();
while (kids.hasNext() && (result == null)) {
kid = (UIComponent) kids.next();
if (id.equals(kid.getId())) {
result = kid;
break;
}
result = findComponent(kid, id);
if (result != null) {
break;
}
}
return result;
}
我这样调用这个方法:
Accordion acco = (Accordion)findComponentInRoot("menuFormId:menu");
我的页面看起来是这样的,或者说是它的一部分:
<h:form id="menuFormId">
<icecore:singleSubmit />
<ace:accordion id="menu" collapsible="true" autoHeight="false" >
<ace:accordionPane id="system" title="#{msgs.LABEL_ADMINISTRATION}"
rendered="#{navigationCtrl.functionList['GESUTAD'] or navigationCtrl.functionList['GESPROF'] or navigationCtrl.functionList['GESUTTOM'] or navigationCtrl.functionList['SYNCPRC']}">
<div class="divLinkStyle">
<ice:commandLink rendered="#{navigationCtrl.functionList['GESPROF']}" styleClass="linkMenu" action="#{navigationCtrl.redirectConsulterProfil}"
onmouseover="this.style.backgroundColor='#DEEDF8'" onmouseout="this.style.backgroundColor='#FFFFFF'">
<h:graphicImage value="../resources/images/util.png" />
<h:outputLabel value="#{msgs.LABEL_GESTION_PROFIL}" style="cursor: pointer;" />
</ice:commandLink>
</div>
...
有什么想法吗?
我的bean是会话作用域。
我使用的是icefaces 3.3.0和JSF 2.2
您混淆了组件ID和客户端ID。你正在传递一个客户端ID"menuFormId:menu"而不是组件ID"menu"给你的实用程序方法,而实用程序方法实际上是通过组件ID而不是客户端ID来查找组件。
直接用UIViewRoot#findComponent()
public static UIComponent findComponentInRoot(String id) {
return FacesContext.getCurrentInstance().getViewRoot().findComponent(id);
}
与具体问题无关。你犯了一个设计错误。模型不应该对视图感兴趣。应该反过来才对。将activeIndex
设置为bean属性,并让视图以通常的方式钩住它。
<ace:accordion ... activeIndex="#{bean.activeIndex}">
在任何情况下,你试图在后台bean类中抓取/创建/绑定/操作/任何物理UIComponent
实例,你绝对应该停止编码并三思,如果你真的在做正确的事情。如果你找不到正确的方法,可以在Stack Overflow上询问。