你能否从视图页面内部调用类方法?
具体而言,这些方法没有被传递到视图中吗?
在ASP.NET MVC中,我可以这样做:
<%= SomeClass.FixDateFormat(ViewData.Model.SomeClass.DateCreated) %>
由于这个问题在我谷歌搜索的顶部出现,似乎大家会希望看到一个更新的答案,当他们在搜索时找到这篇文章...
(在这里找到了这个链接: http://velocity.10973.n7.nabble.com/Use-of-static-functions-td15126.html)
在Velocity 1.5或更早版本中,你可以直接使用:
#set( $String = '' )
#set( $foo = $String.format('%.1f', $dataFedIn) )
context.put("String", String.class);
速度:
#set( $foo = $String.format('%.1f', $dataFedIn) )
下面是一种通用的方式,无需预处理上下文即可调用任何类的任何静态方法:
#set($str='test')##
#set($Base64=$str.class.forName('java.util.Base64'))##
$Base64.getEncoder().encodeToString($str.getBytes('utf8'))
Class.forName()
总是存在一个缺点,即在编译时创建对不可见类的依赖关系,直到运行时才会出现问题。对于JDK中的公共类来说并不是什么大问题,但对于可能在以后的某个日期不在类路径上的类来说,这可能是一个潜在的痛点。例如,被重命名的类或是某些您在以后不再使用的依赖项的子依赖项的类。 - GusBase64.getEncoder()
和System.getenv()
一样工作,因为它们都是不可实例化类的公共静态方法。在我的情况下,最新的velocity 1.7确实可以工作。您还可以尝试通过反射调用静态方法作为最后的手段。 - Vadzim#set($Base64=$content.class.forName('java.util.Base64'))
,而不是创建类型为String
的新变量,例如set($String='')
。 - Hubbitus
VelocityContext
的一个实例。http://velocity.apache.org/engine/releases/velocity-1.7/developer-guide.html#How_Velocity_Works - Gusfinal String constantsClassNameString = TranslationConstants.class .getCanonicalName(); modelAndView.getModel().put(FormConstants.TRANSLATION_CONSTANTS, new FieldMethodizer(constantsClassNameString));
- Ryan