当前位置: 首页 > 知识库问答 >
问题:

使用动态变量名称访问VelocityContext

湛宝
2023-03-14

我的问题很简单,但我认为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

配置为Map

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

 <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对象,在下一轮呈现时,config对象已经呈现为纯文本,其余变量就放在其中。

比这更奇怪的是,如果我在上下文中呈现没有配置对象的vm,然后添加它并呈现已经呈现的内容,它会得到正确的处理,但对我来说没有任何意义。

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

你知道这是速度错误还是我遗漏了什么吗?

谢谢。

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

共有2个答案

羊舌诚
2023-03-14

我可能误解了你的问题,但在我看来,你试图以错误的方式访问地图条目。要获取地图条目的值,应使用#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"等,否则将为未找到的键输出空字符串

南宫凯康
2023-03-14

好了,解决了。

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

  1. 地图。获取(密钥)

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

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

 类似资料:
  • 问题内容: 在PHP中,您可以执行以下令人惊奇/可怕的事情: 有没有办法用Java做类似的事情? 例如,如果我有一个名称,可以得到对变量的引用吗? 问题答案: 由于ECMA-/ JavaScript是所有关于和(其也somekind的对象的),每个变量被存储在这样的被称为 可变 (或在功能方面,的情况下, 激活对象 )。 因此,如果您创建这样的变量: 在 全局范围 (= NO函数上下文)中,您将这

  • 问题内容: 我想使用变量名创建备份SQL表。 类似于 但是我越来越 ‘@SQLTable’附近的语法不正确。 这只是用于维护的小脚本的一部分,因此我不必担心注射。 问题答案:

  • 问题内容: 我想使用运行时之前不知道的字段名称过滤器来调用查询…不确定如何构造变量名称…或者我很累。 如果funct()返回的名称等于 不知道该怎么做… 问题答案: 您可以创建字典,设置参数,然后通过解压缩字典作为关键字参数将其传递给函数:

  • 我正在尝试使用动态名称访问对象的属性。这可能吗?

  • 我想使用<code>dplyr::mutate()</code>在数据帧中创建多个新列。应动态生成列名及其内容。 来自iris的示例数据: 我创建了一个函数,可以从<code>Petal中修改我的新列。宽度变量: 现在我创建一个循环来构建我的列: 然而,由于mutate认为varname是一个文字变量名,因此循环只创建一个新变量(称为varname),而不是四个(称为petal.2-petal.5

  • 问题内容: 我正在尝试访问我的一个班级中的班级常量: 如果我有一个变量,该变量持有此常量的名称,如下所示: 我可以通过某种方式访问​​MY_CONST的值吗? 显然不起作用,因为它用于静态属性。变量变量也不起作用。 问题答案: 有两种方法可以执行此操作:使用常量函数或使用反射。 常数函数 常量函数与通过声明的常量以及类常量一起使用: 反思班 第二种更费力的方法是通过反思: