我在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)?
答案 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不会在字符串中错误地解析上下文名称。