JSF динамически включает src в ui:include src=#{bean.pagePath}"

Я попытался включить несколько путей исходной страницы, используя тег ui:include на разных вкладках. Проблема в том, что когда я указал путь к исходной странице как статический, это означает, что страница будет отображаться, но если указать путь к исходной странице из резервного компонента, это означает, что он не будет включать страницу.

Вот мой код

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.


person Mariyappan    schedule 21.11.2013    source источник


Ответы (2)


<ui:include> запускается во время сборки представления (когда XHTML превращается в дерево компонентов JSF). <p:tabView> запускается во время рендеринга представления (когда дереву компонентов JSF необходимо создать HTML).

Таким образом, <p:tabView var> недоступен, когда работает <ui:include>. Эта проблема подробно описана в этом ответе: JSTL в JSF2 Facelets... имеет смысл? (<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 вокруг содержимого вкладки).

person BalusC    schedule 21.11.2013

Приведенный выше ответ сообщества не работает для динамического tabView

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

Если я использую dynamic="true" и c:foreach для вкладок, когда я добавляю или удаляю вкладку, обновляйте @tabViewId, вкладка перезагружает "Все содержимое существующих вкладок" => это не способ атрибутировать "динамический "Работать, это не лень.

У моего проекта с этим проблема, пришлось настроить метод encodeEnd у TabViewRenderer и сделать что-то еще, но это не просто.

Мне интересно, есть ли способ включить шаблоны XHTML во время рендеринга?

person hecarim    schedule 12.06.2019