【问题标题】:Java velocity vm file #set use boolean variableJava 速度 vm 文件 #set 使用布尔变量
【发布时间】:2015-10-01 18:40:22
【问题描述】:
当我在 Apache 官方网站上找到速度项目指南时,我们不能使用 #set 的布尔变量,但在我的项目中使用时也可以使用。
#set($isRight=true)
#if($isRight)
##execute
#end
#set($isRight=false)
#if($isRight)
##not execute
#end
我想知道velocity是否支持#set布尔变量,以及我使用的方式是否合法。
【问题讨论】:
标签:
java
apache
web
velocity
template-engine
【解决方案1】:
在velocity中,没有明确的数据类型,因此不支持布尔变量。但是由于velocity是在JAVA平台上构建的,如果您指定一个兼容的值,那么它可以在诸如“if”操作(代码中显示的操作)之类的操作中为您提供预期的结果。这是因为在 Java 中,if 表达式中需要一个布尔值,而您提供的东西可以很容易地转换为布尔值。
如果你给出类似 #set($isRight=true1) 的东西,上面写的代码将被 Java 引擎内部处理,就像你在 'if' 表达式中指定了一个不能转换为布尔值的字符串,因此将抛出类型转换异常(或 ClassCastException)。这将发生在除 'true' 或 'false' 之外的任何值上,这些值在此处实际上是字符串,但可以成功转换为布尔值,这在 'if' 表达式中是预期的。
因此它不是对布尔类型的支持,而是幕后的 Java 实现使事情顺利进行。
【解决方案2】:
尚未发布的 Velocity 2.0 确实支持此类测试。
同时,您可以求助#if("isRight"=="true")...
【解决方案3】:
经验表明您的示例有效,但您是对的,文档没有明确说明您可以使用 #set 指令为变量分配 Boolean 值 (其中有meticulously detailed cases,缺少关于Boolean的信息)。
因此,如果您想确保编写的代码与文档 100% 兼容,那么您可以使用其他值代替显式 Boolean,according to the documentation 将转换为 布尔值。他们是例如0 为false 和1 为true。
那么您的示例将如下所示:
#set ($isRight = 1)
#if ($isRight)
## execute
#end
#set ($isRight = 0)
#if ($isRight)
## not execute
#end