2010-02-24 9 views
13

Czy można wywołać metody klasy z poziomu strony widoku?Wywoływanie metod klasycznych (statycznych) z poziomu strony widoku prędkości

W szczególności te, które nie są przekazywane do widoku?

w ASP.NET MVC mogę to zrobić:

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

Głosuję za ponownym otwarciem, ponieważ połączony dup dotyczy dostępu tylko do pól statycznych, podczas gdy pytanie to dotyczy wywoływania metod statycznych, co jest zupełnie inną rzeczą. – Vadzim

Odpowiedz

16

Ponieważ wpadł w górnej części mojego google na ten temat wydaje się, że ludzie mogą chcieć zobaczyć zaktualizowaną odpowiedź, kiedy się to na szczycie poszukiwaniu ...

(znaleziono to tutaj: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

w Velocity 1.5 lub wcześniej, można po prostu użyć:

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

ponieważ zawsze możesz wywołać metody statyczne w instancjach. :)

jednak, ponieważ istnieją pewne statyczne klas, z których nie można utworzenia instancji (np java.util.Math), dodaliśmy wsparcie w 1.6 dla statycznych metod klasy sans przypadkach:

Java:

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

Velocity:

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

Gus, ty i http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html w tajemniczy sposób wspominają o 'context.put()' w Javie, ale ja spędziłem Godzina, starając się dowiedzieć, co to oznacza i jak w moim wiosennym kontrolerze MVC mogę zrobić coś takiego. Gdzie definiuje się "kontekst"? Jaka to klasa? Dzięki! – Ryan

+1

Nie mogę mówić do konkretnej konfiguracji wiosennej, ale w obu przypadkach kontekst jest instancją 'VelocityContext' http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works – Gus

+0

Dzięki, Gus. Wciąż nie mogłem wymyślić, jak używać tego w moim kontroler Spring MVC, ale działało to: 'final String constantsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel(). put (FormConstants.TRANSLATION_CONSTANTS, new FieldMethodizer (constantsClassNameString)); ' – Ryan

4

Tutaj jest uniwersalnym sposobem wywołać dowolną metodę statyczną każdej klasie bez konieczności fo r wstępna manipulacja kontekstowa:

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

Wygląda na to, że powinien działać, ale użycie' Class.forName() 'ma zawsze wadę tworzenia zależności od klas, które są niewidoczne w czasie kompilacji i nie pękają do czasu wykonania. To nie jest wielka sprawa dla klas publicznych w JDK, ale potencjalny punkt bólu dla klas, które mogą nie być na ścieżce klasy w późniejszym terminie. Na przykład klasy, których nazwa została zmieniona, lub klasy, które są zależne od zależności, przestają być używane w późniejszym terminie. – Gus

+0

Co powiecie na System.getenv()? Czy istnieje sposób, aby przywołać go za pomocą tego hacky rozwiązanie? –

+0

@AleksandrKravets, powinno działać tak samo, jak zarówno 'Base64.getEncoder()' jak i 'System.getenv()' są publicznymi metodami statycznymi klas niemających znaczenia. I naprawdę działa z moją najnowszą prędkością 1.7. Możesz również spróbować wywołać metodę statyczną poprzez odbicie (http://stackoverflow.com/questions/2467544/invoking-a-static-method-using-reflection) jako ostatnią deskę ratunku. – Vadzim

Powiązane problemy