कब उपयोग करें <ui: शामिल करें>, टैग फ़ाइलें, मिश्रित घटक और / या कस्टम घटक?


102

मैंने हाल ही में फेसलेट्स के साथ JSF 2.0 का उपयोग करना शुरू किया <ui:include>और फेसलेट 1.x द्वारा प्रस्तुत मौजूदा और अन्य टेम्प्लेटिंग तकनीकों को जानकर नए मिश्रित घटकों से हैरान हो गया।

उन दृष्टिकोणों के बीच अंतर क्या है? कार्यात्मक वे एक ही के बारे में प्रस्ताव करने लगते हैं: <ui:param>बनाम <cc:attribute>, <ui:insert>+ <ui:define>टैग फ़ाइलों बनाम, मौजूदा टेम्पलेट का पुन: उपयोग। क्या कंपोनेंट कंपोनेंट्स के मामले में सिंटैक्स और क्लियर इंटरफेस स्पेसिफिकेशन के अलावा भी कुछ है? प्रदर्शन अलग हो सकता है?

जवाबों:


176

उन दृष्टिकोणों के बीच अंतर क्या है?

फेसलेट टेम्पलेट

यदि आप मुख्य पृष्ठ लेआउट अंशों को पुन: प्रयोज्य टेम्पलेट्स में विभाजित करना चाहते हैं <ui:composition>, तो फेसलेट टेम्प्लेट (जैसा कि , <ui:include>और <ui:decorate>) का उपयोग करें । जैसे हेडर, मेनू, सामग्री, पाद लेख इत्यादि।

उदाहरण:

फेसलेट टैग फ़ाइलें

यदि आप कोड दोहराव को रोकने / कम करने के लिए घटकों का पुन: प्रयोज्य समूह रखना चाहते हैं तो फेसलेट टैग फ़ाइलों का उपयोग करें। जैसे लेबल + इनपुट + संदेश घटकों का एक समूह। मिश्रित घटकों के साथ प्रमुख अंतर यह है कि एक फ़ेसलेट टैग फ़ाइल का आउटपुट एकल का प्रतिनिधित्व नहीं करता है UIComponentऔर कुछ परिस्थितियों में एकमात्र समाधान हो सकता है जब एक मिश्रित घटक पर्याप्त नहीं होता है। आम तौर पर, <ui:include>एक या अधिक के साथ <ui:param>जो एक प्रबंधित बीन प्रॉपर्टी पास करता है (और इस तरह हार्डकोड नहीं है) एक संकेत है कि शामिल फ़ाइल बेहतर टैग फ़ाइल हो सकती है।

उदाहरण:

समग्र घटक

यदि आप UIComponentशुद्ध XML का उपयोग करके एकल जिम्मेदारी के साथ एकल और पुन: प्रयोज्य कस्टम बनाना चाहते हैं, तो मिश्रित घटकों का उपयोग करें । इस तरह के एक मिश्रित घटक में आम तौर पर मौजूदा घटकों और / या HTML का एक गुच्छा होता है और भौतिक रूप से एकल घटक के रूप में प्रदान किया जाता है और यह एकल सेम संपत्ति के लिए बाध्य माना जाता है। उदाहरण के लिए एक घटक है जो एक एकल का प्रतिनिधित्व करता है java.util.Date3 निर्भर द्वारा संपत्ति <h:selectOneMenu>घटकों, या एक घटक है जो जोड़ती है <p:fileUpload>और <p:imageCropper>एक भी में <my:uploadAndCropImage>एक भी कस्टम चर्चा करते हुए com.example.Imageसंपत्ति के रूप में इकाई।

उदाहरण:

कस्टम घटक

जब भी कार्यक्षमता फेसलेट टैग फ़ाइलों या मिश्रित घटकों के साथ हासिल नहीं की जा सकती, तो घटक के मानक / उपलब्ध सेट में समर्थन की कमी के कारण एक कस्टम घटक का उपयोग करें। प्राइमफेस और ओम्नीफेस जैसे ओपन सोर्स कंपोनेंट लाइब्रेरी के स्रोत कोड में सभी जगह पर उदाहरण पाए जा सकते हैं ।

टैग हैंडल

जब आप HTML आउटपुट रेंडर करने के बजाय JSF कंपोनेंट ट्री की बिल्डिंग को कंट्रोल करना चाहते हैं, तो आपको किसी कंपोनेंट के बजाय टैग हैंडलर का इस्तेमाल करना चाहिए।

उदाहरण:

उदाहरण परियोजनाओं

यहां कुछ उदाहरण परियोजनाएं हैं जो उपरोक्त सभी तकनीकों का उपयोग करती हैं।


प्रदर्शन अलग हो सकता है?

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

समग्र घटक हालांकि दृश्य के निर्माण / पुनर्स्थापन (विशेष रूप से: दृश्य स्थिति को बचाने / पुनर्स्थापित करने के दौरान) के दौरान एक महत्वपूर्ण ओवरहेड है। और, मोआजरा के पुराने संस्करणों में, मिश्रित घटकों में डिफ़ॉल्ट मान असाइन करने के साथ प्रदर्शन के मुद्दे थे, यह पहले से ही 2.1.13 के बाद से तय है। इसके अलावा, मोझरा के पास मेमोरी रिसाव था जब एक <cc:attribute method-signature>का उपयोग विधि के भावों के लिए किया जाता है, मूल रूप से HTTP सत्र में पूरे घटक पेड़ को फिर से संदर्भित किया जाता है, यह 2.1.29 / 2.2.8 के बाद से तय किया गया है। स्मृति रिसाव को नीचे के रूप में पुराने 2.1 संस्करणों में बाईपास किया जा सकता है:

