JSF dynamically include src in “ui:include src=”#{bean.pagePath}"

前端 未结 2 1777
说谎
说谎 2020-12-03 23:25

I tried to include multiple source page path using ui:include tag in different tabs. The problem is when i gave the source page path as static one means that page will be sh

相关标签:
2条回答
  • 2020-12-03 23:59

    <ui:include> runs during view build time (when XHTML is turned into JSF component tree). <p:tabView> runs during view render time (when JSF component tree needs to produce HTML).

    So, <p:tabView var> isn't available when <ui:include> runs. This problem is detailed in this answer: JSTL in JSF2 Facelets... makes sense? (<ui:include> is a taghandler and has hence same lifecycle as JSTL tags).

    You can solve this to a certain degree by using <c:forEach> to produce <p:tab>s instead of <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>
    

    It's by the way interesting to see that you somehow used <f:subview> in your initial attempt which is completely useless over there (already taken into account by <p:tabView var>), but it's actually helpful in here (it creates a new NamingContainer around the tab content).

    0 讨论(0)
  • 2020-12-04 00:20

    The above Community's answer hasn't worked for dynamic tabView

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

    If i use dynamic="true" and c:foreach for tabs, when i add or remove a tab, do update @tabViewId, the tabview will reload "All content of existed tabs" => this is not the way to attribute "dynamic" work, it's not lazy.

    My project has a problem with this, i had to customize the method encodeEnd of TabViewRenderer and do something else, but it's not simple.

    I wondering whether there is a way to include XHTML templates at rendered time?

    0 讨论(0)
提交回复
热议问题