सही बीन गुंजाइश कैसे चुनें?


381

मैंने देखा कि अलग-अलग बीन स्कोप हैं जैसे:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

प्रत्येक का उद्देश्य क्या है? मैं अपने बीन के लिए एक उचित गुंजाइश कैसे चुनूं?


courses.coreservlets.com/Course-Materials/pdf/jsf/jsf2/… पेज 6 पर एक विवरण है
याकूब

जवाबों:


485

परिचय

यह बीन के दायरे (जीवनकाल) का प्रतिनिधित्व करता है। यह समझना आसान है कि क्या आप एक बेसिक सर्वलेट वेब एप्लिकेशन के "अंडर द कवर्स" से परिचित हैं: सर्वलेट्स कैसे काम करते हैं? तात्कालिकता, सत्र, साझा चर और मल्टीथ्रेडिंग


@Request/View/Flow/Session/ApplicationScoped

एक @RequestScopedसेम लंबे (ध्यान दें कि एक एकल HTTP अनुरोध के रूप में एक Ajax अनुरोध मायने रखता है भी) एक एकल HTTP अनुरोध-प्रतिक्रिया चक्र के रूप में के रूप में रहता है। एक @ViewScopedसेम रूप में लंबे समय रहता है के रूप में आप जो लौटने कॉल कार्रवाई तरीकों Postbacks द्वारा एक ही JSF दृश्य के साथ सहभागिता कर रहे हैं null/ voidकिसी भी नेविगेशन / पुनर्निर्देशित बिना। @FlowScopedजब तक आप प्रवाह कॉन्फ़िगरेशन फ़ाइल में पंजीकृत विचारों के निर्दिष्ट संग्रह के माध्यम से नेविगेट कर रहे हैं, तब तक एक बीन रहता है। एक @SessionScopedबीन स्थापित HTTP सत्र के रूप में लंबे समय तक रहता है। एक @ApplicationScopedबीन तब तक रहता है जब तक वेब एप्लिकेशन चलता है। ध्यान दें कि सीडीआई @Modelमूल रूप से इसके लिए एक स्टीरियोटाइप है@Named @RequestScoped , इसलिए समान नियम लागू होते हैं।

चुनने की गुंजाइश पूरी तरह से डेटा (राज्य) पर निर्भर करती है जो बीन रखती है और प्रतिनिधित्व करती है। @RequestScopedसरल और गैर-अजाक्स रूपों / प्रस्तुतियों के लिए उपयोग करें । उपयोग @ViewScopedअमीर के लिए गतिशील दृश्य (ajaxbased सत्यापन, प्रतिपादन, संवाद, आदि) ajax-सक्षम। का प्रयोग करें @FlowScoped"जादूगर" ( "प्रश्नावली") एकाधिक पृष्ठों से अधिक इनपुट डेटा प्रसार का संग्रह के पैटर्न के लिए। @SessionScopedक्लाइंट विशिष्ट डेटा के लिए उपयोग करें , जैसे लॉग-इन उपयोगकर्ता और उपयोगकर्ता प्राथमिकताएं (भाषा, आदि)। @ApplicationScopedएप्लिकेशन विस्तृत डेटा / स्थिरांक के लिए उपयोग करें , जैसे ड्रॉपडाउन सूची जो सभी के लिए समान हैं, या किसी भी उदाहरण के चर के बिना प्रबंधित सेम और केवल विधियाँ हैं।

@ApplicationScopedसत्र / दृश्य / अनुरोधित डेटा के लिए बीन का दुरुपयोग करने से यह सभी उपयोगकर्ताओं के बीच साझा किया जा सकेगा, इसलिए कोई भी व्यक्ति एक-दूसरे के डेटा को देख सकता है जो कि केवल सादा गलत है। @SessionScopedदृश्य / अनुरोध किए गए डेटा के लिए बीन का दुरुपयोग करने से इसे एकल ब्राउज़र सत्र में सभी टैब / विंडो के बीच साझा किया जा सकेगा, इसलिए उपयोगकर्ता अनुभव के लिए खराब होने वाले टैब के बीच स्विच करने के बाद प्रत्येक दृश्य के साथ बातचीत करते समय एंड्यूसर असंगतता का अनुभव कर सकता है। एक कोस @RequestScopedदेखने के लिए सेम हैं डेटा scoped दृश्य scoped डेटा बनाने के हर एक (AJAX) पोस्टबैक पर डिफ़ॉल्ट करने के लिए इसे पुनः शुरू करना है, संभवतः गैर काम रूपों के कारण ( देखना भी बताते हैं 4 और 5 यहाँ )। डुप्लिकेट दुरुपयोग@ViewScoped अनुरोध, सत्र या आवेदन scoped डेटा के लिए सेम, और एक कोस@SessionScoped डुप्लिकेट डेटा के लिए सेम क्लाइंट को प्रभावित नहीं करता है, लेकिन यह अनावश्यक रूप से सर्वर मेमोरी पर कब्जा कर लेता है और सादा अक्षम है।

