2009-09-01 18 views
40

क्या एक ऐसी विधि को कॉल करना संभव है जो Freemarker टेम्पलेट से पैरामीटर लेता है?मैं किसी ऑब्जेक्ट पर फ्रीमार्कर टेम्पलेट से जावा विधियों को कैसे कॉल करूं?

मेरे पास एक ऑब्जेक्ट मॉडल है जिसे मैं एक वेब पेज में फ्रीमार्कर के साथ प्रस्तुत करने का प्रयास कर रहा हूं। वस्तुओं में से एक यह सामग्री का sublist प्राप्त करने के लिए एक विधि है - एक पैरामीटर है कि सूची को फ़िल्टर करने के लिए इस्तेमाल लेने:

public List getunits(final String type);

मैं JSP में पता है कि तुम इस सीधे नहीं कर सकते, लेकिन आप कर सकते हैं कस्टम फ़ंक्शंस लिखें जो आपको इच्छित परिणाम प्राप्त करने की अनुमति देगा। आप Freemarker में इसे कैसे हल करते हैं? क्या यह कस्टम कार्यों को लिखने के साथ ही है? या वास्तव में इस तरह के समारोह को बुलाए जाने का कोई तरीका है?

उत्तर

33

फ्रीमार्कर expressions के भीतर मॉडल के माध्यम से उपलब्ध कराए गए तरीकों को आविष्कार करने की अनुमति देता है।

मानते हुए अपने वस्तु myBean के रूप में उजागर किया गया है आप विधि आह्वान कर सकते हैं इस प्रकार है:

<#list myBean.getunits("myType") as unit> 
    do stuff with ${unit} 
</#list> 

आप निश्चित रूप से, <list> उपयोग करने के लिए नहीं है, यह बाद से अपने विधि एक रिटर्न एक उदाहरण के रूप में सिर्फ वहाँ सूची।

+1

समस्याओं था जब मेरे सेम एक ट्री-मैप का विस्तार किया गया था। यह उस मामले में विधि नहीं ढूंढ सकता है। – tbraun

+2

@tbraun: आपको उस मामले में '? Api' की आवश्यकता है। 'मैप' के तरीकों का खुलासा नहीं किया गया है (कम से कम 'डिफ़ॉल्ट ऑब्जेक्टवापर' के साथ) क्योंकि जावा में विपरीत, एफटीएल में, विधियों का अपना नामस्थान नहीं होता है। इसलिए वे मानचित्र में चाबियों के साथ मिश्रण करेंगे, जैसे 'myMap.someKey' और' myMap.get' ('Map.get' विधि लौटाता है) दोनों कुछ वापस कर देंगे, और दोनों को' myMap? Keys 'के साथ सूचीबद्ध किया जाएगा, आदि यह एक गड़बड़ होगी। तो डिफ़ॉल्ट रूप से 'myMap.something' केवल' कुछ '' मानचित्र 'कुंजी की तलाश करता है, न कि' कुछ 'विधि। लेकिन आप इसे 'myMap? Api.get (...)' के आसपास काम कर सकते हैं। – ddekany

20

के रूप में ChssPly76 ने कहा, जब तक आप मॉडल में ऑब्जेक्ट का पर्दाफाश करते हैं, तब तक आप केवल एक फ्रीमार्कर टेम्पलेट के भीतर विधि कॉल को चित्रित कर सकते हैं।

लेकिन यह है कि यदि आपके विधि रिटर्न शून्य (जो भी कारण के लिए), तो आप भ्रमित

Expression myBean.getunits() is undefined on line .... 

इससे बचने के लिए, तो आप बेहतर myBean.getunits(...)! का उपयोग करना चाहिए (विस्मयादिबोधक नोटिस प्राप्त करने के लिए जा रहे हैं को ध्यान में रखना महत्वपूर्ण है बिंदु)।

बारे में अधिक जानें Freemarker यहाँ nulls संभालता है: http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

'!' के बारे में जानना बहुत उपयोगी है। साथ ही, ध्यान दें कि 'getunits' विधि की वापसी के लिए डिफ़ॉल्ट मान जोड़ने के लिए उपयोगी हो सकता है: इस तरह: '<#list myBean.getunits (" myType ")! [] इकाई के रूप में>'। इस मामले में, डिफ़ॉल्ट एक खाली अनुक्रम है। –