jsf - सही बीन स्कोप कैसे चुनें?




jsf-2 scope (2)

जेएसएफ 2.x के रूप में 4 बीन स्कोप्स हैं:

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

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

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

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

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

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

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

मैंने देखा कि विभिन्न बीन स्कोप हैं जैसे:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

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


परिचय

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

@Request/View/Flow/Session/ApplicationScoped

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

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

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

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

यह भी देखें:

@CustomScoped/NoneScoped/Dependent

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

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

यह भी देखें:

फ्लैश स्कोप

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

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

यह भी देखें:





managed-bean