7

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

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

谢谢。

4

6 回答 6

20

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

模板:

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

Var is: $somevar

结果:

Var is: mycontent
于 2012-12-14T11:50:35.410 回答
9

在您的模板中创建一个 velocimacro:

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

并在同一个模板中这样调用它:

#defaultValue($name)  

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

于 2012-12-16T05:05:54.450 回答
3

聚会有点晚了,但您也可以在定义变量时进行检查。我不得不将其压缩为一行以删除输出中的多余空间,但这是我的一个项目中的一个示例:

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

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

于 2015-06-29T17:44:21.403 回答
2

谷歌周围的 Velocity ReferenceInsertionEventHandler 以广泛地做到这一点。

针对个别情况考虑 DisplayTool 的 alt() 方法(VelocityTools 项目的一部分)

于 2012-12-14T16:44:19.537 回答
1

对于空的默认值,$!name可以。否则,

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

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

于 2018-02-07T06:34:08.367 回答
-1

除了破解 Velocity 内部结构之外,您还可以做几件事。看看这个问题

于 2012-12-14T15:03:11.383 回答