1

我没有找到一个函数来测试 ISML 模板代码中是否存在值。有“isDefined”,但没有“isNull”。

isDefined 在 null 值上返回 true:

      <isset name="woot" value="" scope="request">

       <isif condition="#isDefined(woot)#">
           <h1>woot</h1>
       </isif>

现在我正在使用:

 <isif condition="#woot EQ null#">

或者

 <isif condition="#woot EQ ''#">

我不知道这是否适用于布尔值。

4

1 回答 1

3

isDefined 是您检查空值的方式。在 AbstractTemplate 中,您有被调用的方法 isDefined(Object anObject)。签出您的 isml 模板的已编译 jsp 和 java 版本。

在抽象模板中

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 为空,而是因为您将其与不存在的变量进行比较,因此您无意中评估了两个空字符串。此行为与 EQ 运算符一致,因为它用于比较字符串

如果你也使用这个语句,你会得到相同的结果。

<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 以外的值。

但是,我不提倡您使用这种方法。我认为最好的建议是不要使用 null 来表示缺失值或无效状态。这个线程进入了关于这个主题的一些细节。

于 2017-09-01T08:08:31.527 回答