ध्यान दें कि गुंजाइश को प्रदर्शन के निहितार्थ के आधार पर नहीं चुना जाना चाहिए, जब तक कि आपके पास वास्तव में कम स्मृति पदचिह्न न हों और पूरी तरह से स्टेटलेस न हों; आपको @RequestScopedक्लाइंट के राज्य को बनाए रखने के लिए अनुरोध पैरामीटर के साथ विशेष रूप से सेम और फिडल का उपयोग करने की आवश्यकता होगी । यह भी ध्यान दें कि जब आपके पास अलग-अलग स्कॉप्ड डेटा वाला एक सिंगल JSF पेज होता है, तो डेटा के स्कोप से मेल खाते हुए उन्हें अलग-अलग बैकिंग बीन्स में डालने के लिए पूरी तरह से मान्य है। @ManagedPropertyजेएसएफ प्रबंधित बीन्स के @Injectमामले में या सीडीआई प्रबंधित बीन्स के मामले में सेम एक-दूसरे तक पहुंच सकते हैं ।

यह सभी देखें:


@CustomScoped/NoneScoped/Dependent

यह आपके प्रश्न में वर्णित नहीं है, लेकिन (विरासत) JSF भी समर्थन करता है @CustomScopedऔर @NoneScoped, जो वास्तविक दुनिया में शायद ही कभी उपयोग किया जाता है। @CustomScopedएक कस्टम संदर्भ देना चाहिए Map<K, Bean>कुछ व्यापक गुंजाइश जो ओवरराइड है में कार्यान्वयन Map#put()और / या Map#get()सेम निर्माण पर अधिक ठीक कणों का नियंत्रण है और / या नष्ट करने के लिए आदेश।

जेएसएफ @NoneScopedऔर सीडीआई @Dependentमूल रूप से बीन पर एकल ईएल-मूल्यांकन के रूप में लंबे समय तक रहते हैं। दो इनपुट फ़ील्ड के साथ एक लॉगिन फ़ॉर्म की कल्पना करें, एक सेम प्रॉपर्टी और एक कमांड बटन का उल्लेख करते हुए एक सेम एक्शन का जिक्र है, इस प्रकार कुल तीन ईएल एक्सप्रेशन के साथ, फिर प्रभावी रूप से तीन इंस्टेंसेस बनाए जाएंगे। उपयोगकर्ता नाम सेट के साथ एक, पासवर्ड सेट के साथ एक और जिस पर कार्रवाई होती है। आप आम तौर पर इस दायरे का उपयोग केवल सेम पर करना चाहते हैं जो कि सेम के रूप में लंबे समय तक रहना चाहिए जहां इसे इंजेक्ट किया जा रहा है। तो अगर एक @NoneScopedया @Dependentएक में इंजेक्ट किया जाता है @SessionScoped, तो यह @SessionScopedबीन के रूप में लंबे समय तक जीवित रहेगा ।

यह सभी देखें:


फ्लैश स्कोप

अंतिम के रूप में, JSF भी फ्लैश स्कोप का समर्थन करता है। यह एक छोटी जीवित कुकी द्वारा समर्थित है जो सत्र के दायरे में डेटा प्रविष्टि के साथ जुड़ा हुआ है। रीडायरेक्ट से पहले, कुकी को HTTP रिस्पॉन्स पर एक मान के साथ सेट किया जाएगा जो कि सत्र के दायरे में डेटा एंट्री के साथ विशिष्ट रूप से जुड़ा हुआ है। रीडायरेक्ट के बाद, फ्लैश स्कोप कुकी की उपस्थिति की जाँच की जाएगी और कुकी से जुड़े डेटा प्रविष्टि को सत्र के दायरे से हटा दिया जाएगा और रिडायरेक्ट किए गए अनुरोध के अनुरोध के दायरे में डाल दिया जाएगा। अंत में कुकी को HTTP प्रतिसाद से हटा दिया जाएगा। इस तरह रीडायरेक्ट किए गए अनुरोध में स्कोप किए गए डेटा तक पहुंचने का अनुरोध है जो प्रारंभिक अनुरोध में तैयार किया गया था।

