Velocity模板 - 换行

18

我一直在使用Apache Velocity引擎和自定义模板。
问题是,我无法生成带有相应换行的字符串。 我尝试过几乎所有我找到的方法,例如使用$esc.n和$esc.newline(我已经在项目中使用了转义工具),但似乎我当前使用的版本不支持它们(1.4)。我尝试过将'\n'、'\\n'甚至是'\\\\n'放入字符串中,但结果都一样。

是否有人有解决方案?


1
我一直都是在模板本身中加入换行符,这样输出的结果也会有相应的换行。你能给一个例子吗? - Peter Lawrey
Velocity的开发人员一直努力保持向后兼容性。请考虑升级到1.4,这个版本已经过时了,自那以后已经修复和改进了成百上千件事情。 :) - Nathan Bubna
是的,我建议升级到最新版本,但这不取决于我 :(. Peter,我认为这种行为是最新Velocity版本的一部分。:( - LdSe
7个回答

22
我们遇到了换行符的问题,最终在VelocityContext上设置了一个属性:
VelocityContext ctx = new VelocityContext();
ctx.put("newline", "\n");

然后,无论我们在哪里需要使用换行符,我们都会引用上下文变量:

$newline

我们在需要将字符串中的换行符替换为<br />时使用它。


我会尝试使用上下文解决方案。会在结果上提供更新。非常感谢! - LdSe
成功了!非常感谢您的帮助:)。对于任何想知道的人,我只是将该属性添加到上下文中,并像您指示的那样在模板中引用它。 - LdSe
嗨,我正在使用以下代码获取电子邮件正文: String body = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, filename, params); 在params中,我有param.put("newline", "\n"),并且在velocity模板(.vm文件)中,我像这样使用它 $newline 但似乎不起作用,有什么想法吗? - Toseef Zafar
很抱歉,@TouseefZafar。我已经好几年没有使用Velocity了,所以现在可能帮不上你太多忙。唯一让我印象深刻的是(大概)你的“params”对象是一个Map。它是否等同于Velocity上下文?如果不是,这个解决方案可能行不通。 - jt.

9

我需要一行新的代码来生成javascript。当然,我并不是真正的“需要”,但在开发过程中这样做可以使生成的代码更容易阅读。在这种情况下,我只需设置一个变量,以便Velocity更容易阅读。以下是您所需要的内容:

Velocity代码:

#set( $newline="
")
#set( $jsCode = "var bling='blang';{$newline}var bark='bite';{$newline}" )
<script>
$jsCode</script>

结果:

<script>
var bling='blang';
var bark='bite';
</script>

5

你是否在使用Velocity生成HTML内容?如果是的话,请记住需要使用<br>而不是换行符。

如果你真的想要一个换行符,你只需输入实际的换行符,即按回车键。在Velocity中没有类似于\n的转义序列。


我正在使用Velocity生成XML内容。此外,使用回车键添加新行的功能是最新版本的行为。 - LdSe

4
如果你正在使用Velocity 1.5或更高版本,你也可以直接在这里放置新的一行:
#set( $foo = "this has a 
line break" ) 

2

在Velocity 1.4中,字符串中的换行符不起作用,也不存在escapeTool.getNewline()。如果您无法向上下文添加任何内容,则可以使用Velocity-only hack生成任意字符:

#macro(chr $charCode $str)
  #set($str="0")
  #set($chars=$str.charAt(0).toChars($charCode))
  #set($str="")
  #foreach($char in $chars)
    #set($str="$str$char")
  #end
#end

#chr(10 $nl)

First Line${nl}Second Line

它使用Character.toChars()将ASCII码0x0A = 10转换为char[],然后将其组装成字符串。这样就可以生成任何字符,例如:
#chr(129299 $nerd) ## U+1F913 => 0x1F913 = 129299
$nerd
## outputs 

0

我在这里贡献我的意见,以下是我的想法:

#set( $E = "" )
#set ( $System = $E.class.forName('java.lang.System'))
#set( $NL = $System.lineSeparator() )

当使用$NL时,会产生一个换行符。

还要注意,如果您正在循环中,则完全不需要这种麻烦。例如:

#set( $s = "abc" )
#foreach( $e in $s.split("") )
$e
#end

将已经生成

a
b
c

0

我遇到了类似的问题。我有一个表单,我在其中输入评论文本并发送电子邮件。但是,如果用户按下回车键(换行符),那么在电子邮件中不会显示该符号。评论文本将以单行形式显示。 - simba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接