我想找一些UIComponent
通过我提供的 id 从托管 bean 中获取。
我编写了以下代码:
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”?
最佳答案
您可以使用以下代码:
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
&& id.equals(component.getId())) {
found[0] = component;
return VisitResult.COMPLETE;
}
return VisitResult.ACCEPT;
}
});
return found[0];
}
此代码将仅查找树中具有您传递的 id
的第一个组件。如果树中有 2 个具有相同名称的组件,您将必须执行一些自定义操作(如果它们位于 2 个不同的命名容器下,则这是可能的)。
关于jsf - 在 JSF 中通过 ID 查找组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14378437/