#set 的主要用例是为变量赋值:
#set ($variable = 'value')
仅适用于较新版本的 Velocity 的辅助用例是为对象属性分配值,如果这些属性有设置器(即对象是一个简单的 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 结尾,因此它会返回一个值。在几乎所有编程语言中,将一个值分配给另一个值是不可能的。
其次,无论$something是什么,#set ($something = tracking.status)都是无效的。如果你尝试它会给出一个语法错误。除了它知道的极少数关键字提供的功能外,Velocity 没有任何本机功能:#foreach 用于迭代变量,#if 用于测试变量,#set 用于更改变量,以及其他一些没有t 真正处理变量。属性文件是否应该用作本地化资源?然后您需要将它们加载到ResourceBundle 或Properties 对象中,将该对象放在VelocityContext 中,然后通过调用用于基于键获取值的Java 类的方法来使用它。 getString('key') 对应 ResourceBundle,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')}"))