在 Apache Velocity 的 for 循环中引用全局变量

Referencing a global variable in forloop from Apache Velocity

我在 Apache Velocity 的 forloop 中使用格式化程序时遇到问题。

#set( $array = ["10000", "3000", "13.456", "1111.13"] )

<ul>
#foreach( $a in $array) 
  <li>$formatter.print($a)</li>
#end
</ul>

这将被评估并将原始表达式作为字符串打印 4 次

$formatter.print($a)
$formatter.print($a)
$formatter.print($a)
$formatter.print($a)

而不是

10,000.00
 3,000.00
    13.456
 1,111.13

然而,它似乎在 forloop

范围之外的格式化程序上工作正常
<p>$formatter.print(123456)</p>

这会照常工作

谁能帮我弄清楚如何在 for 循环中引用 属性(在本例中为 $formatter)?

尝试使用 ${myref.doIt($var)} 语法来引用上下文变量。这确保 Velocity 不会错误地解析字符串中的上下文名称。

当以下条件之一为真时,可能会发生这种情况:

1)传递给velocity的模型没有变量"formatter"

2) print 方法返回 null 或者它不存在

3) 打印方法接受了错误类型的参数。尝试传递对象...

下面的代码对我有用(注意我使用的是双精度数组而不是字符串数组):

package test;

import java.io.StringWriter;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
public class VelocityHelloWorld
{
    public static void main( String[] args )
        throws Exception
    {
        VelocityEngine ve = new VelocityEngine();
        ve.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
        ve.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
        ve.init();
        VelocityContext context = new VelocityContext();
        context.put("formatter", new Formatter());
        Template t = ve.getTemplate( "helloworld.vm" );
        StringWriter writer = new StringWriter();
        t.merge( context, writer );
        System.out.println(writer.toString());
    }
}

速度:

#set( $array = [10.00 , 20.00, 13.456, 1111.13] )

<ul>
#foreach( $a in $array) 
  <li>$formatter.print($a)</li>
#end
</ul>

格式化程序:

package test;

public class Formatter {
    public String print (Object d) {
        String s =  d.getClass().getName() + ": " + d.toString();

        return s;
    }
}

如果我替换为

,模板会显示与您相同的行为
print (Double d) 

双倍浮动。

长话短说...我认为您可能需要检查传递给您的方法的参数。

当然,我认为您应该使用 Double 并将数组创建为双精度列表而不是字符串列表。