在JSF中按ID查找組件


Answers

也許這是不可能的。 FacesContext.getCurrentInstance().getViewRoot().findComponent(id)方法只返回一個UIComponent 。 ViewRoot被構造為樹,因此如果視圖中有兩個表單,每個表單都有一個id="text"的組件,它們將把它的父組件添加到id中,這樣它們就不會發生衝突。 如果將兩個id="text"組件放在同一個表單中,則會拋出java.lang.IllegalStateException

如果要查找具有搜索到的id的所有組件,可以編寫一個實現的方法:

List<UIComponent> foundComponents = new ArrayList();
for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) {
    if(component.getId().contains("activityDescription")){
        foundComponents.add(component);
    }
}

或者,如果要查找第一個匹配項:

UIComponent foundComponent;
for(UIComponent component: FacesContext.getCurrentInstance().getViewRoot().getChildren()) {
    if(component.getId().contains("activityDescription")){
        foundComponent = component;
        break;
    }
}
Question

我想通過我提供的id從託管bean中找到一些UIComponent

我寫了以下代碼:

private UIComponent getUIComponent(String id) {  
      return FacesContext.getCurrentInstance().getViewRoot().findComponent(id) ;  
}

我已經將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" />

現在,如果調用方法作為getUIComponent("activityDescription")它返回null ,但如果我將其稱為getUIComponent("adminTabView:activityForm:activityDescription")那麼我可以獲取org.primefaces.component.inputtextarea.InputTextarea實例。

有沒有辦法讓組件只有id,即“activityDescription”不是絕對id,即“adminTabView:activityForm:activityDescription”?




只需將prependId="false"放入此textarea所在的表單中即可。




Links