2013-01-25 2 views
6

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> 

: 그건 내가 할 방법입니다. 따라서 빈은 각 반복에서 다시 빌드됩니다. 내가 도달 한 해결책은 navegableHomeManagerloggedBean 사이에 다른 @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 

답변

6

스틱 <c:forEach>. 그것은 당신이 찾고있는 일을합니다. <ui:include>은 뷰 빌드 도중 실행되므로 반복 빌드 태그는 뷰 빌드 도중 실행해야합니다.

  1. 가 특정 뷰에 대한 절약 부분 상태를 해제

    : 다음 @ViewScoped 콩 문제에 관해서는

    , 당신은이 옵션을했습니다 @RequestScoped 콩 및 사용에

    <context-param> 
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
        <param-value>/news.xhtml</param-value> 
    </context-param> 
    
  2. 변경을 <f:param>@ManagedProperty 요청 매개 변수별로 포스트 백간에 상태를 유지합니다.

JSF 2.2를 사용할 수있는 경우 세 번째 옵션이 있습니다. JSF 2.2로 업그레이드하면됩니다. 뷰 범위의 콩에서 부분적으로 상태를 저장하면서 닭고기 달걀 문제를 수정했습니다.

+0

답변 해 주셔서 감사합니다. 어떤 이유로,'context-param' 기반의 솔루션이 작동하지 않습니다. 'navegableHomeManager'는 이제'loggedBean'에서 직접 프레임을 복구하고 있습니다 만'forEach' 태그는'# {fn : length (navegableHomeManager._UserFrames)}'가 '1'을 반환하더라도 iteration을 수행하지 않습니다. 빈은 내가 페이지에 접근했을 때 만들어진다. 안정 버전이 없기 때문에 JSF 2.2로 업그레이드 할 수 없으며 100 % 신뢰할 수 없습니다. –

+0

컨텍스트 매개 변수에 관해서는 분명히 잘못된 뷰 ID를 지정했습니다 (참고 : 뷰 ID는 URL이 아니며 물리적 파일에 대한 컨텍스트 상대 경로이므로 JSF를 매핑 한 경우에도 * .jsf) 뷰 ID에 여전히'.xhtml'을 사용해야합니다). 남은 부분에 관해서는, 지금까지 제공된 정보를 기반으로 문제를 이해하기가 어렵습니다. – BalusC

+0

내 코드 BalusC를 더 추가하여 질문을 업데이트했습니다. 희망이 도움이 될 것입니다. –