首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Intershop:在.isml模板中检查null

Intershop:在.isml模板中检查null
EN

Stack Overflow用户
提问于 2017-08-31 23:53:46
回答 1查看 1.2K关注 0票数 1

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

isDefined对空值返回true:

代码语言:javascript
复制
      <isset name="woot" value="" scope="request">

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

现在我用的是:

代码语言:javascript
复制
 <isif condition="#woot EQ null#">

代码语言:javascript
复制
 <isif condition="#woot EQ ''#">

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-01 08:08:31

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

在AbstractTemplate中

代码语言:javascript
复制
public Boolean isDefined(Object anObject){
    ...
    return anObject != null ? Boolean.TRUE : Boolean.FALSE;
}

您的示例中的代码有点误导,它实际上并不测试空引用。忍受我吧。

第一次发言:

代码语言:javascript
复制
<isset name="woot" value="" scope="request">

汇编成:

代码语言:javascript
复制
Object temp_obj = (""); 
getPipelineDictionary().put("woot", temp_obj);

这只是将woot变量设置为空字符串。如果将以下脚本添加到isml中,您将看到它实际上不是null。

免责声明:不要在生产代码中使用脚本,这只是为了演示点

代码语言:javascript
复制
<%
    Object woot = getPipelineDictionary().get("woot");
    out.print(woot == null); //print false
%>

第二行:

代码语言:javascript
复制
<isif condition="#isDefined(woot)#">

计算变量是否存在并且确实存在。它的值为空字符串,而不是您可能认为的空字符串。

那么这里会发生什么呢?

代码语言:javascript
复制
<isif condition="#woot EQ null#">

查看编译后的版本:

代码语言:javascript
复制
context.getFormattedValue(getObject("woot"),null).equals(context.getFormattedValue(getObject("null"),null))

context.getFormattedValue(getObject("null"),null)是这里的重要部分。它试图撤回名为null的变量,但它不存在,因此返回null。然后,getFormattedValue方法为空参数返回一个空字符串(请参阅TemplateExecutionConfig::getFormattedValue)。然后,整个陈述就会变成真。不是因为woot是null,而是因为您将其与一个不存在的变量进行比较,因此您无意中计算了两个空字符串。这种行为与EQ运算符是一致的,因为它用于比较字符串

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

代码语言:javascript
复制
<isif condition="#woot EQ iDontExistButImAlsoNotNull#"> //true

第三条语句将woot变量与返回true的空字符串值进行比较。

代码语言:javascript
复制
<isif condition="#woot EQ ''#">

汇编版本:

代码语言:javascript
复制
context.getFormattedValue(getObject("woot"),null).equals(context.getFormattedValue("",null))

所以真正的问题是woot没有文字值null。请参阅下列代码:

代码语言:javascript
复制
<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来表示缺失的值或无效的状态。这个线程将讨论这个主题的一些细节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45991602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档