2013-06-07 2 views
5

मेरी वेग टेम्पलेट (.vm फ़ाइल) में मैं VelocityContext में मौजूद सभी चर या विशेषताओं के माध्यम से कैसे लूप कर सकता हूं? नीचे दिए गए कोड के संदर्भ में, मैं टेम्पलेट को संदर्भ में पारित सभी फलों के नाम और गिनती लिखना चाहता हूं।VelocityContext में सभी चर लूप कैसे करें?

Map<String, Object> attribues = ...; 
attribues.put("apple", "5"); 
attribues.put("banana", "2"); 
attribues.put("orange", "3"); 

VelocityContext velocityContext = new VelocityContext(attribues); 
velocityEngine.mergeTemplate(templateLocation, encoding, velocityContext, writer); 

उत्तर

4

डिफ़ॉल्ट रूप से आप ऐसा नहीं कर सकते, क्योंकि आप संदर्भ वस्तु की पकड़ नहीं मिल सकता है:

वह कुछ इस तरह होगा। लेकिन आप संदर्भ को संदर्भ में ही डाल सकते हैं।

जावा:

attributes.put("vcontext", attributes); 

.vm:

#foreach ($entry in $vcontext.entrySet()) 
    $entry.key => $entry.value 
#end 

जब से तुम को लाइव संदर्भ पढ़ रहे हैं जबकि यह भी कोड है कि नक्शे को संशोधित करता है को क्रियान्वित करने के लिए, आप अपवाद प्राप्त करने के लिए जा रहे हैं। तो सबसे पहले मानचित्र की एक प्रति बनाना सर्वोत्तम है:

#set ($vcontextCopy = {}) 
$!vcontextCopy.putAll($vcontext) 
#foreach ($entry in $vcontextCopy.entrySet()) 
    ## Prevent infinite recursion, don't print the whole context again 
    #if ($entry.key != 'vcontext' && $entry.key != 'vcontextCopy') 
    $entry.key => $entry.value 
    #end 
#end 
+0

धन्यवाद। मैं एक पुष्टिकरण की तलाश में था कि यह सीधे संभव नहीं है। हालांकि, जब मैं आपके कोड को निष्पादित करता हूं तो Velocity की 'Foreach.render' विधि' ConcurrentModificationException' फेंक रही है। क्या यह आपके लिए काम करता है? मैं वेग 1.7 का उपयोग कर रहा हूँ। – Somu

+0

क्या आप परिणाम छापने के अलावा कुछ और कर रहे हैं, जैसा कि मेरे उदाहरण में है? एक संभावना यह होगी कि प्रविष्टियां प्राप्त करने के बाद संदर्भ में '$ एंट्री' चर जोड़ा गया है, जो वास्तव में 'ConcurrentModificationException' को ट्रिगर करेगा। 'त्वरित गुण' चर के लिए एक सरल 'हैश मैप' के बजाय 'ConcurrentHashMap' का उपयोग करना एक त्वरित कार्यवाही है। –

+0

नहीं, मैं सरल पाश और प्रिंटिंग के अलावा कुछ भी नहीं कर रहा हूं। 'ConcurrentHashMap' का उपयोग करके दिलचस्प रूप से 'StackOverflowError' फेंकता है! मैं अभी भी पुष्टि करने के लिए आपका उत्तर स्वीकार करने जा रहा हूं कि टेम्पलेट से संदर्भ तक पहुंचने का कोई सीधा तरीका नहीं है। – Somu

2

कैसे मैं सभी चर के माध्यम से या VelocityContext में मौजूद विशेषताओं पाश कर सकते हैं?

यदि मैंने आपको गलत समझा नहीं है, तो क्या आप जानना चाहते हैं कि मानचित्र में निहित कुंजी/मूल्य जोड़े के माध्यम से कैसे लूप करना है, जिससे आपने अपना ऑब्जेक्ट बनाया है?

यदि हां, तो आप internalGetKeys() विधि को कॉल कर सकते हैं जो VelocityContext ऑब्जेक्ट में निहित कुंजी की सरणी वापस कर देगा।

फिर सभी चाबियों के माध्यम से लूप करें और प्रत्येक कुंजी से जुड़े मान प्राप्त करने के लिए internalGet() का उपयोग करें। ,

 VelocityContext velocityContext = new VelocityContext(attribues); 
     Object[] keys = velocityContext.internalGetKeys(); 

     for(Object o : keys){ 
      String key = (String)o; 
      String value = (String)velocityContext.internalGet(key); 
      System.out.println(key+" "+value); 
     } 
+0

धन्यवाद ज़ौज़ौ, मुझे लगता है कि आपने मेरी समस्या को सही ढंग से समझा है। क्या आप कृपया मेरी मदद कर सकते हैं कि .vm टेम्पलेट फ़ाइल से 'internalGetKeys() 'और' internalGet() 'को कैसे कॉल करें? मैं '#foreach (आंतरिक getKeys() में $ key) $ key # end' – Somu

+0

@ सोमू में अपना लापता लिंक ढूंढ रहा हूं, उम्मीद है कि यह –

+0

धन्यवाद। हालांकि, मैं Velocity टेम्पलेट (.vm फ़ाइल) से इन विधियों को कॉल करने का एक तरीका ढूंढ रहा था। – Somu

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