【问题标题】:Accesing VelocityContext with dynamic variables names使用动态变量名访问 VelocityContext
【发布时间】:2026-02-19 08:35:01
【问题描述】:

我的问题很简单,但我认为 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 without config 对象,然后我添加它并渲染已经渲染的内容,它会被正确处理,但它不会对我来说没有任何意义。

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

您知道这是 Velocity 错误还是我遗漏了什么?

谢谢。

Java:1.5 速度:1.7 速度工具:2.0

【问题讨论】:

    标签: java velocity


    【解决方案1】:

    好的,解决了。

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

    1. map.get(key)
    2. map.key
    3. 地图[键]

    如果您尝试使用硬编码值,甚至是值基于硬编码值的变量,这三种方法都可以完美运行。 但是如果您尝试使用基于另一个变量的变量访问地图,则选项 2 将不起作用。

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

    【讨论】:

      【解决方案2】:

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

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

      如果地图中有一个带有键“slide1_link”的条目,一个带有键“slide1_alt”的条目,一个带有键“slide2_link”等的条目,这将起作用,否则将为未找到的输出一个空字符串键。

      【讨论】:

      • 您好,格里,谢谢您的回复,这不是问题所在。您可以使用三种不同的方式访问地图:(1) map.get(key) (2) map.key (3) map[key]。当我尝试使用在 vm 中动态生成的密钥进行访问时,就会出现问题。我认为某些东西被错误地渲染了,可能与优先级有关。请注意,键是先前使用#foreach 的迭代变量生成的变量