2012-08-17 8 views
8

मेरे पास ऐसे मामले का उपयोग किया गया है जिसमें मुझे यूआई पर विभिन्न ग्रंथों को प्रदर्शित करने के लिए संसाधन बंडल का उपयोग करना है। इनमें से कुछ संसाधन बंडल प्रविष्टियां पैरामीट लेती हैं (उदा। {0}), इनके लिए मैं h: outputFormat का उपयोग करता हूं लेकिन कभी-कभी वह पर्याप्त नहीं होता है।जेएसएफ घटकों के गैर-मूल्य विशेषताओं के साथ पैरामीटरेटेड संदेशफॉर्मैट का उपयोग कैसे करें

उदा।

someMessage=Display this message with param {0} 

संसाधन बंडल में।

एक्सएचटीएमएल पर यह प्रदर्शित करने के लिए मैं सामान्य रूप से कार्य करें:

<h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 

कि अच्छी तरह से काम करता है जब यह एक साधारण बात है, लेकिन और अधिक जटिल उपयोग के मामलों के लिए यह पर्याप्त नहीं है।

<h:commandLink action="logout" title="#{msg['someMessage']}"> 
     <f:param value="#{someBean.value}" /> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

जो काम नहीं करता है: उदाहरण के लिए मैं 'शीर्षक' एक commandLink की विशेषता ऊपर संसाधन बंडल प्रविष्टि का उपयोग करना चाहते हैं। मैंने यह भी कोशिश की:

<h:commandLink action="logout"> 
     <f:attribute name="title"> 
      <h:outputFormat value="#{msg['someMessage']}"><f:param value="#{someBean.value}"/></h:outputFormat> 
     </f:attribute> 
     <h:graphicImage library="images" name="image.png" /> 
    </h:commandLink> 

जो एफ के बाद भी काम नहीं करता है: attibute बच्चों को अनुमति नहीं देता है।

भले ही इसे बाईपास करने के लिए एक हैक है (उदाहरण के लिए प्राइमफेस से होवर घटक का उपयोग करना) ऐसे अन्य फ़ील्ड हैं जिन्हें पैरामीटरयुक्त संदेश की आवश्यकता हो सकती है।

क्या किसी को संदेशफॉर्मैट का उपयोग करने का कोई तरीका पता है जो किसी जेएसएफ घटक के गैर-मूल्य फ़ील्ड में तर्क लेता है?

+0

इसी प्रकार का प्रश्न: http://stackoverflow.com/questions/5697189/pass-parameters-to-messages-from-resource-bundle-to-components-other-than-hou – Adam

+0

यह एक अलग सवाल है क्योंकि वह एक अलग सवाल है ** मूल्य ** विशेषता के संबंध में, जो सीधे निपटने के लिए आगे है (मैंने प्रश्न का उत्तर दिया)। ** गैर-मूल्य ** विशेषताओं के साथ पैरामीटरयुक्त संदेशफॉर्मैट का उपयोग करने का एक तरीका वह है जिसे मैं ढूंढ रहा हूं। – Zak

उत्तर

6

आप इस जिसके साथ आप अंत में की तरह खत्म कर सकते हैं के लिए a custom EL function बना सकते हैं:

<h:commandLink ... title="#{my:format(msg['someMessage'], someBean.value)}" /> 

आप काम को करने के लिए MessageFormat एपीआई का उपयोग कर सकते हैं, बिल्कुल के रूप में <h:outputFormat> कवर के तहत कर रही है।

एक विकल्प एक कस्टम घटक बनाना है जो जेएसटीएल के अच्छे 'ol <fmt:message> जैसा करता है जो ईएल स्कोप में स्वरूपित संदेश निर्यात करने के लिए var विशेषता का समर्थन करता है।

<my:outputFormat ... var="linkTitle"> 
    ... 
</my:outputFormat> 
<h:commandLink ... title="#{linkTitle}" /> 

अद्यतन: JSF उपयोगिता पुस्तकालय OmniFaces#{of:formatX()} कार्य करता है और बहुत उद्देश्य के लिए एक <o:outputFormat> घटक है।

+0

उस दृष्टिकोण के साथ समस्या यह है कि आपको एक नई विधि की आवश्यकता होती है यदि आपका संदेशफॉर्मैट 2 पैरामीटर लेता है, और फिर भी 3 पैरामीटर लेने वाले व्यक्ति के लिए एक और तरीका है, आदि। क्या ऐसा करने का एक और शानदार तरीका है? यदि नहीं, तो इसे जेएसएफ की भावी रिलीज में जोड़ा जाना चाहिए क्योंकि यह ऐसा कुछ है जिसे डिफ़ॉल्ट रूप से समर्थित किया जाना चाहिए। – Zak

+0

नहीं। ईएल varargs का समर्थन नहीं करता है (कोई ओवरलोडेड फ़ंक्शन नाम भी नहीं है, इसलिए आपको वास्तव में 'format1() ',' format2()', 'format3() ', आदि की आवश्यकता है)। ध्यान दें कि यह एक जेएसएफ सीमा नहीं है, लेकिन एक ईएल सीमा है। बस 1 से 5 पैरामीटर लेने वाले कार्यों को बनाएं, या शायद 10।मैंने व्यक्तिगत रूप से वास्तविक दुनिया में कभी भी 5 से अधिक पैरामीटर के साथ एक बंडल प्रविष्टि नहीं बनाई/देखी है। – BalusC

+0

नहीं, मुझे जो चाहिए वह आवश्यक है एफ का उपयोग करने का एक तरीका है: बच्चों के साथ विशेषता। इस तरह, आप संदेश का उपयोग करने के लिए विशेषता के नाम पर f: विशेषता का नाम सेट कर सकते हैं (उदाहरण के लिए शीर्षक) और उसका बच्चा एच हो सकता है: outputFormat (ऊपर मेरा दूसरा प्रयास इस का अजीब उदाहरण है)। इससे संदेश हर समय उपयोग करने योग्य होगा जब तक कि सभी घटकों में एफ: विशेषता बच्चे हो। – Zak

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