2010-02-24 10 views
13

क्या आप क्लास विधियों को दृश्य पृष्ठ के अंदर से कॉल कर सकते हैं?कॉलिंग क्लास विधियों (स्थिर) को एक वेग दृश्य पृष्ठ के अंदर से कॉल करना

विशेष रूप से वे जो दृश्य में पास नहीं हुए हैं?

asp.net MVC में मैं यह कर सकता:

<%= SomeClass.FixDateFormat(ViewData.Model.SomeClass.DateCreated) %> 
+3

मैं फिर से खोलना के रूप में जुड़ा हुआ dup स्थिर क्षेत्रों इस सवाल स्थिर तरीकों जो काफी अलग बात है बुला के बारे में है ही, जबकि पहुँचने के बारे में है के लिए वोट देते हैं। – Vadzim

उत्तर

16

इस के बाद से इस विषय में यह लोगों की तरह लगता है पर मेरी Google खोज के शीर्ष में आया एक अद्यतन जवाब देखने के लिए जब वे इस मिल पसंद आ सकते हैं उनकी खोज के शीर्ष ... पर

(पाया इस यहाँ: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

वेग 1.5 में या उससे पहले, आप बस का उपयोग कर सकते हैं:

#set($String = '') 
#set($foo = $String.format('%.1f', $dataFedIn)) 

क्योंकि आप हमेशा उदाहरणों पर स्थैतिक तरीकों को कॉल कर सकते हैं।

जावा: :)

हालांकि, के बाद से वहाँ कुछ स्थिर वर्ग है जो की आप उदाहरणों (जैसे java.util.Math) नहीं बना सकते हैं, तो हम समर्थन 1.6 में स्थिर वर्ग तरीकों बिना उदाहरण के लिए जोड़ा

context.put("String", String.class); 

वेग:

#set($foo = $String.format('%.1f', $dataFedIn)) 
+1

गुस, आप और http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html दोनों रहस्यमय रूप से जावा में 'context.put() 'का उल्लेख करते हैं, लेकिन मैंने खर्च किया है यह समझने की कोशिश कर रहा है कि इसका मतलब क्या है और मेरे स्प्रिंग एमवीसी नियंत्रक में मैं ऐसा कुछ कैसे कर सकता हूं। "संदर्भ" कहां परिभाषित किया जाता है? यह किस वर्ग है? धन्यवाद! – Ryan

+1

मैं आपके विशेष वसंत सेटअप से बात नहीं कर सकता, लेकिन दोनों मामलों में संदर्भ 'VelocityContext' का एक उदाहरण है http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works – Gus

+0

धन्यवाद गुस मैं अभी भी यह नहीं समझ पाया कि मेरे स्प्रिंग एमवीसी नियंत्रक में इसका उपयोग कैसे किया जाए, लेकिन यह काम करता था: 'अंतिम स्ट्रिंग स्थिरांक क्लासनामस्ट्रिंग = अनुवादकॉन्स्टेंट्स। क्लास .getCanonicalName(); modelAndView.getModel()। put (FormConstants.TRANSLATION_CONSTANTS, नया फ़ील्डमेडाइज़र (constantsClassNameString)); ' – Ryan

4

यहाँ एक सार्वभौमिक रास्ते की जरूरत के लिए बिना किसी भी वर्ग के किसी भी स्थिर विधि कॉल करने के लिए है आर प्रारंभिक संदर्भ में गड़बड़ी:

#set($String='')## 
#set($Base64=$String.class.forName('java‌​.util.Base64'))## 
#‌​set($str='test')## 
​$Base64.getEncoder()‌​.encodeToString($str‌​.getBytes('utf8')) 
+1

ऐसा लगता है कि इसे काम करना चाहिए, लेकिन 'class.forName()' का उपयोग हमेशा कक्षाओं पर निर्भरता बनाने की कमी है संकलन समय पर अदृश्य, और रनटाइम तक तोड़ना नहीं है। जेडीके में सार्वजनिक कक्षाओं के लिए एक बड़ा सौदा नहीं है, लेकिन कक्षाओं के लिए एक संभावित दर्द बिंदु जो संभवतः बाद की तारीख में कक्षा पथ पर नहीं हो सकता है। उदाहरण के लिए कक्षाएं जिन्हें नाम दिया जाता है, या कक्षाएं जो कुछ निर्भरता की उप-निर्भरता हैं, आप बाद की तारीख में उपयोग करना बंद कर देते हैं। – Gus

+0

System.getenv() के बारे में कैसे? क्या इस हैकी समाधान के माध्यम से इसे आमंत्रित करने का कोई तरीका है? –

+0

@ अलेक्ज़ेंडर क्रावेट्स, इसे केवल 'बेस 64.getEncoder()' और 'System.getenv()' दोनों के समान ही काम करना चाहिए, जो निर्विवाद वर्गों के सार्वजनिक स्थैतिक तरीकों हैं। और यह वास्तव में मेरे मामले में नवीनतम वेग 1.7 के साथ काम करता है। आप अंतिम उपाय के रूप में [प्रतिबिंब के माध्यम से स्थिर विधि को कॉल करने का प्रयास भी कर सकते हैं] (http://stackoverflow.com/questions/2467544/invoking-a-static-method-using-reflection)। – Vadzim

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