2012-09-18 11 views
6

जैसा कि this question में वर्णित है, मैं बैकिंग बीन पक्ष पर किसी फॉर्म में कुछ फ़ील्ड सत्यापन करने का प्रयास करता हूं। इसके लिए मैं उन्हें चिह्नित करने के लिए उल्लंघन करने वाले क्षेत्रों तक पहुंच बनाना चाहता हूं। पहुँच के लिए समर्थन की फलियों मेंघटक बाइंडिंग बनाम खोज कॉम्पोनेंट() - कब उपयोग करना है?

  • दुकान घटकों और binding विशेषता के माध्यम से JSF पन्नों में उन्हें इस्तेमाल: वेब की खोज से दो तरीकों से यह करने के लिए होने लगते हैं।
  • उपयोग मानक मूल्य JSF पन्नों में बंधन और जब सेम से एक घटक के लिए उपयोग की आवश्यकता होगी, है, यह जहाँ तक मेरा दोनों तरीकों से कमियां हैं देख सकते हैं UIViewRoot.findComponent(String id)

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

जाने का तरीका कौन सा होगा? क्या ये अंतर-परिवर्तनीय विकल्प हैं और यदि नहीं, तो आप किस मानदंड को चुनते हैं? वर्तमान में मेरे पास एक सभ्य निर्णय लेने के लिए पर्याप्त अंतर्दृष्टि नहीं है ...

+0

[इस अन्य मंच] में समान प्रश्न [http://www.jguru.com/forums/view.jsp?ईआईडी = 1522894 #), लेकिन हां, कोई जवाब नहीं;) – Louise

उत्तर

8

सबसे पहले, पसंद के बावजूद, दोनों एक खराब अभ्यास हैं। यह भी देखें How does the 'binding' attribute work in JSF? When and how should it be used?

यदि आपको विकल्प बनाना है, तो घटक बाइंडिंग निश्चित रूप से तेज़ और सस्ता हैं। यह तार्किक रूप से पूरी तरह से समझ में आता है कि UIComponent#findComponent() द्वारा किए गए पेड़ स्कैन के प्रदर्शन प्रभाव पड़ते हैं।

दरअसल, समर्थन सेम घटक बाइंडिंग पकड़े अनुरोध किया जाना चाहिए scoped, लेकिन आप आसानी @ManagedProperty द्वारा उस में व्यापार तर्क पकड़े एक अलग scoped समर्थन सेम इंजेक्षन सकता है।

एक क्लीनर दृष्टिकोण Map का उपयोग सभी घटक बाइंडिंग के धारक के रूप में करना होगा। आप केवल faces-config.xml के लिए निम्न प्रविष्टि जोड़ने की जरूरत:

<managed-bean> 
    <managed-bean-name>components</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

यह बस के रूप में

<h:inputSome binding="#{components.input1}" /> 
<h:inputSome binding="#{components.input2}" /> 
<h:inputSome binding="#{components.input3}" /> 

इस्तेमाल किया जा सकता और यह के रूप में

Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components"); 

इस तरह आप अन्य सेम में प्राप्त किया जा सकता व्यक्तिगत गुण/गेटर्स/सेटर्स निर्दिष्ट करने के बारे में चिंता करने की आवश्यकता नहीं है। उपर्युक्त उदाहरण में, Map में चाबियाँ input1, input2 और input3 के साथ तीन प्रविष्टियां होंगी, प्रत्येक संबंधित UIComponent उदाहरण मान के साथ।


असंबंधित ठोस सवाल के रूप में आप कार्रवाई विधि में मान्यता (जो वास्तव में बुरा डिजाइन है) प्रदर्शन के अलावा अन्य प्रश्न में वर्णित है, वहाँ ठोस समस्या के लिए एक बहुत सरल समाधान हो सकता है। मैंने वहां एक जवाब पोस्ट किया है।

+0

इसका मतलब यह है कि सामान्य रूप से संपत्ति बाइंडर्स का उपयोग करना एक अच्छा अभ्यास नहीं है। हमें इस मामले में घटक बाइंडिंग पसंद करनी चाहिए? – benz

+0

मेरा मतलब यह नहीं था कि इसका मतलब है। घटक मूल्य बाइंडिंग का उपयोग करना पसंद किया जाना चाहिए, लेकिन यह आपके वर्तमान प्रश्न से बाहर है, है ना? – BalusC

+0

यह सही है। मैंने सवाल देखा और पूछने के लिए सोचा। मैं इसके बारे में एक सवाल अलग से शूट करूंगा। – benz

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