为什么不能在引用前使用反斜杠
Why doesnt work a backslash in front of a reference
我写了一个简单的junit测试。我想测试是否可以在引用前面写一个 java 转义反斜杠。这个测试失败了,我不知道为什么。
错误消息:org.junit.ComparisonFailure:应为:<[\London]> 但为:<[$branch]>
public class VelocityBackslashTest {
@Test
public void testVelocityBackslash() {
String inString = "\$branch";
Velocity.init();
VelocityContext context = new VelocityContext();
context.put("branch", "London");
StringWriter writer = new StringWriter();
Velocity.evaluate(context, writer, "test_1", inString);
assertEquals("\London", writer.toString());
}
}
如果我做同样的测试但从文件中读取模板。结果是阳性。
public class VelocityBackslashFileTest {
@Test
public void testVelocityBackslash() {
Properties p = new Properties();
p.setProperty("resource.loader", "classpath");
p.setProperty("classpath.resource.loader.class",
ClasspathResourceLoader.class.getName());
Velocity.init(p);
Template template =
Velocity.getTemplate("velocity/test_template.vm");
VelocityContext context = new VelocityContext();
context.put("branch", "London");
StringWriter writer = new StringWriter();
template.merge(context, writer);
assertEquals("\London", writer.toString());
}
}
test_template.vm:
\\$分支
这是因为 java.lang.String
使用 \
作为转义字符。
写的时候
String inString = "\$branch";
Java 将字符串文字 \
解释为转义的反斜杠,因此实际传递给 Velocity 的是单个 \
后跟 $branch
。
Velocity 还使用 \
作为转义字符,因此它将其输入 ($branch
) 解释为转义 $
符号的指令。换句话说,不要将它用作 Velocity 标记,只需打印文字 $
。一旦发生这种情况,那么当然不会尝试将 branch
解析为参考,因此它会作为文字输出。
要在已解析的 Velocity 引用前打印 \
,Java 字符串需要将 2 \
个字符传递给 Velocity,这将像这样完成:
String inString = "\\$branch";
我写了一个简单的junit测试。我想测试是否可以在引用前面写一个 java 转义反斜杠。这个测试失败了,我不知道为什么。
错误消息:org.junit.ComparisonFailure:应为:<[\London]> 但为:<[$branch]>
public class VelocityBackslashTest {
@Test
public void testVelocityBackslash() {
String inString = "\$branch";
Velocity.init();
VelocityContext context = new VelocityContext();
context.put("branch", "London");
StringWriter writer = new StringWriter();
Velocity.evaluate(context, writer, "test_1", inString);
assertEquals("\London", writer.toString());
}
}
如果我做同样的测试但从文件中读取模板。结果是阳性。
public class VelocityBackslashFileTest {
@Test
public void testVelocityBackslash() {
Properties p = new Properties();
p.setProperty("resource.loader", "classpath");
p.setProperty("classpath.resource.loader.class",
ClasspathResourceLoader.class.getName());
Velocity.init(p);
Template template =
Velocity.getTemplate("velocity/test_template.vm");
VelocityContext context = new VelocityContext();
context.put("branch", "London");
StringWriter writer = new StringWriter();
template.merge(context, writer);
assertEquals("\London", writer.toString());
}
}
test_template.vm:
\\$分支
这是因为 java.lang.String
使用 \
作为转义字符。
写的时候
String inString = "\$branch";
Java 将字符串文字 \
解释为转义的反斜杠,因此实际传递给 Velocity 的是单个 \
后跟 $branch
。
Velocity 还使用 \
作为转义字符,因此它将其输入 ($branch
) 解释为转义 $
符号的指令。换句话说,不要将它用作 Velocity 标记,只需打印文字 $
。一旦发生这种情况,那么当然不会尝试将 branch
解析为参考,因此它会作为文字输出。
要在已解析的 Velocity 引用前打印 \
,Java 字符串需要将 2 \
个字符传递给 Velocity,这将像这样完成:
String inString = "\\$branch";