`
yinwufeng
  • 浏览: 287047 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

velocity 循环set null

    博客分类:
  • java
 
阅读更多

今天很不幸又看到中站一个故障,又是因为在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语法

    在 Velocity 模板语言中,变量可以通过 `#set` 指令进行定义。这些变量是弱类型的,意味着无需事先指定数据类型即可直接使用。例如: ```velocity #set($name = "hello") ``` 这里 `$name` 被赋值为字符串 `"hello"`...

    velocity新手教程

    在Velocity中,变量的定义以`#set`指令开始,例如`#set($name = "hello")`。变量是弱类型的,这意味着它们可以接受不同类型的数据。在上述示例中,我们创建了一个名为$name$的变量并赋值为字符串"hello"。值得注意的...

    velocity基本语法

    在Velocity模板语言中,变量的定义使用`#set`指令。Velocity支持弱类型的变量定义,这意味着在定义变量时无需指定其数据类型。例如: ```velocity #set($name = "hello") ``` 这里定义了一个名为`$name`的变量,其...

    velocity语法,涉及其常用规整

    Velocity中还提供了其他循环语句,如#for循环和#while循环。 条件语句 Velocity中提供了if、elseif和else语句,用于实现条件判断。例如: ``` #if($foo == "bar") This is true #elseif($foo == "baz") This is...

    Velocity10分钟了解

    ### Velocity 快速入门 #### 一、Velocity 概述 Velocity 是一款基于 Java 的模板引擎,它将模板设计和 Java 代码分离,使得前端页面的设计更加简洁且易于维护。Velocity 支持动态解析 Velocity 模板语言 (VTL),...

    velocity学习笔记

    Velocity支持`#foreach`循环,用于遍历列表、数组或集合中的元素。示例: ``` #foreach($element in $list) This is $element. #end ``` 其中`$list`可以是Vector、Hashtable或Array类型,`$element`将在每次循环...

    Velocity 语法

    Velocity允许条件语句和循环语句进行嵌套,以实现更复杂的逻辑控制。 **4.1 示例** ```velocity #set($score = 85) #if ($score &gt;= 60) Pass #else Fail #foreach ($student in $students) $student.name #end #...

    Velocity非常容易学会

    - **执行条件**: 当`$foo`为`null`或`Boolean`对象的`false`值时执行。 ##### 2.6 逻辑运算符 - **相等**: `==` - **逻辑与**: `&&` - **逻辑或**: `||` - **逻辑非**: `!` ##### 2.7 循环语句 - **基本语法**: ...

    velocity(eclipse插件)

    2. **指令使用**: 常用的Velocity指令包括`#set`(设置变量)、`#if`(条件判断)、`#foreach`(循环)和`#macro`(定义宏)等。 3. **变量引用**: 变量引用通常以`$`开头,例如`$variable`。对于null或不存在的...

    velocity教程

    10. **条件语句和循环**:Velocity提供了`#if`、`#else`、`#elseif`来进行条件判断,以及`#foreach`进行循环操作。 11. **宏定义与调用**:`#macro`用于定义宏,而`#invoke`则用来调用已定义的宏,这对于代码复用和...

    Velocity的脚本语言

    当一个变量未定义或者其值为`null`时,默认情况下,Velocity会在生成的文档中显示该变量的名称。为了避免这种情况,可以在变量名前加上感叹号`!`,这样即使变量未定义或为`null`,也不会在文档中显示任何内容。 ...

    velocity使用

    - **变量定义**:Velocity是弱类型语言,使用`#set`指令定义变量,如`#set($var = "value")`。变量名可以包含字母、数字、下划线和短横线,且以字母开头。字符串字面量可以用双引号或单引号包裹,双引号内的字符串...

    Velocity基本标记说明.doc

    1. **$velocityCount**:这是Velocity的一个内置变量,用于表示默认的循环索引,从1开始。如果你希望索引从0开始,你需要在`Velocity.properties`文件中进行设置。这个配置文件位于`velocity-1.4.jar`包内的`org/...

    使用velocity

    VTL支持变量声明、条件判断、循环等基本编程结构。 - **变量声明**:使用`#set($变量名="值")`。 - **变量引用**:使用`${变量名}`来引用已声明的变量。 - **数组声明和访问**:数组可以通过`#set($数组名=["元素1...

    velocity模板引擎

    - **变量拼接**:除了直接定义变量外,Velocity还支持变量之间的拼接操作,例如`#set($airwayBillNo = $awbpre + '-' + $awbno)`,这里`$airwayBillNo`将被赋值为`112-89089011`。 #### 二、循环结构 - **遍历数组*...

    Velocity--java的模板引擎

    Velocity模板语言(VTL)提供了一系列的指令,如#$、##、#set、#if、#else、#foreach等,用于控制模板的逻辑和数据绑定。例如: - `#$variable`:输出变量的值。 - `#set($var = "value")`:设置变量。 - `#if($...

    Velocity配置文件详解

    - **directive.set.null.allowed**:是否允许设置空值,默认为`false`。这对于确保数据完整性非常关键。 ##### 2.4 include配置 - **directive.include.output.errormsg.start**:错误信息提示开始字符串,默认为`...

    Velocity详解(初学者建议看)

    5. **条件语句**:使用`#if($foo)`...`#end`结构来实现条件判断,其中`$foo`为null或布尔型的false时执行`#else`部分。 6. **逻辑运算符**:包括等于`==`、与`&&`、或`||`和非`!`。 7. **循环语句**:`#foreach($...

    velocity 教程

    在Velocity中,变量通过`#set`指令定义,例如`#set($name = "hello")`。变量是弱类型的,这意味着它们可以接受不同类型的数据,包括字符串、数字或对象。`$directoryRoot = "www"`和`$templateName = "index.vm"`...

Global site tag (gtag.js) - Google Analytics