我写了一个简单的junit测试。我想测试我是否可以在引用前面编写一个java转义反斜杠。这个测试失败了,我不知道为什么。
错误消息:org.junit.ComparisonFailure:expected:< [\ 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:
\\ $分支
答案 0 :(得分:1)
这是因为public function editTicket($ticket)
{
$q = $this->db->where('ticketId', $ticket['ticketId']);
$q = $this->db->update('tickets', $ticket);
$results = $this->db->affected_rows();
return $results;
}
使用java.lang.String
作为转义字符。
写作时
\
Java将字符串文字String inString = "\\$branch";
解释为转义反斜杠,因此传递给Velocity的实际内容是单\\
后跟\
。
Velocity还使用$branch
作为转义字符,因此它将其输入(\
)解释为转义\$branch
符号的指令。换句话说,不要使用它作为Velocity标记只需打印文字$
。一旦发生这种情况,当然不会尝试将$
解析为参考,因此它将作为文字输出。
要在已解析的Velocity引用前打印branch
,Java String需要将2 \\
个字符传递给Velocity,这样就可以这样做:
\