从速度视图页面内调用类方法(静态)

Bla*_*man 18 java velocity

你能从视图页面调用类方法吗?

特别是未传递到视图中的那些?

在asp.net MVC中,我可以这样做:

<%= SomeClass.FixDateFormat(ViewData.Model.SomeClass.DateCreated) %>
Run Code Online (Sandbox Code Playgroud)

Gus*_*Gus 21

由于这个问题出现在我关于这个主题的谷歌搜索的顶部,似乎人们可能希望看到更新的答案,当他们在他们的搜索的顶部...

(在此处找到:http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)

在Velocity 1.5或更早版本中,您可以使用:

#set( $String = '' )
#set( $foo = $String.format('%.1f', $dataFedIn) )
Run Code Online (Sandbox Code Playgroud)

因为你总是可以在实例上调用静态方法.:)

但是,由于有些静态类无法创建实例(例如java.util.Math),因此我们在静态类方法的实例中添加了1.6的支持:

Java的:

context.put("String", String.class);
Run Code Online (Sandbox Code Playgroud)

速度:

#set( $foo = $String.format('%.1f', $dataFedIn) ) 
Run Code Online (Sandbox Code Playgroud)

  • Gus,您和http://velocity.apache.org/engine/devel/apidocs/org/apache/velocity/app/FieldMethodizer.html都在Java中神秘地提到了“ context.put()”,但我花了一个一个小时的时间试图弄清楚这是什么意思,以及如何在Spring MVC控制器中执行类似的操作。“上下文”在哪里定义?这是什么班?谢谢! (2认同)

Vad*_*zim 9

这是一种调用任何类的静态方法而不需要初步上下文操作的通用方法:

#set($String='')##
#set($Base64=$String.class.forName('java??.util.Base64'))##
#??set($str='test')##
?$Base64.getEncoder()??.encodeToString($str??.getBytes('utf8'))
Run Code Online (Sandbox Code Playgroud)

  • 这看起来应该可以工作,但是使用`Class.forName()`总是有缺点,即在编译时不可见的类上创建依赖项,并且在运行时不会中断.对于JDK中的公共类来说,这并不是什么大不了的事,但对于以后可能不会出现在类路径上的类来说是一个潜在的痛点.例如,重命名的类,或者是您在以后停止使用的某些依赖项的子依赖项的类. (2认同)
  • @Vadzim 谢谢,它拯救了我的一天,我无法访问生成器 java 并且想知道如何从模板生成 uuid。 (2认同)
  • 而不是根据 [answer](https://community.atlassian.com/t5/Answers-Developer-Questions/Re-Access-) 创建“String”类型的新变量,如“set($String='')” pageManager-from-velocity/qaq-p/478628/comment-id/16283#M16283) 你可以使用像 `#set($Base64=$content.class.forName('java‌​.util.Base64'))` (2认同)