双花括号的速度

时间:2017-11-01 09:37:00

标签: velocity apache-velocity

为什么velocity为字符串

提供以下输出
VelocityContext vc = new VelocityContext();
vc.put("foo", "bar");
String inString = "THis is ${{foo}} and this is ${foo}.Hello and ${foo}-Hello";

StringWriter sw = new StringWriter();
ve.evaluate(vc, sw, "Tag", inString);

输出:

THis is ${{} and this is bar.Hello and bar-Hello 

我原以为会打印${{foo}}{bar},为什么${{}?将双重卷曲作为逃脱角色吗?

我在严格参考模式下使用此设置为true。而且我既没有看到异常,也没有看到它按原样打印出来,这让我感到困惑。

2 个答案:

答案 0 :(得分:0)

Velocity VariablesVTL Identifier

  

必须以字母字符(a .. z或A .. Z)开头。其余字符仅限于以下类型的字符:

     
      
  • 字母(a .. z,A .. Z)
  •   
  • 数字(0 .. 9)
  •   
  • 连字符(" - ")
  •   
  • 下划线(" _")
  •   

您使用Formal Reference Notation作为$ {varName}

${{foo}} - 所以速度试图获得变量{foo}这是无效的VTL标识符,因此它不会尝试加载变量。

然后可能会尝试将其作为JSON地图引用{" a":" b"}并再次失败,可能只接受{,所以你留下用:

$ {{}

我在新的速度2.0中测试了你的模板,这个问题没有重现(严格或非严格模式) 输出:

THis is ${{foo}} and this is bar.Hello and bar-Hello 

所以你现在有理由升级到velocity 2.0

答案 1 :(得分:0)

嗯,你让我看看代码,我不确定我是否理解正确。问题似乎是在$ {...}中,xxx被视为ASTReference,然后它被标记为不同于独立字符串“{bar}”。具体来说,它被标记为3个标记{,bar和}。然后引擎试图找到所谓的引用根(在$ {x}中,根是x),不识别模式并进入后退引用类型RUNT,它表示第一个令牌,即“ {“很重要。这样“{bar}”变为“{”。

换句话说,表达式$ {{bar}}没有意义,Velocity没有在这里抛出错误。在其他无意义的组​​合中,例如$ {[bar]},它实际上会抛出一个错误。