<context-param>
    <param-name>com.sun.faces.serializeServerState</param-name>
    <param-value>true</param-value>
</context-param>

या नीचे के रूप में पुराने 2.2 संस्करणों में:

<context-param>
    <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
    <param-value>true</param-value>
</context-param>

फिर भी, जब आपके पास अपेक्षाकृत "बहुत सारे" मिश्रित घटक होते हैं, और आपने javax.faces.STATE_SAVING_METHODनिर्धारित किया है client, तो प्रदर्शन एक दर्द होगा। कम्पोज़िट कंपोनेंट्स का दुरुपयोग न करें यदि आप केवल मूल कार्यक्षमता चाहते हैं जो पहले से ही एक सरल फ़ाइल या टैग फ़ाइल के साथ संभव है। कॉन्फ़िगरेशन की आसानी का उपयोग न करें (पढ़ें: कोई *.taglib.xmlफ़ाइल की आवश्यकता नहीं) टैग फ़ाइलों पर समग्र घटकों को पसंद करने के लिए एक बहाने के रूप में।

मोझरा 2.2.10 या पुराने का उपयोग करते समय, उत्पादन मोड के लिए अपेक्षाकृत कम फेसलेट्स रिफ्रेश अवधि को अक्षम करना न भूलें:

<context-param>
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
    <param-value>-1</param-value>
</context-param>

विकास के लिए इस सेटिंग का उपयोग न करें, अन्यथा आप प्रतिबिंबित होने के लिए फ़ेसलेट फ़ाइलों में परिवर्तन प्राप्त करने के लिए पूरे सर्वर को पुनरारंभ करना चाहते हैं! मोजरा २.२.११ और नए, और MyFaces पहले से ही डिफॉल्ट करता है कि -1कब javax.faces.PROJECT_STAGEसेट नहीं किया गया है Development


आप 3 (फेसलेट टैग फ़ाइल) के बजाय 1 घटक (कंपोजिट घटक) क्यों प्रस्तुत करना चाहेंगे? मेरा मतलब अच्छी तरह से है, एक धूप दिन पर आप शायद 3 के बजाय 1 की तरह महसूस करेंगे ... लेकिन मुझे लगता है कि इसके पीछे कुछ और है। आपके उदाहरण में आप UINamingContainer का विस्तार कर रहे हैं ... जो cc के लिए जाने के कारणों में से एक हो सकता है (इसलिए कुछ jsf कार्यान्वयन विशिष्ट कार्यों को अधिलेखित करने में सक्षम होने के लिए)?
०२ पर तोस्कन

2
एक टैग फ़ाइल को एक तरह के शामिल के रूप में देखा जाना चाहिए। एक मिश्रित घटक को वास्तविक घटक के रूप में देखा जाना चाहिए। एक समग्र घटक को लागू करने की आवश्यकता होती है NamingContainer, अन्यथा जब आप एक ही घटक का कई बार पुन: उपयोग किया जाता है, तो आप डुप्लिकेट आईडी समस्याओं के साथ समाप्त होते हैं।
बालुसक

@BalusC मान लें कि मेरे पास HTML और JSF का एक समूह है जो एक 'ब्लॉक' बनाता है जो मुझे पते जोड़ने या हटाने की अनुमति देता है (और यह सभी विशेषताएं हैं: सड़क, संख्या, शहर, आदि)। मुझे 2 या 3 पृष्ठों में उसी ब्लॉक का उपयोग करने की आवश्यकता है। क्या यह एक समग्र घटक के आपके विवरण के अंतर्गत आता है?
RinaldoPJr

1
@Rinaldo: मुझे लगता है कि मैं इसके लिए एक टैग फ़ाइल का उपयोग गतिशील रूप से आबादी वाले घटक आईडी के साथ करता हूं जैसे कि stackoverflow.com/questions/5713718/… में दिखाया गया है । IMO, यदि यह एक टैग फ़ाइल के साथ किया जा सकता है, तो इसका उपयोग करें। यदि यह एक टैग फ़ाइल के साथ नहीं किया जा सकता है, तो एक समग्र का उपयोग करें। यदि आपको किसी एकल संपत्ति में हेरफेर करने के लिए कई घटकों की आवश्यकता होगी (पता नहीं, लेकिन जैसे कि स्ट्रीटनाम + हाउसनंबर जो एक ही संपत्ति में जाना चाहिए), तो एक मिश्रित घटक एकमात्र समाधान होगा।
बालुसक

2
@Tarik: कंपोजिट में टैगफाइल्स की तुलना में बहुत अधिक ओवरहेड है। दूसरे शब्दों में: खराब प्रदर्शन। इसका उपयोग केवल तभी करें जब आपको निकटवर्ती मौजूदा घटकों के सेट के आधार पर एकल कस्टम UI घटक बनाने की आवश्यकता हो। यह एक टैगफाइल के साथ नहीं किया जा सकता है। ZEEF.com, उदाहरण के लिए केवल एक समग्र है: अपलोड / डाउनलोड / क्रॉप इमेज ऑल-इन-वन एक चीज जो कि एओ पेज पिक्चर, प्रोफाइल पिक्चर, लिंक ब्लॉक हेडर, इमेज ब्लॉक आदि में उपयोग की जाती है, यह सिर्फ एक Imageसंपत्ति के लिए बाध्य है। सेम में।
बालूसीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.