उन दृष्टिकोणों के बीच अंतर क्या है?
फेसलेट टेम्पलेट
यदि आप मुख्य पृष्ठ लेआउट अंशों को पुन: प्रयोज्य टेम्पलेट्स में विभाजित करना चाहते हैं <ui:composition>
, तो फेसलेट टेम्प्लेट (जैसा कि , <ui:include>
और <ui:decorate>
) का उपयोग करें । जैसे हेडर, मेनू, सामग्री, पाद लेख इत्यादि।
उदाहरण:
फेसलेट टैग फ़ाइलें
यदि आप कोड दोहराव को रोकने / कम करने के लिए घटकों का पुन: प्रयोज्य समूह रखना चाहते हैं तो फेसलेट टैग फ़ाइलों का उपयोग करें। जैसे लेबल + इनपुट + संदेश घटकों का एक समूह। मिश्रित घटकों के साथ प्रमुख अंतर यह है कि एक फ़ेसलेट टैग फ़ाइल का आउटपुट एकल का प्रतिनिधित्व नहीं करता है UIComponent
और कुछ परिस्थितियों में एकमात्र समाधान हो सकता है जब एक मिश्रित घटक पर्याप्त नहीं होता है। आम तौर पर, <ui:include>
एक या अधिक के साथ <ui:param>
जो एक प्रबंधित बीन प्रॉपर्टी पास करता है (और इस तरह हार्डकोड नहीं है) एक संकेत है कि शामिल फ़ाइल बेहतर टैग फ़ाइल हो सकती है।
उदाहरण:
समग्र घटक
यदि आप UIComponent
शुद्ध XML का उपयोग करके एकल जिम्मेदारी के साथ एकल और पुन: प्रयोज्य कस्टम बनाना चाहते हैं, तो मिश्रित घटकों का उपयोग करें । इस तरह के एक मिश्रित घटक में आम तौर पर मौजूदा घटकों और / या HTML का एक गुच्छा होता है और भौतिक रूप से एकल घटक के रूप में प्रदान किया जाता है और यह एकल सेम संपत्ति के लिए बाध्य माना जाता है। उदाहरण के लिए एक घटक है जो एक एकल का प्रतिनिधित्व करता है java.util.Date
3 निर्भर द्वारा संपत्ति <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
।