यह वास्तव में एक प्रबंधित बीन गुंजाइश के रूप में उपलब्ध नहीं है, अर्थात ऐसी कोई चीज नहीं है @FlashScoped। फ्लैश स्कोप केवल ExternalContext#getFlash()प्रबंधित बीन्स और #{flash}ईएल में मानचित्र के रूप में उपलब्ध है ।

यह सभी देखें:


4
मुझे लगता है कि आपके प्रश्न के उत्तर का संदर्भ " जेएसएफ में दृश्य गुंजाइश सेम को कैसे और कब नष्ट किया गया है? " यहां प्रासंगिक है।
Lii

3
@ कॉल्ड: यह एक पुराना CDI स्कोप है और JSF 2.2 के साथ प्रतिस्थापित @FlowScoped(मैन्युअल रूप से इसे शुरू / बंद करने की आवश्यकता नहीं है)।
बालुसक

1
और डेल्टास्पाइक इसके अतिरिक्त है ViewAccesscopedऔरWindowScoped
कुक्टेलजे

@ बाल्सक, मुझे लगता है कि एक मुद्दा है, ViewScopedMyFaces 2.2 में सेम के साथ । मैं वर्तमान में ViewScopedसेम और अजाक्स के साथ एक समस्या का सामना कर रहा हूं , जिसे मैंने यहां पोस्ट किया है । MyFaces JIRA में, इस विषय पर एक चर्चा भी है ।
तपस बोस

CDI चार अंतर्निहित स्कोप को परिभाषित करता है: @RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped आपके द्वारा वर्णित स्कोप अलग-अलग क्यों हैं?
होसेन अकाजानी

122

JSF 2.3 के बाद से पैकेज javax.faces.beanपैकेज में परिभाषित सभी सेम स्कोप सीडीआई के साथ स्कोप्स को संरेखित करने के लिए हटाए गए हैं। इसके अलावा वे केवल तभी लागू होते हैं जब आपका बीन @ManagedBeanएनोटेशन का उपयोग कर रहा हो । यदि आप 2.3 से नीचे जेएसएफ संस्करणों का उपयोग कर रहे हैं तो अंत में विरासत के जवाब को देखें।


JSF 2.3 से यहां वे स्कॉप्स हैं जिनका उपयोग JSF बैकिंग बीन्स पर किया जा सकता है:

1@javax.enterprise.context.ApplicationScoped .: आवेदन की गुंजाइश वेब एप्लिकेशन की पूरी अवधि के लिए बनी रहती है। यह गुंजाइश सभी अनुरोधों और सभी सत्रों के बीच साझा की जाती है। यह उपयोगी है जब आपके पास पूरे एप्लिकेशन के लिए डेटा है।

2@javax.enterprise.context.SessionScoped .: सत्र गुंजाइश उस समय से बनी रहती है जब सत्र समाप्ति तक एक सत्र की स्थापना की जाती है। सत्र का संदर्भ उसी HTTP सत्र में होने वाले सभी अनुरोधों के बीच साझा किया जाता है। यह तब उपयोगी है जब आप किसी विशेष क्लाइंट के लिए किसी विशेष सत्र के लिए डेटा को सहेजना नहीं चाहते।

3@javax.enterprise.context.ConversationScoped .: वार्तालाप का दायरा बीन के रूप में लॉग के रूप में बना रहता है। गुंजाइश 2 तरीके प्रदान करती है: Conversation.begin()और Conversation.end()। इन तरीकों को स्पष्ट रूप से कहा जाना चाहिए, या तो बीन के जीवन को शुरू करने या समाप्त करने के लिए।

