對于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><el-ignored></code>标簽為true,來決定不使用el。例如:
以上标簽用來設定符合<code><url-pattern></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><context-param></code>中設定的初始參數。
算數運算符
<code>+ - * (/或div) (%或mod) ?:</code>
邏輯運算符
<code>and or not</code>
關系運算符
小于:<code>< 或 lt</code>
小于或等于:<code><= 或le</code>
大于:<code>> 或 gt</code>
大于或等于:<code>>=或 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><name></code>标簽的設定,而實際上eval名稱背後執行的類與真正的靜态方法,分别是由<code><function-class></code>和<code><functio-signature></code>設定的。
可以将這個tld檔案直接放在web-inf檔案夾下,容器會自動找到tld檔案并将其加載。現在可以編寫一個jsp來使用這個自定義的el函數,例如:
express.jsp:
taglib訓示元素告訴容器在轉譯jsp時,會用到對應uri屬性的自定義函數,prefix則用來設定前置名稱。當jsp中有來自多個不同設計者的el自定義函數時,就可以避免名稱沖突問題。