为什么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。而且我既没有看到异常,也没有看到它按原样打印出来,这让我感到困惑。
答案 0 :(得分:0)
Velocity Variables或VTL 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]},它实际上会抛出一个错误。