今天很不幸又看到中站一个故障,又是因为在velocity模板中,foreach循环里set临时变量碰到null的问题
症状如下:
#foreach($x in $list) ## 1
#set ($temp = $x) ## 2 设置临时变量的值
$temp ## 3 输出临时变量的值
#end ## 4
在行2的地方,如果设置的值$x 为null,
这时候$temp的值不会被重置,而是保留为循环中上一次赋的值!!
这个问题,中文站出现过好几次,导致不同的故障,我搜索了一下我们的confluence,发现国站也出现过
原因很简单,因为现在的velocity版本里,为了兼容老的版本,默认是不允许在循环中设置null值给临时变量
解决办法很简单,在velocity.properties里加入directive.set.null.allowed = true,具体到我们的环境里,就是
在webx.xml中的VelocityService里加入该属性,例如:
<service name="VelocityService" class="com.alibaba.service.velocity.DefaultVelocityService" earlyInit="true">
<property name="file.resource.loader.path" value="/templates/esite"/>
<property name="file.resource.loader.cache" value="true"/>
<property name="directive.if.tostring.nullcheck" value="false"/>
<property name="directive.set.null.allowed" value="true"/>
.......
</service>
这下,世界清净了。
分享到:
相关推荐
在 Velocity 模板语言中,变量可以通过 `#set` 指令进行定义。这些变量是弱类型的,意味着无需事先指定数据类型即可直接使用。例如: ```velocity #set($name = "hello") ``` 这里 `$name` 被赋值为字符串 `"hello"`...
在Velocity中,变量的定义以`#set`指令开始,例如`#set($name = "hello")`。变量是弱类型的,这意味着它们可以接受不同类型的数据。在上述示例中,我们创建了一个名为$name$的变量并赋值为字符串"hello"。值得注意的...
在Velocity模板语言中,变量的定义使用`#set`指令。Velocity支持弱类型的变量定义,这意味着在定义变量时无需指定其数据类型。例如: ```velocity #set($name = "hello") ``` 这里定义了一个名为`$name`的变量,其...
Velocity中还提供了其他循环语句,如#for循环和#while循环。 条件语句 Velocity中提供了if、elseif和else语句,用于实现条件判断。例如: ``` #if($foo == "bar") This is true #elseif($foo == "baz") This is...
### Velocity 快速入门 #### 一、Velocity 概述 Velocity 是一款基于 Java 的模板引擎,它将模板设计和 Java 代码分离,使得前端页面的设计更加简洁且易于维护。Velocity 支持动态解析 Velocity 模板语言 (VTL),...
Velocity支持`#foreach`循环,用于遍历列表、数组或集合中的元素。示例: ``` #foreach($element in $list) This is $element. #end ``` 其中`$list`可以是Vector、Hashtable或Array类型,`$element`将在每次循环...
Velocity允许条件语句和循环语句进行嵌套,以实现更复杂的逻辑控制。 **4.1 示例** ```velocity #set($score = 85) #if ($score >= 60) Pass #else Fail #foreach ($student in $students) $student.name #end #...
- **执行条件**: 当`$foo`为`null`或`Boolean`对象的`false`值时执行。 ##### 2.6 逻辑运算符 - **相等**: `==` - **逻辑与**: `&&` - **逻辑或**: `||` - **逻辑非**: `!` ##### 2.7 循环语句 - **基本语法**: ...
2. **指令使用**: 常用的Velocity指令包括`#set`(设置变量)、`#if`(条件判断)、`#foreach`(循环)和`#macro`(定义宏)等。 3. **变量引用**: 变量引用通常以`$`开头,例如`$variable`。对于null或不存在的...
10. **条件语句和循环**:Velocity提供了`#if`、`#else`、`#elseif`来进行条件判断,以及`#foreach`进行循环操作。 11. **宏定义与调用**:`#macro`用于定义宏,而`#invoke`则用来调用已定义的宏,这对于代码复用和...
当一个变量未定义或者其值为`null`时,默认情况下,Velocity会在生成的文档中显示该变量的名称。为了避免这种情况,可以在变量名前加上感叹号`!`,这样即使变量未定义或为`null`,也不会在文档中显示任何内容。 ...
- **变量定义**:Velocity是弱类型语言,使用`#set`指令定义变量,如`#set($var = "value")`。变量名可以包含字母、数字、下划线和短横线,且以字母开头。字符串字面量可以用双引号或单引号包裹,双引号内的字符串...
1. **$velocityCount**:这是Velocity的一个内置变量,用于表示默认的循环索引,从1开始。如果你希望索引从0开始,你需要在`Velocity.properties`文件中进行设置。这个配置文件位于`velocity-1.4.jar`包内的`org/...
VTL支持变量声明、条件判断、循环等基本编程结构。 - **变量声明**:使用`#set($变量名="值")`。 - **变量引用**:使用`${变量名}`来引用已声明的变量。 - **数组声明和访问**:数组可以通过`#set($数组名=["元素1...
- **变量拼接**:除了直接定义变量外,Velocity还支持变量之间的拼接操作,例如`#set($airwayBillNo = $awbpre + '-' + $awbno)`,这里`$airwayBillNo`将被赋值为`112-89089011`。 #### 二、循环结构 - **遍历数组*...
Velocity模板语言(VTL)提供了一系列的指令,如#$、##、#set、#if、#else、#foreach等,用于控制模板的逻辑和数据绑定。例如: - `#$variable`:输出变量的值。 - `#set($var = "value")`:设置变量。 - `#if($...
- **directive.set.null.allowed**:是否允许设置空值,默认为`false`。这对于确保数据完整性非常关键。 ##### 2.4 include配置 - **directive.include.output.errormsg.start**:错误信息提示开始字符串,默认为`...
5. **条件语句**:使用`#if($foo)`...`#end`结构来实现条件判断,其中`$foo`为null或布尔型的false时执行`#else`部分。 6. **逻辑运算符**:包括等于`==`、与`&&`、或`||`和非`!`。 7. **循环语句**:`#foreach($...
在Velocity中,变量通过`#set`指令定义,例如`#set($name = "hello")`。变量是弱类型的,这意味着它们可以接受不同类型的数据,包括字符串、数字或对象。`$directoryRoot = "www"`和`$templateName = "index.vm"`...