属性变量设置与速度

时间:2014-01-21 10:15:10

标签: velocity properties-file

在我搜索期间,我想要确认:

我想将属性变量设置为速度变量类型:

#set($infos.get("trackerData").get(0).get("info_suivi")=tracking.status)

我的属性文件包含:

tracking.status.liv=livré
tracking.status.env=envoyé
tracking.status.cmd=commandé
tracking.status.err=erreur
tracking.status.ann=annulé

和$ infos是一张地图

这是正确的语法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

#set的主要用例是为变量赋值:

#set ($variable = 'value')

仅在较新版本的Velocity中使用的辅助用例是为对象属性赋值,如果有这些属性的setter (即对象是简单的bean):

#set ($object.property = 'value')
## Same as:
$object.setProperty('value')

通过一些Velocity魔法,这也适用于地图和索引列表:

#set ($map = {})
#set ($map.key = 'value')
$map
## Same as:
$map.put('key', 'value')
## ...except that it doesn't print the previous value stored in the map

#set ($array = ['original'])
#set ($array[0] = 'changed')
$array
## Same as:
$array.set(0, 'changed')
## ...except that it doesn't print the previous value stored in the array

但它永远无法为另一个值赋值。 $infos.get("trackerData").get(0).get("info_suivi")以getter结尾,因此它将返回一个值。几乎在所有编程语言中都不可能为另一个值赋值。

其次,无论#set ($something = tracking.status)是什么,$something都无效。如果你尝试它会给出语法错误。除了由它知道的极少数关键字提供的内容之外,Velocity没有任何本机功能:#foreach用于迭代变量,#if用于测试变量,#set用于更改变量,以及其他几个没有真正处理变量的人。属性文件是否应该用作本地化资源?然后你需要在ResourceBundleProperties对象中加载它们,将该对象放在VelocityContext中,然后通过调用用于获取值的Java类的方法来使用它在一把钥匙上。 ResourceBundlegetString('key')get('key')对象为Properties

第三,属性文件具有以tracking.status作为前缀的键,tracking.status本身不是实际属性。你如何获得实际状态?您是否真的试图通过在info_suivi属性后面添加tracking.status.前缀的值来获取密钥后面的消息?然后,假设属性文件通过$messages公开,这应该有效:

$messages.getString("tracking.status.${infos.get('trackerData').get(0).get('info_suivi')}")

如果您想将其存储在变量中而不是直接打印它:

#set ($infoSuivi = $messages.getString("tracking.status.${infos.get('trackerData').get(0).get('info_suivi')}"))