【问题标题】:Velocity Templates - New Line速度模板 - 新线
【发布时间】:2010-12-28 20:52:27
【问题描述】:

我一直在使用 Apache 的 Velocity 引擎和自定义模板。
问题是,我无法生成带有相应换行符的字符串。 我尝试了几乎所有我发现的东西,例如使用 $esc.n 和 $esc.newline (我已经在我的项目中使用了转义工具)但我目前使用的版本似乎不支持它(1.4 ),检查放置 '\n'、'\\n' 甚至 '\\\n' 是否可行,但同样的事情。

有没有人可以解决这个问题?

【问题讨论】:

  • 我一直只是在模板本身中添加换行符,并且输出在同一个地方有换行符。能举个例子吗?
  • Velocity 开发人员一直在努力保持向后兼容性。请考虑从 1.4 升级,该版本是古老的,从那时起已经修复和改进了数百个(如果不是数千个)的东西。 :)
  • 是的,我建议升级到最新版本,但这不取决于我:(。彼得,我认为这种行为是最新 Velocity 版本的一部分。:(

标签: java templates velocity


【解决方案1】:

我们遇到了换行问题,最终在 VelocityContext 上放置了一个属性:

VelocityContext ctx = new VelocityContext();
ctx.put("newline", "\n");

然后,在需要使用换行符的地方,我们将引用上下文变量:

$newline

我们在需要用
替换字符串中的换行符的情况下使用它。

【讨论】:

  • 我将尝试使用上下文解决方案。将提供结果的更新。非常感谢!
  • 成功了!非常感谢你的帮助 :)。对于任何想知道的人,我只是将该属性添加到上下文中,并按照您的指示在模板中引用它。
  • 嗨,我正在使用它来获取电子邮件的正文: String body = VelocityEngineUtils.mergeTemplateIntoString( velocityEngine, filename, params);在 params 我有 param.put("newline", "\n") 和速度模板(.vm 文件)我像这样使用它 $newline 但似乎不起作用,有什么想法吗?
  • @TouseefZafar 不幸的是,我使用 Velocity 已经好几年了,所以我现在可能帮不上什么忙。对我来说突出的一件事是(大概)你的“参数”对象是一个地图。这是否等同于速度上下文?否则,此解决方案可能不起作用。
【解决方案2】:

我需要一个新行来生成 javascript。好吧,我当然需要它,但它使开发时更容易阅读生成的代码。在这种情况下,我只是设置了一个变量,以便 Velocity 更易于阅读。这就是你所需要的:

速度代码:

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

结果:

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

【讨论】:

    【解决方案3】:

    您是否使用 Velocity 来生成 HTML 内容?在这种情况下,请记住您需要使用 &lt;br&gt; 而不是换行符。

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

    【讨论】:

    • 我正在使用 Velocity 生成 XML 内容。此外,关于使用 enter 添加新行的功能是最新版本的行为。
    【解决方案4】:

    如果您使用的是 Velocity 1.5 或更高版本,您也可以将新行放在那里:

    #set( $foo = "this has a 
    line break" ) 
    

    【讨论】:

      【解决方案5】:

      在 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 ?
      

      【讨论】:

        【解决方案6】:

        简单地使用 Velocity EscapeTool 可能是最简单的。

        查看此链接:https://velocity.apache.org/tools/releases/2.0/javadoc/org/apache/velocity/tools/generic/EscapeTool.html#getNewline%28%29

        示例用法: 此处换行:$esc.newline 这是换行。

        【讨论】:

        • 我面临着类似的问题.. 我有一个表单,我可以在其中输入评论文本并发送电子邮件.. 但是,如果用户按下了没有出现在电子邮件中的 enter(newline)..注释文本出现在一行中
        猜你喜欢
        • 2013-06-10
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多