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進入這個主題的一些細節。
更新答案,希望能夠爲您解決問題。 –