在速度模板中创建对象

时间:2012-09-07 15:23:20

标签: velocity

我已经看过这个问题了,但它正在讨论liferay-velocity,似乎可以访问我无法访问的'$ portal'对象。

Create object in velocity template

具体来说,我正在尝试在模板中创建一个Locale对象,将其传递给$ dateTool.format调用以获取特定语言的输出。

我无法预先创建区域设置对象并将其传递给模板,因为该代码可以调用各种模板,每种模板都可以使用不同的语言。

我试过

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName

但是只输出'$ localeClass.getName'(我不确定$ portal是否是一些神奇的预设变量或其他东西)。

我也试过

#set($localeClass = java.util.Locale.class)
$localeClass.getName

但是当我尝试处理模板时,这给了我一个运行时异常。

我在Velocity中看到了ClassTool,但这并不支持自动执行代码。我想我可以试试像$classTool.inspect("java.util.Locale").getType.getConstructor([$classTool.inspect("java.util.String"),$classTool.inspect("java.util.String")]).newInstance(["es","ES"])这样的东西。

我会尝试一下,但与此同时我会看到是否有其他人有更好的主意。

修改

自发布以来,我意识到velocity有一个ConversionTool(未在GenericTool概述页面上列出),它有一个我可以调用的toLocale函数。所以我可以使用

$dateTool.format('dd-MMM-yyyy', $date, $conversionTool.toLocale("es_ES"))

但我仍然很好奇是否有办法通过反思来实现这一点。

2 个答案:

答案 0 :(得分:1)

您做得很好,但您应该使用$localeClass.getName()$localeClass.name代替$localeClass.getName。请参阅Velocity用户指南中的Property Lookup Rules

此:

#set($localeClass = $portal.getClass().forName("java.util.Locale"))
$localeClass.getName()

为我正确输出字符串“java.util.Locale”。

答案 1 :(得分:0)

据我了解,您也可以使用

$localeUtil.fromLanguageId("es_ES")

用于在Velocity模板中获取区域设置。

至于我,我最近也尝试使用反射来获取语言环境,但没有成功。所以我很好奇是否有可能。