Google's one과 같은 간단한 사용자 정의 가능한 뉴스보기 페이지를 프레임과 함께 훨씬 더 단순하게하려고합니다. 각 프레임 객체에는 단순히 제목과 해당 내용으로 추가 할 URL이 있습니다.복수의 동적 내용 패널을 프라임으로 표시합니다.
나는 JSF와 primefaces을 최신 버전으로 사용하고 있습니다. 따라서 내 백업 빈인 @ViewScoped
은 @SessionScoped
빈에 저장된 로그 된 사용자에게 액세스 권한을 가지며 사용자는 해당 프레임을로드합니다.
내가 @ViewScoped
빈을 통해 반복하려고하면 문제가 발생합니다. 그럴 수있는 유일한 방법은 c:forEach
태그입니다. 이 @ViewScoped
때문에 navegableHomeManager
콩 작동하지 않습니다 obviusly 반복
<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
과 loggedBean
사이에 다른 @SessionScoped
빈을 사용하므로 프레임이 거기에 저장되고 반복에 올바르게 액세스 할 수 있습니다. 위의 코드로 작업하고 있습니다.
그러나 그 방법으로 반복 할 때마다 (모든 경우마다 특정 빈을 만드는 것) 콩을 사용하는 것이 반드시 필요하다고 생각하지 않습니다. 그래서 반복을 피하기 위해 구성 요소를 사용해 보았습니다.
<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
태그가 이미없는 대상 경로로 구축 된, 그래서 대상을 렌더링 할 수없는 경우 경로 dinamically. 나는 c:forEach
태그를 사용하여 ui:include
이 동시에 적용되고 있으므로 실제로 이것을 수행하는 유일한 방법이라고 생각합니다.
아이디어를 풀어 라.
UPDATE는 여기 문맥의 이해에 도움이 더 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>
그리고 그것은 백업 빈 헤더의 :
@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
답변 해 주셔서 감사합니다. 어떤 이유로,'context-param' 기반의 솔루션이 작동하지 않습니다. 'navegableHomeManager'는 이제'loggedBean'에서 직접 프레임을 복구하고 있습니다 만'forEach' 태그는'# {fn : length (navegableHomeManager._UserFrames)}'가 '1'을 반환하더라도 iteration을 수행하지 않습니다. 빈은 내가 페이지에 접근했을 때 만들어진다. 안정 버전이 없기 때문에 JSF 2.2로 업그레이드 할 수 없으며 100 % 신뢰할 수 없습니다. –
컨텍스트 매개 변수에 관해서는 분명히 잘못된 뷰 ID를 지정했습니다 (참고 : 뷰 ID는 URL이 아니며 물리적 파일에 대한 컨텍스트 상대 경로이므로 JSF를 매핑 한 경우에도 * .jsf) 뷰 ID에 여전히'.xhtml'을 사용해야합니다). 남은 부분에 관해서는, 지금까지 제공된 정보를 기반으로 문제를 이해하기가 어렵습니다. – BalusC
내 코드 BalusC를 더 추가하여 질문을 업데이트했습니다. 희망이 도움이 될 것입니다. –