JSF在"ui:include src ="#{bean.pagePath}中动态包含src

Mar*_*pan 4 jsf primefaces tabview uiinclude

我尝试在不同的选项卡中使用ui:include标记包含多个源页面路径.问题是当我将源页面路径视为静态时,意味着将显示页面,但如果从支持bean提供源页面路径意味着它将不包括页面.

这是我的代码

template.xhtml:

    <p:layoutUnit position="center" id="layoutCenter">
                <h:form id="tempFormId">
                    <p:tabView value="#{multiTabBean.tabsList}" var="useCase"
                        activeIndex="#{multiTabBean.activeTabIndex}">
                        <p:tab title="#{useCase.title}" closable="true">
                            <f:subview>
                                <h:panelGroup id="mainTempPanelGroupId" layout="block">
                                    <ui:include src="#{useCase.path}" />
                                </h:panelGroup>

                            </f:subview>
                        </p:tab>
                    </p:tabView>
                </h:form>
            </p:layoutUnit>
Run Code Online (Sandbox Code Playgroud)

豆:

public String menuAction() {                    
    menuBtnRendered = true;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    selectedModuleViewId = externalContext.getRequestParameterMap().get(
            "moduleViewId");

    tabsList.add(new Tab(getTabId(selectedModuleViewId),
                selectedModuleViewId, getModulePath(selectedModuleViewId)));        

    return null;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用@ViewScoped.

Bal*_*usC 7

<ui:include>在视图构建时运行(当XHTML转换为JSF组件树时).<p:tabView>在视图渲染时运行(当JSF组件树需要生成HTML时).

因此,运行<p:tabView var>时不可用<ui:include>.这个问题在这个答案中详细说明:JSF2 Facelets中的JSTL有意义吗?(<ui:include>是一个taghandler,因此与JSTL标签具有相同的生命周期).

您可以通过使用<c:forEach>生成<p:tab>s代替而在一定程度上解决这个问题<p:tabView value>.

<p:tabView activeIndex="#{multiTabBean.activeTabIndex}">
    <c:forEach items="#{multiTabBean.tabsList}" var="useCase" varStatus="loop">
        <p:tab title="#{useCase.title}" closable="true">
            <f:subview id="tab_#{loop.index}">
                <h:panelGroup id="mainTempPanelGroupId" layout="block">
                    <ui:include src="#{useCase.path}" />
                </h:panelGroup>
            </f:subview>
        </p:tab>
    </c:forEach>
</p:tabView>
Run Code Online (Sandbox Code Playgroud)

有趣的是,你看到你<f:subview>在初始尝试中以某种方式使用它在那里完全无用(已经考虑过<p:tabView var>),但它实际上在这里有用(它NamingContainer在选项卡内容周围创建了一个新的).