2010-02-09 3 views
5

की गतिशील मान बाध्यकारी मैं रनटाइम पर गतिशील रूप से कुछ घटक के मूल्य को कैसे बांधूं? उदाहरण के लिए, मैं निम्नलिखित घटक टैग,जेएसएफ घटक

<h:inputText value="#{bean.someProp}" /> 

है मेरे मामले में, "# {bean.someProp}" केवल कार्यावधि में जाना जाता है।

इसे लागू करने की सबसे अच्छी रणनीति क्या है?

क्या मुझे घटक पेड़ को पार करना चाहिए और मूल्य को बाध्यकारी प्रोग्रामेटिक रूप से सेट करना चाहिए? यदि हां, तो जेएसएफ लाइफसाइक्ल चरण में मुझे ट्रैवर्सिंग करना चाहिए?

उत्तर

15

आप इसे Map<String, Object> बीन संपत्ति से जोड़ सकते हैं जहां String कुंजी गतिशील संपत्ति का नाम कम या अधिक है। आप ईएल में निम्नलिखित तरीके से नक्शा मूल्यों पहुँच सकते हैं:

<h:inputText value="#{bean.map.someProp}" /> 

या

<h:inputText value="#{bean.map['someProp']}" /> 

जो भी एक बालक अधिक गतिशील जहां someVar वास्तव में "someProp" के String मूल्य पर ले कर किया जा सकता है:

<h:inputText value="#{bean.map[someVar]}" /> 

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

public class Bean { 
    private Map<String, Object> map = new HashMap<String, Object>(); 
} 

.. या एक निर्माता यदि आप चाहें तो अंदर या @PostConstruct

+0

ठीक है, मुझे तुम्हारा क्या मतलब है। यह एक अच्छा विचार है, सिवाय इसके कि मैं अपनी संस्थाओं में एनोटेशन में परिभाषित सभी मेटाडेटा खो दूंगा। इसका अर्थ यह भी होगा कि (एसईएएम से हाइबरनेट सत्यापन टैग) और अन्य सभी बुनियादी ढांचे का उपयोग करने का लाभ खोना जो एनोटेशन मेटाडेटा पर निर्भर करता है। एफवाईआई, मैं ऐसा करने के लिए ऐसा कर रहा हूं जो 'नग्न वस्तु' पैटर्न लागू करता है (एक रेफरी कार्यान्वयन http://www.nakedobjects.org/) है। असल में यह एक इकाई का निरीक्षण करता है और स्वचालित रूप से संबंधित तालिकाओं और रूपों (इस मामले में, घटक पेड़) का निर्माण करता है। – bungrudi

+0

उर्म, ... दूसरे विचार पर, इस दृष्टिकोण का उपयोग करके मुझे उन सभी एनोटेशन मेटाडेटा को खोना नहीं है। मैं इसे आज़माउंगा और आपको बता दूंगा। – bungrudi

+0

इस तरह मैं इसे वर्तमान में करता हूं। ऐसा करके, मैं का लाभ खो रहा हूं और कहीं और सत्यापन को फिर से कार्यान्वित करना है। हालांकि यह मामूली है, केवल हाइबरनेट Validator.validate (बीन) को बुलाए जाने का मामला। – bungrudi

0

एक और विकल्प यह है कि आप अपने बीन में अमूर्तता की एक परत जोड़ सकते हैं।

public String getDynamicProp() { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

public void setDynamicProp(String input) { 
    ...Code to determine and return the correct property based on the meta-data... 
} 

तो फिर तुम गतिशील प्रोप सीधे अपने JSF टाई होगा:

#{bean.dynamicProp} 

हालांकि, इस प्रमाणकों की तरह मेटाडाटा और जैसे आप चाहते थे पर लटका नहीं होंगे। हालांकि, आप प्रोग्रामिक रूप से प्रमाणीकरण का आह्वान कर सकते हैं और इसे स्वयं संभाल सकते हैं।