2013-01-09 28 views
7

को पुनर्निर्मित करने का कारण बनता है। मुझे किसी अन्य दृश्य स्कॉप्ड बीन में एक दृश्य स्कॉप्ड बीन में सहेजे गए कुछ डेटा का उपयोग करने की आवश्यकता है।एक दृश्य को स्कैन किए गए बीन को एक और दृश्य में डालने से स्कैन किया गया बीन इसे

@ManagedBean 
@ViewScoped 
public class Attivita implements Serializable { 
    // 
} 

और

@ManagedBean 
@ViewScoped 
public class Nota implements Serializable { 

    @ManagedProperty("#{attivita}") 
    private Attivita attivita; 

    // Getter and setter. 
} 

अब, हो सकता है इसके बारे में मेरी सिद्धांत अभी भी काफी खराब है, मैंने देखा है कि जब #{attivita} इंजेक्ट किया जाता है, Attivita निर्माता शुरू हो जाती है और इस प्रकार एक और उदाहरण का निर्माण। क्या यह सही व्यवहार है? अगर मैं एक ही उदाहरण का संदर्भ देना चाहता हूं और नया नहीं बनाना चाहता हूं तो क्या होगा?

+0

सही प्रतिक्रियाओं को चिह्नित करने के बारे में परवाह करें।स्टैक ओवरफ़्लो न केवल उन सवालों के बारे में है जो उत्तर के बारे में हैं। –

उत्तर

13

यह आपको एक पोस्टबैक पर अन्य देखने के लिए एक से नेविगेट कर रहे है, तो क्या होगा । एक दृश्य स्कॉप्ड बीन अनुरोध से बंधे नहीं है, लेकिन एक दृश्य के लिए। तो जब आप एक नए दृश्य पर नेविगेट करते हैं, तो इसे दृश्य स्कैन बीन का एक नया नया उदाहरण मिलेगा। यह उसी बीन उदाहरण का पुन: उपयोग नहीं करेगा जो पिछले दृश्य से जुड़ा हुआ है।

मुझे लगता है कि attivita बीन प्रारंभिक दृश्य पर बनाया गया है और पोस्टबैक पर पुन: उपयोग किया गया है। मैं समझता हूं कि nota बीन नए दृश्य से जुड़ा हुआ है जहां आप नेविगेट कर रहे हैं। जब attivita इंजेक्शन करते हैं, तो यह एक नया और विशिष्ट उदाहरण प्राप्त करेगा, भले ही एक ही अनुरोध में एक और उदाहरण हो। यह सब उम्मीद है (और स्वीकार्य रूप से थोड़ा अचूक) व्यवहार।

इसके लिए कोई मानक जेएसएफ समाधान नहीं है। सीडीआई @ConversationScoped के साथ हल करता है (बीन जीवन तब तक रहता है जब तक आप इसे स्पष्ट रूप से रहने के लिए कहते हैं) और सीडीआई एक्सटेंशन माईफेसेस सीओडीआई @ViewAccessScoped (बीन लाइफ जब तक नेविगेटेड व्यू संदर्भित करता है) के साथ थोड़ा आगे जाता है।

हालांकि आप अनुरोध दायरे में एक विशेषता के रूप में बीन को संग्रहीत करके इसे काम कर सकते हैं।

@ManagedBean 
@ViewScoped 
public class Attivita implements Serializable { 

    public String submit() { 
     FacesContext.getCurrentInstance().getExternalContext() 
      .getRequestMap().put("attivita", this); 
     return "nota"; 
    } 

} 

और

@ManagedBean 
@ViewScoped 
public class Nota implements Serializable { 

    private Attivita attivita; 

    @PostConstruct 
    public void init() { 
     attivita = (Attivita) FacesContext.getCurrentInstance().getExternalContext() 
      .getRequestMap().get("attivita"); 
    } 

} 

ध्यान दें कि यह नहीं बल्कि hacky है। कंक्रीट कार्यात्मक आवश्यकता के आधार पर बेहतर समाधान हो सकते हैं। यह भी ध्यान रखें कि आपको nota वांछित Attivita बीन उदाहरण #{nota.attivita} और #{attivita} के रूप में संदर्भ संदर्भ में होना चाहिए, क्योंकि यह आपको पहले से समझाए गए कारणों के लिए एक नया और अलग उदाहरण देगा।

+0

यह निश्चित रूप से काम करता है - मुझे एक ही समस्या थी। हालांकि, जैसा कि आपने कहा है, यह बहुत हैकी है, और अभी तक जेएसएफ की एक और बड़ी कमी है। यह एक तरह से CDI या प्रबंधित गुण के प्रयोजन के समाप्त आप एक PostConstruct जोड़ने के लिए और मैन्युअल रूप से चेहरे संदर्भ से बाहर एक सेम निकालने के लिए जब। वहाँ @ViewAccessScoped मानक JSF एपीआई को जोड़ा गया और न केवल Myfaces के हिस्से के रूप के लिए एक योजना है? – GreenieMeanie

+0

@GreenieMeanie: JSF 2.2 इस कवर करने के लिए जोड़ा '@ FlowScoped', लेकिन दुर्भाग्य से यह अभी भी, एक्सएमएल विन्यास और स्वत: जनरेट अनुरोध पैरामीटर का एक सा की आवश्यकता है, क्योंकि यह भी प्राप्त अनुरोधों जीवित रहने के लिए की जरूरत है। यह कहता है, '@ ViewAccessScoped' और' @ सत्र स्कोप्ड 'के बीच। एक संभावित "बेहतर समाधान" के रूप में, तुम सिर्फ परम के रूप में साथ इकाई आईडी यह रीडायरेक्ट या सशर्त के साथ एक और शामिल बहुत ही दृश्य का हिस्सा प्रतिपादन के बारे में सोच सकते हैं। ए.ओ. भी देखें http://stackoverflow.com/questions/15521451/how-to-navigate-in-jsf-how-to-make-url-reflect-current-page-and-not-previous-o – BalusC

+0

आप दृश्य के लिए सुझाव दे रहे हैं ए.एक्सएचटीएमएल में "डमी" में बी.एक्सएचटीएमएल शामिल है और शायद बी.एक्सएचटीएमएल की सभी सामग्री को एक विशाल यूई में लपेटें: खंड जो केवल तब भी प्रस्तुत करता है जब इसे रीडायरेक्ट किया जाता है (b.xhtml के माध्यम से) और जब यह नहीं होता एक .xhtml से एक डमी संदर्भ के रूप में शामिल किया गया? – GreenieMeanie

1

आपका attivita बीन @ViewScoped है और यह गारंटी नहीं देता है कि आपका उदाहरण सत्र में होगा। आपको @SessionScoped बीन की आवश्यकता है। हालांकि, अगर आपको @ViewScoped होने के किसी कारण के लिए attivita की आवश्यकता है, तो आप अन्य तरीकों से उनके माध्यम से पैरा पास कर सकते हैं, उदा। viewParam का उपयोग करके या उनके बीच @SessionScoped बीन का उपयोग कर।

पृष्ठ पैरामीटर

http://mkblog.exadel.com/2010/07/learning-jsf2-page-params-and-page-actions/

JSF 2 प्रबंधित बीन कार्यक्षेत्र

http://balusc.blogspot.com.es/2011/09/communication-in-jsf-20.html#ManagedBeanScopes