我需要在应用程序启动时访问jsf页面组件树。我在网上找到了这个来源
UIViewRoot viewRoot = context.getApplication().getViewHandler().createView(context, "/path/to/some.xhtml");
但生成的viewRoot没有任何子项。 有谁知道最好的方法是什么?
感谢。
答案 0 :(得分:4)
您忘记了构建视图。您可以使用ViewDeclarationLanguage#buildView()
。以下是javadoc(强调我的)的摘录:
采取针对此VDL实施的任何操作,以导致必须通过调用
createView(javax.faces.context.FacesContext, java.lang.String)
创建的参数UIViewRoot
,填充子项。
因此,这应该做:
String viewId = "/path/to/some.xhtml";
FacesContext context = FacesContext.getCurrentInstance();
ViewHandler viewHandler = context.getApplication().getViewHandler();
UIViewRoot view = viewHandler.createView(context, viewId);
viewHandler.getViewDeclarationLanguage(context, viewId).buildView(context, view);
// view should now have children.
您还可以直接使用ViewDeclarationLanguage#createView()
创建视图,而不是ViewHandler#createView()
简写。
String viewId = "/path/to/some.xhtml";
FacesContext context = FacesContext.getCurrentInstance();
ViewDeclarationLanguage vdl = context.getApplication().getViewHandler().getViewDeclarationLanguage(context, viewId);
UIViewRoot view = vdl.createView(context, viewId);
vdl.buildView(context, view);
// view should now have children.