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



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

这是我的代码

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>

bean:

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;
}

我正在使用@ViewScoped

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

因此,当<ui:include>运行时,<p:tabView var>不可用。这个问题在这个答案中有详细说明:JSF2 Facelets中的JSTL。。。有道理吗?(<ui:include>是一个标签处理程序,因此具有与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>

顺便说一句,有趣的是,您在最初的尝试中以某种方式使用了<f:subview>,这在那里是完全无用的(<p:tabView var>已经考虑到了),但在这里它实际上很有帮助(它围绕选项卡内容创建了一个新的NamingContainer)。

以上社区的答案对动态tabView 无效

<p:tabView dynamic="true" ...

如果我使用dynamic="true"和c:foreach作为选项卡,当我添加或删除选项卡时,更新@tabViewId,选项卡视图将重新加载"所有已存在选项卡的内容"=>这不是将"动态"工作属性化的方法,它不是懒惰的。

我的项目有一个问题,我不得不自定义TabViewRenderer的方法encodeEnd并做其他事情,但这并不简单。

我想知道是否有一种方法可以在渲染时包含XHTML模板?

最新更新