在 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 并将数组创建为双精度列表而不是字符串列表。
我在 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 并将数组创建为双精度列表而不是字符串列表。