Java 以编程方式创建<;ui:include src="&引用/&燃气轮机;豆荚

Java 以编程方式创建<;ui:include src="&引用/&燃气轮机;豆荚,java,jsf,facelets,Java,Jsf,Facelets,在JSF页面中,我有: <h:form id="form"> <h:panelGroup id="content" layout="block"/> </h:form> 在Java SessionScoped bean中,我有一个方法: public void fillContent() { UIComponent content = FacesContext.getCurrentInstance().getViewRoot().findCo

在JSF页面中,我有:

<h:form id="form">
   <h:panelGroup id="content" layout="block"/>
</h:form>

在Java SessionScoped bean中,我有一个方法:

public void fillContent()
{
   UIComponent content = FacesContext.getCurrentInstance().getViewRoot().findComponent("form:content");
   content.getChildren().clear();
   content.getChildren().add(/*New <ui:include src="Page.xhtml"/>*/);
}
public void fillContent()
{
UIComponent content=FacesContext.getCurrentInstance().getViewRoot().findComponent(“形式:内容”);
content.getChildren().clear();
content.getChildren().add(/*New*/);
}
插入
作为
内容
子项的Java代码是什么? 在哪里可以找到所有JSF Java名称的映射列表


谢谢

不幸的是,ui:include是作为标记处理程序实现的。这意味着在构建组件树并且没有相应的UIComponent类时,将对其进行评估和执行

为了实现您的目标,您必须在保留对FaceletContext的引用(该引用在树构造期间可访问)之后,使用类似javax.faces.view.facelets.facelets上下文#includeFacelet的FaceletAPI。这不是一个简单的方法,我强烈建议您重新表述您的问题并寻找另一个解决方案

我不知道有任何关于标记组件/处理程序映射的官方指南,但我相信像“CoreJavaServerFaces”这样的书会对此有所帮助

首先,您可以尝试在facelets中执行此操作,例如:

<h:form id="form">
  <ui:include src="#{content.path}"/>
</h:form>


我认为primefaces没有提供任何额外的解决方案。为什么必须以编程方式更改视图?在facelets中这样做应该会容易得多。如何?你能解释一下吗?我用过它,它“只起了一点作用”,我的意思是加载页面(都是Ajax,没有刷新),但页面内容不起作用,当我重新加载页面时,它抛出一个ClassCastException:无法将primefaces.AjaxBehavior转换为java.util.List。不知道如何才能正常工作:(恐怕您的问题没有足够的细节来正确回答。如果所有包含的变体都是预先知道的,最安全的方法是为每个变体创建一个ui:fragment部分,并通过EL表达式控制其“renderer”属性。