2010-02-24 12 views
13

Pouvez-vous appeler des méthodes de classe à partir d'une page de vue?Appel de méthodes de classe (statiques) à partir d'une page de vue de vélocité

Spécifiquement ceux qui ne sont pas passés dans la vue?

Dans asp.net MVC Je peux le faire:

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

Je vote pour la réouverture dup est lié sur l'accès aux champs statiques alors que cette question est sur le point d'appeler des méthodes statiques qui est tout autre chose. – Vadzim

Répondre

16

Depuis Cela est arrivé au sommet de ma recherche google sur ce sujet, il semble que les gens pourraient vous voir une réponse mise à jour quand ils cette au sommet de leur recherche ...

(trouvé ce ici: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

Velocity 1.5 ou une version antérieure, vous pouvez simplement utiliser:

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

car vous pouvez toujours appeler des méthodes statiques sur des instances. :)

cependant, car il existe des classes statiques dont vous ne pouvez pas créer des instances (par exemple java.util.Math), nous avons ajouté le support à 1.6 pour méthodes statiques de classe sans instances:

Java:

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

vitesse:

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

Gus, vous et http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html mentionnent mystérieusement 'context.put()' en Java, mais j'ai dépensé une heure à essayer de comprendre ce que cela signifie et comment dans mon contrôleur Spring MVC je peux faire quelque chose comme ça. Où le "contexte" est-il défini? De quelle classe s'agit-il? Merci! – Ryan

+1

Je ne peux pas parler à votre configuration de ressort particulier, mais dans les deux cas, le contexte est une instance de 'VelocityContext' http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works – Gus

+0

Merci Gus. Je ne pouvais toujours pas comprendre comment utiliser cela dans mon contrôleur Spring MVC, mais cela a fonctionné: 'final String constantsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel(). put (FormConstants.TRANSLATION_CONSTANTS, new FieldMethodizer (constantsClassNameString)); ' – Ryan

4

Voici un moyen universel d'appeler une méthode statique d'une classe sans avoir besoin fo r préliminairement manipulation de contexte:

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

Cela semble fonctionner, mais l'utilisation de' Class.forName() 'a toujours l'inconvénient de créer des dépendances sur les classes qui sont invisible au moment de la compilation, et ne se casse pas avant l'exécution. Pas un gros problème pour les classes publiques dans le JDK, mais un point de douleur potentiel pour les classes qui pourraient ne pas être sur le chemin de la classe à une date ultérieure. Par exemple, les classes qui sont renommées, ou les classes qui sont des sous-dépendances de certaines dépendances que vous arrêtez d'utiliser à une date ultérieure. – Gus

+0

Que diriez-vous de System.getenv()? Y at-il un moyen de l'invoquer via cette solution hacky? –

+0

@AleksandrKravets, cela devrait fonctionner exactement comme 'Base64.getEncoder()' et 'System.getenv()' sont des méthodes statiques publiques de classes non-invisibles. Et ça marche vraiment avec la dernière vélocité 1.7 dans mon cas. Vous pouvez également essayer de [appeler la méthode statique par réflexion] (http://stackoverflow.com/questions/2467544/invoking-a-static-method-using-reflection) en dernier recours. – Vadzim