使用动态变量名访问VelocityContext

时间:2014-05-16 14:38:27

标签: java velocity

我的问题很简单,但我认为Velocity并不支持这一点。 我必须使用vm文件中定义的变量名访问地图或对象。

#foreach( $i in [1..10] )
 #set( $img_link = "slide${i}_link" )
 #set( $img_src = "slide${i}.jpg" )
 #set( $img_alt = "slide${i}_alt" )
 <li>
  <a href="$config.$img_link">
   <img src="/assets/images/$img_src" alt="$config.$img_alt" />
  </a>
 </li>
#end

(配置是地图)

这里的问题是,当我发送此模板进行渲染时,我得到了这段代码:

 <li>
  <a href="<toString of map>.slide_1_link">
   <img src="/assets/images/slide_1.jpg" alt="<toString of map>.slide_1_alt" />
  </a>
 </li>

所以看起来在渲染模板的那一刻,$ img_src,$ img_link和$ img_alt没有被正确定义,而velocity试图在自身上呈现 config 对象,并且下一轮渲染,配置它已经呈现为纯文本,其余变量只是放在那里。

比这更奇怪的是,如果我在上下文中渲染vm 没有config 对象,然后我添加它并渲染已经渲染的内容,它就会被正确处理,但这对我没有任何意义。

我看到尝试访问pojo而不是地图的行为相同。

你知道这是一个Velocity错误还是我错过了什么?

感谢。

Java:1.5 速度:1.7 Velocity-Tools:2.0

2 个答案:

答案 0 :(得分:3)

好的,解决了。

访问地图有三种不同的方式:

  1. map.get(key)
  2. map.key
  3. 地图[键]
  4. 如果您尝试使用带编码的值,或者甚至是基于带有编码值的变量,这三种方法都可以完美地运行。 如果您尝试使用基于另一个变量的变量访问地图,则选项2无法正常工作。

    我留下此评论以防有人遇到同样的错误。

答案 1 :(得分:0)

我可能误解了你的问题,但在我看来,你试图以错误的方式访问地图条目。要获取地图条目的值,您应该使用#get方法:

<li>
 <a href="$config.get($img_link)">
   <img src="/assets/images/$img_src" alt="$config.get($img_alt)" />
 </a>
</li>

如果地图中有一个条目&#34; slide1_link&#34;,一个带有键&#34; slide1_alt&#34;,一个带有键&#34; slide2_link&#,这将有效34;等,否则将为未找到的密钥输出空字符串。