从Apache Velocity引用forloop中的全局变量

时间:2016-01-18 20:53:10

标签: velocity number-formatting

我在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)?

2 个答案:

答案 0 :(得分:1)

当满足下列条件之一时,可能会发生这种情况:

1)传递给速度的模型没有变量“formatter”

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

3)方法print接受错误类型的参数。尝试传递Object ...

以下代码适用于我(请注意,我使用的是double数组而不再是字符串数组)

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 with Float。

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

当然我认为你应该使用Double并将数组创建为double的列表而不是字符串列表。

答案 1 :(得分:0)

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