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 варианта:
-
отключить частичное сохранение состояния для конкретного вида:
<context-param> <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> <param-value>/news.xhtml</param-value> </context-param>
изменить на
@RequestScoped
bean и использовать<f:param>
и@ManagedProperty
для поддержания состояния через обратные связи по запросу параметры.
был бы третий вариант, если JSF 2.2 доступен: просто обновите до JSF 2.2. Они исправили проблему куриного яйца с учетом бобов и частичного сохранения состояния.