2010-02-24 10 views
13

Können Sie Klassenmethoden innerhalb einer Ansichtsseite aufrufen?Aufruf von Klassenmethoden (statisch) aus einer Geschwindigkeitsansichtsseite

Speziell diejenigen, die nicht in die Ansicht übergeben werden?

In asp.net MVC kann ich dies tun:

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

Ich stimme für das erneute Öffnen als verknüpfte Dup ist über den Zugriff auf statische Felder nur während diese Frage über das Aufrufen von statischen Methoden, die ganz andere Sache ist. – Vadzim

Antwort

16

Da dies kam zu diesem Thema in der Spitze meiner Google-Suche, um es wie Leute scheint vielleicht wie eine aktualisierte Antwort zu sehen, wenn sie diese erhalten auf der Spitze ihrer Suche ...

(das hier gefunden: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

in Velocity 1.5 oder früher, können Sie einfach verwenden:

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

weil Sie immer statische Methoden für Instanzen aufrufen können. :)

jedoch, da es einige statische Klassen, von denen können Sie keine Instanzen erstellen (zB java.util.Math), haben wir Unterstützung in 1.6 für statische Klassenmethoden sans Instanzen:

Java:

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

Geschwindigkeit:

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

Gus, Sie und http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html erwähnen beide auf mysteriöse Weise 'context.put()' in Java, aber ich habe ausgegeben Eine Stunde lang versuche ich herauszufinden, was das bedeutet und wie ich in meinem Spring MVC Controller so etwas machen kann. Wo wird "Kontext" definiert? Was für eine Klasse ist das? Vielen Dank! – Ryan

+1

Ich kann nicht mit Ihrem speziellen Spring-Setup sprechen, aber in beiden Fällen Kontext ist eine Instanz von 'VelocityContext' http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works – Gus

+0

Danke Gus. Ich konnte immer noch nicht herausfinden, wie man das in meinem Spring MVC Controller benutzt, aber das funktionierte: 'final String constentsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel(). put (FormConstants.TRANSLATION_CONSTANTS, neuer FieldMethodizer (constentsClassNameString)); ' – Ryan

4

Hier ist eine universelle Möglichkeit, jede statische Methode einer Klasse ohne Notwendigkeit zu nennen fo r vorläufige Kontextmanipulation:

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

Das sieht so aus, als sollte es funktionieren, aber die Verwendung von' Class.forName() 'hat immer den Nachteil Abhängigkeiten von Klassen zu erzeugen unsichtbar zur Kompilierzeit und nicht zur Laufzeit unterbrochen. Keine große Sache für öffentliche Klassen im JDK, aber ein potenzieller Schwachpunkt für Klassen, die möglicherweise zu einem späteren Zeitpunkt nicht auf dem Klassenpfad sein könnten. Zum Beispiel Klassen, die umbenannt werden, oder Klassen, die Unterabhängigkeiten einer Abhängigkeit sind, die Sie zu einem späteren Zeitpunkt nicht mehr verwenden. – Gus

+0

Wie wäre es mit System.getenv()? Gibt es eine Möglichkeit, es über diese Hacky-Lösung aufzurufen? –

+0

@AleksandrKravets, sollte es genauso funktionieren wie "Base64.getEncoder()" und "System.getenv()" sind öffentliche statische Methoden der unstantiierbaren Klassen. Und es funktioniert wirklich mit der neuesten Geschwindigkeit 1.7 in meinem Fall. Sie können auch versuchen [statische Methode über Reflektion aufzurufen] (http://stackoverflow.com/questions/2467544/invoking-a-static-method-using-reflection) als letzten Ausweg. – Vadzim

Verwandte Themen