2012-11-13 10 views
5

यह शायद एक प्रकार का वास्तुशिल्प प्रश्न है, लेकिन फिर भी इसे 'सर्वोत्तम अभ्यास समाधान' या स्वीकार्य मानक होना चाहिए।जेएसएफ सत्र का उपयोग करके स्थिर पदानुक्रमित डेटा का प्रतिनिधित्व करने के लिए प्रबंधित बीन स्कॉप्ड

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

लेकिन मैं इस मुद्दे के लिए एक शुद्ध जेएसएफ समाधान का उपयोग करना चाहता हूं।

तो, सवाल करने के लिए वापस पाने के लिए, मेरे विस्तारण निम्नलिखित सिद्धांतों पर स्टेम:

  1. डाटा facelets में hardcoded नहीं किया जाना चाहिए, इसलिए मैं डेटाबेस का उपयोग निम्नलिखित में की तरह मान धारण करने के लिए, डाटाबेस लिपि (मेरे मामले में MYSQL):

    CREATE TABLE CatalogueGroup (
        CatalogueGroupName VARCHAR(100) NOT NULL PRIMARY KEY, 
        URLPath VARCHAR(200) NOT NULL, 
        ParentGroupName VARCHAR(100) DEFAULT NULL, 
        FOREIGN KEY (ParentGroupName) REFERENCES CatalogueGroup(CatalogueGroupName) ON UPDATE CASCADE ON DELETE SET NULL 
    )ENGINE=InnoDB DEFAULT CHARSET=utf8; 
    
  2. मैं तो

    की तरह एक @ManagedBean में आयोजित होने वाले इकाई वर्ग का उपयोग करें और एक दृश्य में प्रदर्शित करने के लिए, चाहते हैं

उपर्युक्त सेटअप काम करता है, लेकिन ऐसा लगता है कि यह एक अजीब है।

  1. क्या इस तरह की एक सूची सेम की स्थापना के लिए एक उचित तरीका है:: तो, मैं JSF समुदाय के लिए निम्न खुला, 'सबसे अच्छा अभ्यास के सवालों को उठाने के लिए चाहते हैं
    • एक @SessionScope सेम कि एक बार लोड किया जाएगा और प्रत्येक दृश्य या
    • @RequestScoped बीन जो प्रत्येक पृष्ठ डिस्प्ले पर डेटाबेस तक पहुंच जाएगा।
  2. वहाँ facelet ध्यान में रखते हुए सेटअप पुनरावर्ती कार्यों के लिए एक रास्ता है, या मैं और अधिक उजागर सूची नेस्टिंग स्तर को सीमित करने, कहते हैं, 2 या 3
  3. मैं संशोधित सूची के कुछ प्रकार प्रदर्शित करना चाहते हैं चाहिए, उपयोगकर्ताओं द्वारा लॉग इन करने के लिए समूह, उनकी भूमिका (डेटाबेस तालिका में जोड़ा गया कॉलम) के आधार पर और कोई उपयोगकर्ता लॉग इन करते समय मूल कैटलॉग प्रदर्शित करता है। इसके अतिरिक्त, मैं कभी-कभी कैटलॉग में कुछ नए समूह डालना चाहता हूं और उपयोगकर्ताओं को फिर से- लॉग इन करें, लेकिन एक बार में उचित डेटा को फिर से चलाएं:
    • क्या मैं व्यवसाय परत में समूह फ़िल्टर कर सकता हूं और एक फ़िल्टर किए गए कैटलॉग समूह को बीन में दिखा सकता हूं, या मैं पूरी सूची लोड करूंगा और इसकी सी को सीमित कर दूंगा rendered = झूठ के साथ विचारों में hildren;
    • सत्र में पूरे कैटलॉग का खुलासा करने का एक उचित तरीका है;
    • क्या सभी मौजूदा कैटलॉग बीन में नई डेटाबेस प्रविष्टियों को जोड़ने के लिए संशोधनों की घटनाओं को भेजना संभव है, सर्वर पर सक्रिय अपने गुणों (कैटलॉग समूह) को रीफ्रेश करने के लिए मजबूर करना या इस कार्यक्षमता को प्राप्त करने के लिए मुझे केवल @RequestScoped बीन का उपयोग करने की आवश्यकता है;
    • अनुरोध स्कॉप्ड बीन का उपयोग करने के मामले में एकमात्र विकल्प होगा डेटा को प्राप्त करने के लिए डेटाबेस तक पहुंचना बुद्धिमान होगा, जो शायद ही कभी बदलता है या चीजों को करने का एक बेहतर तरीका है;
    • जब उपयोगकर्ता लॉग इन करता है (और लॉग आउट करता है) पहले से ही सत्र स्कॉप्ड कैटलॉग का एक उदाहरण है, इसे रीफ्रेश कैसे करें: क्या मुझे इसे क्रिया/क्रिया श्रोता में मैन्युअल रूप से करने की आवश्यकता है या मुझे सत्र को अमान्य करने या कुछ और उचित करने की आवश्यकता है स्थिति के लिए।

उत्तर

1

बहुत दिलचस्प लेकिन शायद इतना खुला मैदान में उतारा सवाल।

सबसे पहले दायरे इस बात पर निर्भर करता है कि आप अपनी कैटलॉग को किस यूटिलिटी को देंगे। मैं आपको @ViewScoped से गुज़रने का सुझाव देता हूं यदि आप किसी विशेष दृश्य या @SessionScoped पर डेटा लिंक करना चाहते हैं, तो आपका लक्ष्य शॉपिंग टोकरी की तरह कुछ लागू करना है।

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

आखिरकार, कैटलॉग सीमाओं के लिए, मैं आपको केवल इतना लोड करने का सुझाव देता हूं कि आप डेटाबेस से क्या उपयोग करने जा रहे हैं। इस तरह से आप सर्वर-डेटाबेस या सर्वर-क्लाइंट कनेक्शन ओवरलोड नहीं कर रहे हैं। आपके पास @SessionScoped बीन हो सकता है जो वर्तमान लॉग किए गए उपयोगकर्ता के सत्र का प्रबंधन करता है और उस पर निर्भर करता है कि आप कुछ मूल्यों या अन्य लोगों के लिए डेटाबेस से पूछ सकते हैं।

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

"load the whole catalogue and limit its children in views with rendered=false"

एक काम आप यदि आप इसे जिस तरह से मैं कह कर क्या करना है नहीं है यही कारण है कि। यदि आप एक जटिल पेड़ का प्रबंधन कर रहे हैं और दृश्य में अधिक तर्क प्रस्तुत करते हैं तो प्रत्येक पेड़ नोड्स का सशर्त रूप से मूल्यांकन करना नरक हो सकता है। निश्चित रूप से आपको उस तक से बचना चाहिए जहां तक ​​आप कर सकते हैं।

यहां तक ​​कि आप पहले से ही एक समाधान तक पहुंच चुके हैं, यह मेरा मुख्य विचार है।

1

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

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