Primefaces несколько динамических панелей контента для отображения

я пытаюсь сделать своего рода простую настраиваемую страницу просмотра новостей в моем веб-приложении, например Google один но гораздо проще, с кадрами. Каждый объект кадра просто имеет свой заголовок и url-адрес, который будет добавлен в качестве его содержимого.

я использую JSF и на основе схемы PrimeFaces, оба на их самых новых версиях. Итак, мой бэк-Бин, который @ViewScoped, имеет доступ к зарегистрированному пользователю, который хранится в @SessionScoped bean, и у этого пользователя есть соответствующие фреймы нагруженный.

проблема возникает, когда я пытаюсь повторить ее над @ViewScoped Боб, потому что единственный способ, который я нахожу, чтобы сделать это с c:forEach тег. Вот как я это делаю:--25-->

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:fn="http://java.sun.com/jsp/jstl/functions">
<h:form>
    <p:panel header="Noticias">
        <h:panelGrid columns="#{fn:length(navegableHomeManager._UserFrames)}"
            width="100%">
            <c:forEach var="frame" items="#{navegableHomeManager._UserFrames}">
                <p:column>
                    <p:panel header="#{frame._Name}" closable="true"
                        style="width:95%;height:500px;" id="#{frame._Name}">
                        <p:ajax event="close"
                            listener="#{navegableHomeManager.actionFrameClosed}" />
                        <ui:include src="#{frame._Path}" />
                    </p:panel>
                </p:column>
            </c:forEach>
        </h:panelGrid>
    </p:panel>
</h:form>

эта итерация явно не работает с navegableHomeManager Боб, потому что он является @ViewScoped. Таким образом, bean будет перестроен в каждой из итераций. Решение я достиг использует другой @SessionScoped зерен между navegableHomeManager и loggedBean, так что кадры хранятся там и я может иметь доступ к ним должным образом в итерации. Это работает с кодом выше.

однако я не думаю, что это должно быть обязательно использовать @SessionScoped bean (создание определенного компонента для каждого отдельного случая) каждый раз, когда я хочу повторить таким образом. вот почему я попытался использовать компоненты, чтобы избежать итерации.

<p:dataGrid columns="#{fn:length(navegableHomeManager._UserFrames)}"
            value="#{navegableHomeManager._UserFrames}" var="frame">
    <p:column>
        <p:panel header="#{frame._Name}" closable="true"
                    style="width:95%;height:500px;">
            <p:ajax event="close"
                        listener="#{navegableHomeManager.actionFrameClosed}" />
            <ui:include src="#{frame._Path}" />
        </p:panel>
    </p:column>
</p:dataGrid>

он не работает ни когда Боб @ViewScoped или @SessionScoped, потому что даже свойства рамы установлен, ui:include тег уже построен без пути назначения, поэтому я не могу отобразить путь назначения динамически. Я думаю, что как ui:include применяется одновременно с c:forEach, С помощью c:forEach тег действительно единственный способ пройти через это.

объедините свои идеи.

обновление

здесь я публикую больше в XHTML код, чтобы помочь в понимании контекста. Страница нового интегрирована в шаблон. Это целевая страница (/системы/домашний/индекс.в XHTML):

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
template="/templates/general_template.xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">

<ui:define name="metadata">
    <f:event type="preRenderView"
        listener="#{navegableHomeManager.initialize}" />
</ui:define>

<ui:define name="general_content">
    <ui:include src="/system/home/home_view.xhtml" />
</ui:define>

и именно так я и пытался это сделать, но не делал c:forEach тег для работы:

<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/system/home/index.xhtml</param-value>
</context-param>

и это заголовок backing bean:

@ManagedBean
@ViewScoped
@URLMapping(id = "home", pattern = "/home", viewId = "/system/home/index.xhtml")
public class NavegableHomeManager extends SystemNavegable {

/**
 * 
 */
private static final long serialVersionUID = 6239319842919211716L;

@ManagedProperty(value = "#{loggedBean}")
private LoggedBean _LoggedBean;

//More stuff

1 ответов


палкой <c:forEach>. Он делает работу, которую вы ищете. The <ui:include> выполняется во время построения представления, поэтому тег итерации также должен выполняться во время построения представления.

как @ViewScoped проблема с бобами, у вас есть 2 варианта:

  1. отключить частичное сохранение состояния для конкретного вида:

    <context-param>
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
        <param-value>/news.xhtml</param-value>
    </context-param>
    
  2. изменить на @RequestScoped bean и использовать <f:param> и @ManagedProperty для поддержания состояния через обратные связи по запросу параметры.

был бы третий вариант, если JSF 2.2 доступен: просто обновите до JSF 2.2. Они исправили проблему куриного яйца с учетом бобов и частичного сохранения состояния.