【发布时间】:2011-01-20 17:08:02
【问题描述】:
你可以从视图页面中调用类方法吗?
特别是那些没有传递到视图中的?
在 asp.net MVC 中我可以这样做:
<%= SomeClass.FixDateFormat(ViewData.Model.SomeClass.DateCreated) %>
【问题讨论】:
你可以从视图页面中调用类方法吗?
特别是那些没有传递到视图中的?
在 asp.net MVC 中我可以这样做:
<%= SomeClass.FixDateFormat(ViewData.Model.SomeClass.DateCreated) %>
【问题讨论】:
这是调用任何类的任何静态方法的通用方法,无需预先进行上下文操作:
#set($str='test')##
#set($Base64=$str.class.forName('java.util.Base64'))##
$Base64.getEncoder().encodeToString($str.getBytes('utf8'))
【讨论】:
Class.forName() 总是有一个缺点,即创建在编译时不可见的类的依赖关系,并且直到运行时才中断。对于 JDK 中的公共类来说没什么大不了的,但对于以后可能不在类路径上的类来说,这是一个潜在的痛点。例如,被重命名的类,或者是您以后停止使用的某些依赖项的子依赖项的类。
Base64.getEncoder() 和System.getenv() 都是不可实例化类的公共静态方法一样工作。就我而言,它确实适用于最新的速度 1.7。您也可以尝试call static method via reflection 作为最后的手段。
由于这出现在我关于这个主题的谷歌搜索的顶部,似乎人们可能希望在他们的搜索顶部看到这个更新的答案......
(在这里找到:http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)
在 Velocity 1.5 或更早版本中,您可以使用:
#set( $String = '' )
#set( $foo = $String.format('%.1f', $dataFedIn) )
因为您总是可以在实例上调用静态方法。 :)
但是,由于有些静态类是您无法使用的 创建实例(例如 java.util.Math),我们在 1.6 中添加了对 无实例的静态类方法:
Java:
context.put("String", String.class);
速度:
#set( $foo = $String.format('%.1f', $dataFedIn) )
【讨论】:
context.put(),但我花了一个小时试图弄清楚这意味着什么以及如何在我的 Spring MVC 控制器中执行类似的操作那。 “上下文”在哪里定义?它是什么课?谢谢!
VelocityContext velocity.apache.org/engine/releases/velocity-1.7/… 的实例
final String constantsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel().put(FormConstants.TRANSLATION_CONSTANTS, new FieldMethodizer(constantsClassNameString));