2012-08-29 89 views
7

我需要在应用程序启动时访问jsf页面组件树。我在网上发现这个源从xhtml文件创建jsf视图/组件树

UIViewRoot viewRoot = context.getApplication().getViewHandler().createView(context, "/path/to/some.xhtml"); 

但是生成的viewRoot没有任何子节点。 有没有人知道最好的办法是什么?

谢谢。

回答

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.