当VelocityContext中找不到值时,Velocity可以为变量设置默认值吗?

时间:2012-12-14 04:47:40

标签: velocity

如果没有在VelocityContext中找到任何值,Velocity只打印标签名称,即我的模板文件中的$ name,但VelocityContext中没有“name”的值,所以只打印了“$ name”。我希望Velocity在没有变量值的情况下打印默认值,我只是尝试扩展AbstractCotnext并覆盖internalGet()方法,但是internalGet()的返回值将被强制转换为Node对象,我不知道如何在我的internalGet()方法中创建一个新的Node对象,而且我认为这种方式非常复杂。

是否有一种设置默认值的简单方法(默认值只是一个字符串)?

感谢。

6 个答案:

答案 0 :(得分:18)

据我所知,对于所有变量都不容易,我只是设法对某些变量进行了具体操作,具体如下:

模板:

#if ( !$somevar )
#set ( $somevar = "mycontent" )
#end

Var is: $somevar

结果:

Var is: mycontent

答案 1 :(得分:8)

在模板中创建一个velocimacro:

#macro(defaultValue $parm)  
#if (!$!parm || $!parm == "")  
i-like-will
#else  
$parm  
#end  
#end  

并在同一模板中将其称为:

#defaultValue($name)  

检查Apache Velocity - Velocity User Guide以获取有关velocimacros(以及一般速度)的更多信息。

答案 2 :(得分:2)

谷歌围绕Velocity ReferenceInsertionEventHandler寻求广泛的做法。

考虑DisplayTool的各种情况的alt()方法(VelocityTools项目的一部分)

答案 3 :(得分:2)

派对迟到了,但你也可以在定义变量时进行检查。我不得不将其压缩到一行以删除输出中的多余空间,但这是我的一个项目的示例:

#set ( $qlDefault = "qlinks" )
#set ( $qlClass = "#if($sharedCtaImage.getChild('path').value != '/')$qlDefault#else$qlDefault full#end" )

定义了默认类,然后检查是否填写了另一个特定值,以确定我是保留默认类还是追加其他类。这也适用于交换课程。

答案 4 :(得分:0)

对于空的默认值,$!name会这样做。否则,

#{if}($name)${name}#{else}${default_value}#{end}

请参阅http://velocity.apache.org/engine/2.0/user-guide.html#quiet-reference-notation

答案 5 :(得分:-1)

你可以做一些事情,而不是黑客攻击速度内部。看看this question