Velocity模板引擎 - 键值对映射

13

我在使用Velocity时遇到了一些使用键值映射的问题。

有人有这个功能的示例吗?

$myMap ={}

$myMap.put("mykey1", "myvalue")
$myMap.delete("mykey1")
$myMap.getValue("mykey1")
3个回答

22

正如Nathan所说,你应该使用:

#set ($myMap = {})

创建一个新的Map并将其分配给一个变量。

现在,为什么会打印put调用。

  1. 任何不在指令内部的内容(例如#set(not printed)#if(not printed)#foreach(again not printed)),包括自由文本、变量和方法调用,都会被打印。

  2. Velocity无法区分$myMap.get('mykey')$myMap.put('key', 'value')(读者与写者之间的不同语义),因此put调用的结果会被打印,就像其他任何方法一样。

  3. 每当某些东西无法正确评估时,因为未定义变量或沿着某条线路某个方法返回null,导致无法评估的代码会被直接转储到输出中。

  4. put方法的文档所述,该函数返回存储在该键下的上一个值,如果根本没有设置任何值,则返回null

  5. 总之,这行代码被打印是很正常的。

要尝试这个理论,您可以这样做:

#set ($myMap = {})
$myMap.put('key', 'first value')
$myMap.put('key', 'second value')
$myMap.get('key')

这将被打印出来:

$myMap.put('key', 'first value')
first value
second value

有两种方法可以使该行不被打印:

  1. 将函数的结果存储在一个临时变量中:#set ($discard = $myMap.put('key', 'value')

  2. 使用silent方法调用:$!myMap.put('key', 'value')

我建议使用第一种方法,因为当您替换现有值时,第二种方法仍然会打印一些内容。


1
#if ($myMap.put('key', 'value'))#end - gknicker
1
  1. #if ($myMap.put('key', 'value'))#end
  2. #if ($myMap.put('key', 'value'))#end
- undefined

3

您尝试过执行以下操作吗:

#set( $myMap = {} )

同样,确保您使用的是现代版本的Velocity。古老的版本在VTL中没有地图语法。


哦,我可能一直犯了一个错误。#set($myMap = {}) + $myMap.put("mykey1", "myvalue") 会创建输出 > $myMap.put("mykey1", "myvalue")。我刚开始使用Velocity。我以为当命令是输出的一部分时,命令不会被接受/识别。这是一个bug还是为什么如果一切正常,命令会成为输出的一部分? - Wagner

0

只需在代码中添加!即可不打印输出: $!myMap.put('key', 'second value')


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接