最近的项目采用Velocity 1.7作为模板引擎,几天用下来,感觉还是挺爽的。不过今天发现一个坑:macro里面如果有多行的话,输出的字符串前后都被加上了换行和空格。直接上代码:
#macro(getContextPath) #set($root = $context.webApplicationContext.servletContext.contextPath) #if($root.lastIndexOf('/') == 0) #set($root = $root + '/') #end $root #end
调用:
aa#{getContextPath}aa
输出:
aa /web/ aa
中间确实多了空格,我的目的是所有的URL前缀都加上这个context路径,比如:
<a href="#{getContextPath}menu/list">xxx</a>
最终我看到的结果会是这样:
<a href="# /web/ menu/list">xxx</a>
很明显这不符合我的要求。
网上搜了一把,终于在Velocity的WIKI搜到了解决方案,http://wiki.apache.org/velocity/VelocityWhitespaceTruncatedByLineComment
第一种方案,把macro里面的所有语句写成一行(不要换行),在行的末尾加上##
这种方案缺点很明显,程序完全不具备可读性。
第二种方案(会英文的,上面的链接打开,拉到底部,那段就是解决方案),直接上代码:
#macro(getContextPath) #set($root = $context.webApplicationContext.servletContext.contextPath) #if($root.lastIndexOf('/') == 0) #set($root = $root + '/') #end $root## #end
解释下:
行首不能缩进,否则还是有空格;(这是去除字符串前面的空格和换行)
输出数据的行(上面$root是输出数据的)末尾需要加上##(这是去除字符串尾部的空格)
PS:上面的代码是获取Servlet的context路径。
本文出自ITEYE BLOG,转载请注明出处:http://qurey.iteye.com/blog/1944104
相关推荐
NULL 博文链接:https://twb.iteye.com/blog/265761
在JavaScript中,将字符串"false"转换为布尔值false并不是一个简单的隐式转换,因为JavaScript会把字符串"false"视作一个真值。针对这个特定问题,我们需要一个明确的方法来确保字符串"false"能被正确转换成布尔的...
这里定义了一个名为`$name`的变量,其值为字符串"hello"。需要注意的是,在Velocity中,所有变量都必须以字母开头。 **1.2 变量的写法** 在Velocity中,推荐使用`${}`语法来引用变量,这种写法能够避免一些潜在的...
例如,`#set ($a = "Velocity")` 将字符串 "Velocity" 分配给变量 `$a`。VTL 的变量只能存储字符串,而引用变量时使用 `$` 符号,设置或调用指令时使用 `#` 符号。 在模板中,可以使用 `#foreach` 循环遍历数据集合...
4. **渲染模板**:使用上下文中的数据渲染模板,生成XML字符串。 5. **处理生成的XML**:根据需要,可以选择写入文件、发送到网络或者进行其他处理。 具体代码示例可能如下: ```java import org.apache.velocity....
3. **合并上下文和模板**: 将`VelocityContext`中的数据与加载的模板合并,生成最终的输出字符串。VTL变量在合并过程中被替换为它们在上下文中对应的值。 4. **输出结果**: 结果可以写入到文件、流或直接返回给调用...
Velocity提供了丰富的字符串处理功能,如拼接、截取等: - 拼接示例:`#set($directoryRoot="www") #set($templateName="index.vm") #set($template="$directoryRoot/$templateName")`,这里定义了一个名为`$...
- `#escape`:用于转义特殊字符,防止XSS攻击。 - **注释**:使用`##`进行单行注释,`#* 注释内容 *#`进行多行注释。 2. **Velocity上下文(Context)** - 上下文是Velocity模板与Java对象交互的桥梁。开发者可以...
这篇博客“JSP中截取在线编辑器的字符串的处理”就讨论了如何在JSP中对在线编辑器生成的内容进行字符串截取。 在线编辑器生成的HTML代码通常包含各种标签和样式,如果直接进行简单的字符串截取,可能会导致截取结果...
Velocity 模板引擎初体验 Velocity 是一种 Java 模板引擎技术,由 Apache 提出,是一种基于 Java 的模板引擎,允许任何人使用简单而强大的模板语言来引用定义在 Java 代码中的对象。Velocity 的主要功能是桥梁 ...
下面我们将详细探讨在Velocity中如何进行空值和空字符串的判断。 ### 1. 判断Velocity变量是否为null #### 方法一:`#ifnull()` 或 `#ifnotnull()` 这两个指令属于Velocity Tools的扩展,如果你的项目中引入了...
Velocity是一个基于java的模板引擎(template engine:模板引擎的作用就是取得数据并加以处理,最后显示出数据 )。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象 简明易学...
在Java编程中,字符串模板是一种常见的技术,它允许我们在字符串中使用特定的占位符(如`${name}`),然后根据需要替换这些占位符为实际的值。这在处理动态内容,如邮件模板、日志输出或用户消息时非常有用。正则...
5. **事件驱动的处理机制**:Velocity 提供了一套事件驱动的处理机制,允许用户自定义处理器对模板进行预处理或后处理,如自动转义特殊字符,防止XSS攻击。 **velocity-tools-2.0.jar** `velocity-tools-2.0.jar`...
4. 文本插值:Velocity允许在字符串中插入变量,如`你好,$name`。 5. 注释:Velocity的注释有两种形式,行内注释`#comment`和块注释`##begin comment...##end comment`。 6. 引用资源:Velocity可以使用`#...
4. **合并模板与数据**:使用`VelocityEngine`的`mergeTemplate`方法,将模板和上下文合并,生成一个字符串,这个字符串包含了所有动态数据填充后的HTML内容。 5. **创建 Itext 文档**:初始化一个`Document`对象,...
这些依赖库为Velocity提供了一些基础功能,如日志记录、字符串操作等。 在实际使用中,你需要将这三个JAR文件添加到项目的类路径(Classpath)中,这样Java虚拟机才能找到并加载它们。在Maven或Gradle构建系统中,...
Velocity提供了字符串连接(`+`),子字符串(`substring`),以及大小写转换等操作。例如: ```vel 你好,$name.substring(0, 1).toUpperCase() + $name.substring(1)! ``` ## 5. 数组和列表处理 Velocity可以...
文件的国际化字符串中使用OGNL,格式为${表达式},例如: validation.required=${getText(fileName)} is required 2. 使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number |...
- 在 Velocity 模板中,未定义的变量会被当作字符串处理。 - Velocity 不会将引用解析为对象的实例变量。例如,`$foo.Name` 被解释为调用 `getName()` 方法。 #### 2. 循环 Velocity 支持使用 `#foreach` 指令进行...