在JSF中按ID查找组件

Tap*_*ose 46 jsf uicomponents primefaces jsf-2

我想UIComponent通过我提供的id从托管bean中找到一些.

我写了以下代码:

private UIComponent getUIComponent(String id) {  
      return FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ;  
}
Run Code Online (Sandbox Code Playgroud)

我已经定义了一个p:inputTextarea:

<p:inputTextarea id="activityDescription" value="#{adminController.activityDTO.activityDescription}" required="true" maxlength="120"
    autoResize="true" counter="counter" counterTemplate="{0} characters remaining." cols="80" rows="2" />
Run Code Online (Sandbox Code Playgroud)

现在,如果在getUIComponent("activityDescription")返回方法时调用该方法null,但如果我将其调用,getUIComponent("adminTabView:activityForm:activityDescription")那么我可以获取该org.primefaces.component.inputtextarea.InputTextarea实例.

有没有办法让组件只有id,即"activityDescription"不是绝对id,即"adminTabView:activityForm:activityDescription"?

Ner*_*rve 45

您可以使用以下代码:

public 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 != null 
                && component.getId() != null 
                && component.getId().equals(id)) {
                found[0] = component;
                return VisitResult.COMPLETE;
            }
            return VisitResult.ACCEPT;              
        }
    });

    return found[0];

}
Run Code Online (Sandbox Code Playgroud)

此代码将只找到id您传递的树中的第一个组件.如果树中有2个具有相同名称的组件,则必须执行自定义操作(如果它们位于2个不同的命名容器下,则可以这样做).

  • 在针对JSF API进行编译时,不可能使用`FullVisitContext`.但是,可以使用`VisitContext.createVisitContext(FacesContext.getCurrentInstance())`创建访问上下文. (7认同)