我没有找到测试ISML模板代码中是否存在值的函数。那里的定义是'但不是' isNull'。
<isset name="woot" value="" scope="request">
<isif condition="#isDefined(woot)#">
<h1>woot</h1>
</isif>
目前我正在使用:
<isif condition="#woot EQ null#">
或
<isif condition="#woot EQ ''#">
我不知道这是否适用于布尔值。
答案 0 :(得分:3)
isDefined是检查空值的方法。在AbstractTemplate中,您有调用的方法isDefined(Object anObject)。检查isml模板的已编译的jsp和java版本。
在AbstractTemplate
中public Boolean isDefined(Object anObject){
...
return anObject != null ? Boolean.TRUE : Boolean.FALSE;
}
您的示例中的代码有点误导,它实际上并没有测试空引用。忍受我。
第一句话:
<isset name="woot" value="" scope="request">
编译为:
Object temp_obj = ("");
getPipelineDictionary().put("woot", temp_obj);
这只是将woot变量设置为空字符串。如果您将以下scriptlet添加到isml中,您将看到它确实不是null。
免责声明:不要在生产代码中使用scriptlet,这只是为了证明一点
<%
Object woot = getPipelineDictionary().get("woot");
out.print(woot == null); //print false
%>
第二行:
<isif condition="#isDefined(woot)#">
评估变量是否存在并且确实存在。它有一个空字符串作为值,而不是像你想象的那样为空。
那么接下来会发生什么?
<isif condition="#woot EQ null#">
查看编译版本:
context.getFormattedValue(getObject("woot"),null).equals(context.getFormattedValue(getObject("null"),null))
context.getFormattedValue(getObject("null"),null)
是重要的一点。它试图检索名为null的变量,它不存在所以返回null。然后,getFormattedValue方法返回null参数的空字符串(请参阅TemplateExecutionConfig :: getFormattedValue)。然后整个陈述就变成了真实。不是因为woot是null,而是因为你将它与不存在的变量进行比较,所以你无意中评估了两个空字符串。此行为与EQ运算符一致,因为它用于compare strings。
如果您也使用此声明,您将获得相同的结果。
<isif condition="#woot EQ iDontExistButImAlsoNotNull#"> //true
第三个语句将woot变量与空字符串值进行比较,返回true。
<isif condition="#woot EQ ''#">
编译版本:
context.getFormattedValue(getObject("woot"),null).equals(context.getFormattedValue("",null))
所以真正的问题是woot没有文字值null。请参阅以下代码:
<isset name="foo" value="#IDontExitPrettySureAboutThat#" scope="request">
<%
Object foo = getPipelineDictionary().get("foo");
out.print("foo is null? ");
out.print(foo == null);
//prints : foo is null? true
%>
<isif condition="#isDefined(foo)#">
<h1>foo1</h1> //is never printed
</isif>
我滥用IDontExitPrettySureAboutThat
不存在的事实来为foo设置空值。 isDefined然后开始像你期望的那样工作。直到有人将我的变量初始化为null以外的其他东西。