2013-01-25 13 views
6

मैं अपने वेब एप्लिकेशन में Google's one जैसे फ़्रेम के साथ एक बहुत ही सरल अनुकूलन न्यूज़ व्यू पेज करने की कोशिश कर रहा हूं, लेकिन फ्रेम के साथ बहुत आसान है। प्रत्येक फ्रेम ऑब्जेक्ट में बस उसका शीर्षक होता है और इसकी सामग्री के रूप में जोड़ा जाने वाला यूआरएल होता है।प्राइमफ़ेस एकाधिक गतिशील सामग्री पैनल प्रदर्शित किए जाने के लिए

मैं अपने नवीनतम संस्करणों पर जेएसएफ और प्राइमफेस का उपयोग कर रहा हूं। तो मेरा बैकिंग बीन, जो @ViewScoped है, के पास लॉग इन उपयोगकर्ता तक पहुंच है, जो @SessionScoped बीन में संग्रहीत है, और उस उपयोगकर्ता के पास उसके संबंधित फ्रेम लोड हैं।

समस्या तब आती है जब मैं @ViewScoped बीन पर इसे फिर से चलाने की कोशिश करता हूं, क्योंकि मुझे ऐसा करने का एकमात्र तरीका 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> 

कि Obviusly यात्रा navegableHomeManager सेम के साथ काम नहीं करता है, क्योंकि यह @ViewScoped है: इस तरह मुझे क्या करना है। तो बीन प्रत्येक पुनरावृत्तियों में पुनर्निर्मित किया जाएगा। समाधान जो मैंने पहुंचा है बीन 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 टैग पहले से ही कोई गंतव्य पथ के साथ बनाया गया है, तो मैं गंतव्य दिखाया नहीं जा सकता है पथ रूप से पथ। मुझे लगता है कि, को c:forEach के साथ उसी समय लागू किया जा रहा है, c:forEach टैग का उपयोग करके वास्तव में इसका एकमात्र तरीका है।

अपने विचारों को पूल करें।

अद्यतन

यहाँ मैं पोस्ट अधिक एक्सएचटीएमएल संदर्भ की समझ में मदद करने के लिए कोड। नया पृष्ठ एक टेम्पलेट में एकीकृत है। यही कारण है कि पेज जो लक्षित है ( /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 सेम समस्या के रूप में, आप 2 विकल्प है

    <context-param> 
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name> 
        <param-value>/news.xhtml</param-value> 
    </context-param> 
    
  2. यह एक @RequestScoped सेम और प्रयोग करने में बदलें अनुरोध पैरामीटर द्वारा पोस्टबैक में राज्य को बनाए रखने के लिए <f:param> और @ManagedProperty

जेएसएफ 2.2 उपलब्ध होने पर तीसरा विकल्प होगा: बस जेएसएफ 2.2 में अपग्रेड करें। उन्होंने स्कोप्ड बीन्स और आंशिक राज्य की बचत को देखने में चिकन-अंडे की समस्या तय की है।

+0

उत्तर के लिए धन्यवाद। किसी कारण से, 'संदर्भ-परम' आधारित समाधान काम नहीं कर रहा है। 'navegableHomeManager' अब' लॉगबीन 'से सीधे फ्रेम को पुनर्प्राप्त कर रहा है, लेकिन' के लिए 'टैग पुनरावृत्ति नहीं कर रहा है, यहां तक ​​कि '# {fn: length (navegableHomeManager._UserFrames)}' रिटर्न' 1'। बीन केवल तब बनाया जाता है जब मैं पृष्ठ तक पहुंचता हूं, जो सही है। मैं जेएसएफ 2.2 में भी अपग्रेड नहीं कर सकता क्योंकि कोई स्थिर रिलीज नहीं है और मैं 100% पर भरोसा नहीं कर सकता। –

+0

संदर्भ पैरा के रूप में, जाहिर है आपने गलत दृश्य आईडी निर्दिष्ट की है (नोट: एक व्यू आईडी एक यूआरएल नहीं है, यह भौतिक फ़ाइल के संदर्भ-सापेक्ष पथ है, इसलिए यदि आपने अपनी जेएसएफ चीज़ को '* .jsf' पर मैप किया है, आपको अभी भी आईडी में '.xhtml' का उपयोग करना चाहिए)। शेष तक, खेद है कि अब तक प्रदान की गई जानकारी के आधार पर समस्या को समझना मुश्किल है। – BalusC

+0

मैंने अपने कोड BalusC के अधिक कोड जोड़ने के सवाल को अद्यतन किया है। उम्मीद है कि यह मदद करेगा। –

संबंधित मुद्दे