2010-11-29 7 views
5

यह पहले-invokeApplication-phaselistener में managedbean होने वाली मार डाला के लिए एक संदर्भ पाने के लिए संभव है?जेएसएफ 2: चरण श्रोता ऑब्जेक्ट में प्रबंधित बीन का उदाहरण एक्सेस करना?

आह्वान आवेदन चरण से पहले, यह स्पष्ट किया जाना चाहिए जो managedBean कि विधि निष्पादित करने के लिए जा रहा है।

उदाहरण के लिए, वहाँ 1 JSF पेज को संभालने के लिए 1 का प्रबंधन मुख्य सेम मान।

तो क्या मैं जरूरत मूल रूप से है: मेनू

  • क्योंकि यह मेनू से ऐक्सेस किया है से

    1. उपयोगकर्ता पहुँच कार्यक्रम, मुख्य प्रबंधन में फली की init() विधि की तैयारी की तरह सामान को प्रारंभ करने के लिए बुलाया जाता है डेटा, प्राधिकरण कर जाँच करता है
    2. बाद प्रविष्टियों पर न जब तक यह लागू करने के लिए बिंदु # मेनू

    से reaccessed है init() विधि अब और कॉल करने की आवश्यकता 2, चरणों

    मैं चरणों कार्यान्वयन में कामयाब रहे सेम करने के बारे में एपीआई डॉक्स देख लिया है में से एक में अवरोध डालने के im सोच, लेकिन मैं सके किसी भी खोजने के लिए लग रहे हैं।

    इस सवाल लिखने के बाद, मैं मैं @PostConstruct या प्रबंधित सेम के निर्माता में ऐसा कर सकता है एहसास है, लेकिन यह पहली बार सेम का निर्माण किया है पर केवल करना होगा, और मेरी जरूरत कॉल करने के लिए विधि हर JSF है मेनू से पहुंचा जा रहा है।

    कोई सुझाव?

    सादर,
    अल्बर्ट Kam

  • उत्तर

    3

    आप ELContext/ELResolver के माध्यम से अपने प्रबंधित सेम पहुँच सकते हैं। यह MyFaces wiki (वेनिला जेएसएफ में भी काम करता है) में अच्छी तरह से समझाया गया है।

    उदाहरण के लिए:

    ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
    NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
        .getELResolver().getValue(elContext, null, "neededBean"); 
    

    अन्य JSF संस्करणों के लिए अधिक विवरण के लिए MyFaces wiki entry, और कार्यान्वयन देखें।

    @PostConstruct का उपयोग करने का आपका विचार एक अच्छा एक है। @ViewScoped पसंद किए गए किसी चीज़ को अपना दायरा बदलने पर विचार करें, इसलिए जब भी आप उस दृश्य पर नेविगेट करते हैं तो तर्क निष्पादित होता है।

    इसके अलावा, (JSF 2 के लिए) PreRenderViewEvent पर एक नजर है। यह कोड आपके facelet पेज में एम्बेडेड है:

    <f:metadata> 
    <f:viewParam name="foo" value="#{bean.foo}"/> 
    <f:event type="preRenderView" listener="#{bean.doSomething}"/> 
    </f:metadata> 
    

    च: घटना श्रोता हर पृष्ठ को देखने से पहले मार डाला जाता है।

    +0

    वाह, इतने सारे विकल्प। धन्यवाद ! – bertie

    +1

    मुझे नहीं लगता कि यह वास्तव में कैसे कार्य करता है जो क्रिया विधि में शामिल है। आपके दृष्टिकोण की आवश्यकता है कि बीन नाम पहले से ही पहले से ही ज्ञात है। वैसे, मैं ['आवेदन # मूल्यांकन ExpressionGet()'] पसंद करता हूं (http://download.oracle.com/javaee/6/api/javax/faces/application/Application.html#evaluateExpressionGet%28javax.faces.context FacesContext,% 20java.lang.String,% 20java.lang.Class% 29) 'ELResolver/ELContext' के बजाय शॉर्टैंड। यह भी देखें [यह उत्तर] (http://stackoverflow.com/questions/2633112/jsf-get-managed-bean-by-name)। – BalusC

    +0

    ठीक है, अगर उसका चरण श्रोता आवेदन चरण पहले आने वाले कार्यक्रम में सुन रहा है, तो चरण श्रोता ऑब्जेक्ट इंस्टेंस को तुरंत चालू करेगा। यह वही उदाहरण आवेदन विधि (जिसे चालान आवेदन चरण के दौरान बुलाया जाता है) में संदर्भित किया जाएगा, क्योंकि प्रबंधित अभी भी दायरे में है (उसी अनुरोध)। मैंने सवाल कैसे किया कि यह कैसे करें, लेकिन मैं इसे सबसे अच्छा समाधान के रूप में समर्थन नहीं देता हूं। मैंने विकल्प प्रदान किए जो अंतिम लक्ष्य को प्राप्त करने के लिए बेहतर अनुकूल लगते हैं। –

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