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

时间:2013-11-21 01:56:04

标签: 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>

豆:

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

2 个答案:

答案 0 :(得分:6)

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

因此,<p:tabView var>运行时<ui:include>不可用。此问题在此答案中详细说明:JSTL in JSF2 Facelets... makes sense?<ui:include>是一个标记处理程序,因此与JSTL标记具有相同的生命周期。)

您可以使用<c:forEach>生成<p:tab>而不是<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

答案 1 :(得分:0)

上述社区的答案不适用于动态tabView

message

如果我对选项卡使用dynamic =“ true”和c:foreach,则当我添加或删除选项卡时,请更新@ tabViewId,tabview将重新加载“现有选项卡的所有内容” =>这不是属性“动态”的工作,这不是偷懒。

我的项目对此有疑问,我不得不自定义TabViewRenderer的encodeEnd方法并执行其他操作,但这并不简单。

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