2017-08-31 69 views
1

我沒有找到函數來測試ISML模板代碼中是否存在值。有'isDefined'但不是'isNull'。Intershop:在.isml模板中檢查不爲null

isDefined對空值返回true:

 <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); 

這只是設置活泉變量爲空字符串。如果將以下scriptlet添加到isml中,您將看到它確實不是null。

免責聲明:不要在生產代碼中使用小腳本,這僅僅是爲了展示點

<% 
    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)) 

所以,真正的問題是,活泉沒有字面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。被定義然後開始像你期望的那樣工作。直到有人將我的變量初始化爲null以外的值。

但是我不會主張你使用這種方法。我認爲最好的建議不是使用null來表示缺失值或無效狀態。 這thread進入這個主題的一些細節。

+0

我更新了OP。 'isDefined'只測試它是否存在(已被聲明)。 它不測試值或真實性。 – nullsteph