2010-02-24 3 views
13

È possibile chiamare i metodi di classe dall'interno di una pagina di visualizzazione?Chiamare i metodi di classe (statici) dall'interno di una vista di velocity

In particolare quelli che non vengono passati nella vista?

in asp.net MVC posso fare questo:

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

Io voto per riaprire come DUP collegato è su come accedere a campi statici solo quando questa domanda è di chiamare i metodi statici che è cosa ben diversa. – Vadzim

risposta

16

Dal momento che questo è venuto su in cima alla mia ricerca di Google su questo argomento sembra che la gente avrebbe fatto piacere vedere una risposta aggiornata quando ottengono questo sulla parte superiore della loro ricerca ...

(pensa che questa qui: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

in Velocity 1.5 o precedenti, si può semplicemente utilizzare:

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

perché è sempre possibile chiamare metodi statici su istanze. :)

tuttavia, dal momento che ci sono alcune classi statiche di cui non si può creare istanze (ad esempio java.util.Math), abbiamo aggiunto il supporto a 1.6 per metodi della classe sans casi statici:

Java:

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

Velocity:

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

Gus, tu e http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html entrambi misteriosamente menzionano 'context.put()' in Java, ma ho speso un'ora cercando di capire cosa significa e come nel mio controller Spring MVC posso fare qualcosa del genere. Dove viene definito il "contesto"? Che classe è? Grazie! – Ryan

+1

Non riesco a parlare con la tua particolare configurazione di primavera, ma in entrambi i casi il contesto è un'istanza di 'VelocityContext' http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works – Gus

+0

Grazie Gus. Non riuscivo ancora a capire come usarlo nel mio controller Spring MVC, ma questo ha funzionato: 'final String constantsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel(). put (FormConstants.TRANSLATION_CONSTANTS, new FieldMethodizer (constantsClassNameString)); ' – Ryan

4

Ecco un modo universale per chiamare qualsiasi metodo statico di qualsiasi classe senza bisogno fo r preliminarmente manipolazione contesto:

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

Sembra che dovrebbe funzionare, ma l'uso di' Class.forName() 'ha sempre lo svantaggio di creare dipendenze da classi che sono invisibile al momento della compilazione e non si interrompe fino al runtime. Non è un grosso problema per le classi pubbliche nel JDK, ma un potenziale punto di dolore per le classi che potrebbero non essere sul percorso di classe in un secondo momento. Ad esempio, le classi che vengono rinominate o le classi che sono sotto-dipendenze di alcune dipendenze si smette di usare in un secondo momento. – Gus

+0

Che ne dici di System.getenv()? C'è un modo per invocarlo tramite questa soluzione hacky? –

+0

@AleksandrKravets, dovrebbe funzionare come "Base64.getEncoder()" e "System.getenv()" sono metodi statici pubblici di classi non istanziabili. E funziona davvero con l'ultima velocità 1.7 nel mio caso. Puoi anche provare a [chiamare il metodo statico tramite reflection] (http://stackoverflow.com/questions/2467544/invoking-a-static-method-using-reflection) come ultima risorsa. – Vadzim