我正在尝试在我的网络应用程序中做一种简单的可定制新闻视图页面,就像谷歌的那样,但更简单,带有框架。每个框架对象都只是有他的标题和一个要作为其内容添加的 url。
我正在使用JSF 和 primefaces,它们都是最新版本。因此,我的支持 bean 可以@ViewScoped
访问已登录的用户,该用户存储在@SessionScoped
bean 中,并且该用户已加载相应的帧。
当我尝试在@ViewScoped
bean 上迭代它时,问题就来了,因为我发现这样做的唯一方法是使用c:forEach
标签。我就是这样做的:
<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
bean,因为它是@ViewScoped
. 因此 bean 将在每次迭代中重建。我达到的解决方案在和@SessionScoped
之间使用了另一个 bean ,因此帧存储在那里,我可以在迭代中正确访问它们。这与上面的代码一起工作。navegableHomeManager
loggedBean
但是,我不认为@SessionScoped
每次我想以这种方式迭代时都必须使用 bean(为每个案例创建一个特定的 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
当 bean 为或时,它也不起作用@SessionScoped
,因为即使设置了框架属性,ui:include
标签也已经构建,没有目标路径,所以我无法动态渲染目标路径。我认为,正如ui:include
与 一样c:forEach
,使用c:forEach
标签确实是解决这个问题的唯一方法。
汇集你的想法。
更新
在这里,我发布了更多的xhtml代码,以帮助理解上下文。新的页面被集成到模板中。那是目标页面(/system/home/index.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>
这就是支持 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