天天看點

[Servlet&JSP] 表達式語言ELEL簡介使用EL通路屬性EL隐含對象EL運算符EL自定義函數

對于jsp中一些簡單的屬性、請求參數、标頭與cookie等資訊的取得,一些簡單的運算或判斷,可以使用表達式語言來處理,還可以将一些常用的功用函數編寫為el函數,這樣可以減少網頁上一部分的scriptlet。

例如,對于以下的scriptlet:

如果使用el,則可以隻用一行程式代碼來改寫,甚至加強這段scriptlet。例如:

el使用<code>${</code>和<code>}</code>來包括要進行處理的表達式。可使用點運算符(.)指定要通路的屬性,使用加号(+)運算符進行加法運算。param是el的隐含對象之一,表示使用者的請求參數,param.a表示取得使用者所發出的請求參數a的值,所輸入的請求參數自動轉換為基本類型并進行運算。

在參數為null時,el直接以空字元串表示,不會直接顯示null值,在進行運算是時,也不會是以發生錯誤而抛出異常。

el的點運算符可以連續通路對象,就如同在java程式代碼中一樣。例如,原來需要這樣寫:

使用el,則可以這樣編寫:

pagecontext也是el的隐含對象之一。通過點運算符之後街上xxx名稱,表示嗲用調用getxxx()方法。如果必須轉換類型,el也會自行處理。

可以使用page訓示元素的iselignored屬性(預設為true),來設定jsp網頁是否使用el。會這樣做的原因可能在于,網頁中已含有與el類似的<code>${}</code>文法功能。例如,使用了某個模闆(template)架構之類。

也可以在web.xml中設定<code>&lt;el-ignored&gt;</code>标簽為true,來決定不使用el。例如:

以上标簽用來設定符合<code>&lt;url-pattern&gt;</code>的jsp網頁是否使用el。如果jsp網頁使用page指令元素的iselignored來設定是否支援el,則以page指令元素的設定為主。

在el中,可以使用el隐含對象指定範圍來通路屬性。如果不指定屬性的存在範圍,則預設是以page、request、session、application的順序來尋找el中所指定的屬性。

如果el所通路的對象是一個數組對象或者list類型對象,則可以使用<code>[]</code>運算符來指定索引以通路數組中的元素。

使用點運算符與<code>[]</code>運算符的總結:

如果使用點運算符,則左邊可以是javabean或map對象。

如果使用<code>[]</code>運算符,則左邊可以是javabean、map、數組或list對象。

當左邊是map對象時,建議使用<code>[]</code>運算符,因為設定map時鍵(key)名稱可能有空白或點字元。

在el中提供了11個隐含對象,其中除了pagecontext銀行對象對應pagecontext之外,其他隐含對象都對應map類型。

對應于pagecontext類型,pagecontext本身就是一個javabean,隻要是<code>getxxx()</code>方法,就可以用<code>${pagecontext.xxx}</code>來取得。

與屬性範圍相關的隐含對象由pagescope、requestscope、sessionscope與applicationscope,分别可以取得使用jsp隐含對象pagecontext、request、session與application的setattribute()方法所設定的屬性對象。如果不使用el隐含對象指定作用範圍,則預設從pagescope的屬性開始查找。

el隐含對象pagescope、requestscope、sessionscope與applicationscope不等同于jsp隐含對象pagecontext、request、session與application。el隐含對象僅僅代表作用範圍。

與請求參數相關的el隐含對象由param與paramvalues。對應request的getparameter()和getparametervalues()方法。

如果要取得使用者請求的标頭資料,則可以使用header或headrvalues隐含對象。對應request的getheader()和getheaders()方法。

cookie隐含對象可以用來取得使用者的cookie設定值。如果在cookie中設定了username屬性,則可以使用<code>${cookie.username}</code>來取得值。

initparam可以用來取得web.xml中設定的servletcontext初始參數,也就是在<code>&lt;context-param&gt;</code>中設定的初始參數。

算數運算符

<code>+ - * (/或div) (%或mod) ?:</code>

邏輯運算符

<code>and or not</code>

關系運算符

小于:<code>&lt; 或 lt</code>

小于或等于:<code>&lt;= 或le</code>

大于:<code>&gt; 或 gt</code>

大于或等于:<code>&gt;=或 ge</code>

等于:<code>== 或 eq</code>

el運算符的優先級與java運算符對應

自定義函數的第一步是編寫類,它必須是一個公開類,而想要調用的方法也必須是公開的且為靜态方法。例如:

web容器必須知道如何将這個類的eval()方法當做el函數來使用,是以必須編寫一個标簽連結庫描述檔案(tag library descriptor, tld)檔案,這個檔案是個xml檔案,擴充名為<code>*.tld</code>。

infix.tld:

在<code>${infix:eval(...)}</code>中,eval名稱就對應于<code>&lt;name&gt;</code>标簽的設定,而實際上eval名稱背後執行的類與真正的靜态方法,分别是由<code>&lt;function-class&gt;</code>和<code>&lt;functio-signature&gt;</code>設定的。

可以将這個tld檔案直接放在web-inf檔案夾下,容器會自動找到tld檔案并将其加載。現在可以編寫一個jsp來使用這個自定義的el函數,例如:

express.jsp:

taglib訓示元素告訴容器在轉譯jsp時,會用到對應uri屬性的自定義函數,prefix則用來設定前置名稱。當jsp中有來自多個不同設計者的el自定義函數時,就可以避免名稱沖突問題。