4@javax.enterprise.context.RequestScoped .: अनुरोध गुंजाइश अल्पकालिक है। यह तब शुरू होता है जब एक HTTP अनुरोध सबमिट किया जाता है और क्लाइंट को प्रतिक्रिया भेजे जाने के बाद समाप्त होता है। यदि आप प्रबंधित बीन को अनुरोध के दायरे में रखते हैं, तो प्रत्येक अनुरोध के साथ एक नया उदाहरण बनाया जाता है। यदि आप सत्र गुंजाइश भंडारण की लागत के बारे में चिंतित हैं तो यह अनुरोध गुंजाइश पर विचार करने योग्य है।

5@javax.faces.flow.FlowScoped .: फ्लो स्कोप तब तक बना रहता है जब तक फ्लो रहता है। प्रवाह को पृष्ठों के एक सेट (या विचार) के रूप में परिभाषित किया जा सकता है जो कार्य की एक इकाई को परिभाषित करते हैं। फ्लो स्कोप तब तक सक्रिय रहता है जब तक फ़्लो में उपयोगकर्ता नेविगेट करता है।

6@javax.faces.view.ViewScoped .: देखने की गुंजाइश में एक बीन बनी रहती है जबकि उसी JSF पेज को फिर से डिजाइन किया जाता है। जैसे ही उपयोगकर्ता एक अलग पृष्ठ पर नेविगेट करता है, सेम गुंजाइश से बाहर हो जाता है।


निम्नलिखित विरासत का जवाब 2.3 से पहले JSF संस्करण लागू होता है

JSF 2.x में 4 बीन स्कोप हैं:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

सत्र स्कोप: सत्र की गुंजाइश उस समय से बनी रहती है जब सत्र समाप्ति तक एक सत्र की स्थापना की जाती है। यदि वेब एप्लिकेशन HttpSession ऑब्जेक्ट पर अमान्य विधि को आमंत्रित करता है, या यदि यह समय समाप्त हो जाता है, तो एक सत्र समाप्त हो जाता है।

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

ApplicationScope: वेब अनुप्रयोग की संपूर्ण अवधि के लिए अनुप्रयोग गुंजाइश बनी रहती है। यह गुंजाइश सभी अनुरोधों और सभी सत्रों के बीच साझा की जाती है। आप प्रबंधित बीन्स को एप्लिकेशन स्कोप में रखते हैं यदि एक वेब एप्लिकेशन के सभी उदाहरणों के बीच एक ही बीन साझा की जानी चाहिए। बीन का निर्माण तब किया जाता है जब इसे पहली बार किसी एप्लिकेशन के उपयोगकर्ता द्वारा अनुरोध किया जाता है, और यह तब तक जीवित रहता है जब तक कि वेब एप्लिकेशन एप्लिकेशन सर्वर से हटा नहीं दिया जाता है।

ViewScope: JSF 2.0 में दृश्य क्षेत्र जोड़ा गया था। देखने की गुंजाइश में एक बीन बनी रहती है जबकि उसी JSF पेज को फिर से डिजाइन किया जाता है। (JSF विनिर्देशन JSF पृष्ठ के लिए दृश्य शब्द का उपयोग करता है।) जैसे ही उपयोगकर्ता एक अलग पृष्ठ पर नेविगेट करता है, सेम गुंजाइश से बाहर हो जाता है।

अपनी आवश्यकता के आधार पर गुंजाइश चुनें।

स्रोत: डेविड जैकी और के हॉर्स्टमैन द्वारा कोर जावा सर्वर फेस 3 संस्करण [पेज नं। ५१ - ५४] यहां छवि विवरण दर्ज करें


क्या आप स्पष्ट कर सकते हैं, "HttpSession object पर अमान्य विधि": invalidate()विधि, या अमान्य विधि से आपका क्या मतलब है ?
अलेक्जेंडर पॉज़्नवीव

1
उत्तर के लिए थोड़ा पुराना और शायद देर से, लेकिन इसे स्पष्ट करने के लिए: FacesContext.getCurrentInstance().getExternalContext().invalidateSession();अपने "लॉगआउट बीन" में आमंत्रित होने का मतलब है।
रोलैंड

1
यह विरासत का जवाब बन गया, फिलहाल 8 स्कॉप्स हैं
इवोक्स

@ किशोरप्रकाश: अभी 6 महीने पहले की बात है। ;-)
कुकटेलजे

@ कुक्टेलजे: क्षमा करें, मैं इस पर हूं।
किशोर प्रकाश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.