在我搜索期间,我想要确认:
我想将属性变量设置为速度变量类型:
#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是一张地图
这是正确的语法吗?
感谢。
答案 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
用于更改变量,以及其他几个没有真正处理变量的人。属性文件是否应该用作本地化资源?然后你需要在ResourceBundle
或Properties
对象中加载它们,将该对象放在VelocityContext
中,然后通过调用用于获取值的Java类的方法来使用它在一把钥匙上。 ResourceBundle
为getString('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')}"))