對於JSP中一些簡單的屬性、請求參數、標頭與Cookie等信息的取得,一些簡單的運算或判斷,可以使用表達式語言來處理,還可以將一些常用的功用函數編寫為EL函數,這樣可以減少網頁上一部分的Scriptlet。
例如,對於以下的Scriptlet:
<% String a = request.getParameter("a"); String b = request.getParameter("b"); out.println("a + b = " + (Integer.parseInt(a) + Integer.parseInt(b))); %>
如果使用EL,則可以只用一行程序代碼來改寫,甚至加強這段Scriptlet。例如:
${param.a} + ${param.b} = ${param.a + param.b}
EL使用${和}來包括要進行處理的表達式。可使用點運算符(.)指定要訪問的屬性,使用加號(+)運算符進行加法運算。param是EL的隱含對象之一,表示用戶的請求參數,param.a表示取得用戶所發出的請求參數a的值,所輸入的請求參數自動轉換為基本類型並進行運算。
在參數為null時,EL直接以空字符串表示,不會直接顯示null值,在進行運算是時,也不會因此發生錯誤而拋出異常。
EL的點運算符可以連續訪問對象,就如同在Java程序代碼中一樣。例如,原來需要這樣寫:
<%= ((HttpServletRequest)pageContext.getRequest()).getMethod() %> <%= ((HttpServletRequest)pageContext.getRequest()).getQueryString() %> <%= ((HttpServletRequest)pageContext.getRequest()).getRemoteAddr() %>
使用EL,則可以這樣編寫:
${pageContext.request.method} ${pageContext.request.queryString} ${pageContext.request.remoteAddr}
pageContext也是EL的隱含對象之一。通過點運算符之後街上xxx名稱,表示嗲用調用getXxx()方法。如果必須轉換類型,EL也會自行處理。
可以使用page指示元素的isELIgnored屬性(默認為true),來設置JSP網頁是否使用EL。會這樣做的原因可能在於,網頁中已含有與EL類似的${}語法功能。例如,使用了某個模板(Template)框架之類。
也可以在web.xml中設置
<web-app ...> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>true</el-ignored> </jsp-property-group> </jsp-config> </web-app>
以上標簽用來設置符合
在EL中,可以使用EL隱含對象指定范圍來訪問屬性。如果不指定屬性的存在范圍,則默認是以page、request、session、application的順序來尋找EL中所指定的屬性。
如果EL所訪問的對象是一個數組對象或者List類型對象,則可以使用[]運算符來指定索引以訪問數組中的元素。
使用點運算符與[]運算符的總結:
如果使用點運算符,則左邊可以是JavaBean或Map對象。 如果使用[]運算符,則左邊可以是JavaBean、Map、數組或List對象。當左邊是Map對象時,建議使用[]運算符,因為設置Map時鍵(key)名稱可能有空白或點字符。
在EL中提供了11個隱含對象,其中除了pageContext銀行對象對應pageContext之外,其他隱含對象都對應Map類型。
對應於PageContext類型,PageContext本身就是一個JavaBean,只要是getXxx()方法,就可以用${pageContext.Xxx}來取得。
與屬性范圍相關的隱含對象由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屬性,則可以使用${cookie.username}來取得值。
initParam可以用來取得web.xml中設置的ServletContext初始參數,也就是在
EL運算符的優先級與Java運算符對應
自定義函數的第一步是編寫類,它必須是一個公開類,而想要調用的方法也必須是公開的且為靜態方法。例如:
public class Infix { public static double eval(String infix) { double result = 0; //other process return result; } }
web容器必須知道如何將這個類的eval()方法當做EL函數來使用,所以必須編寫一個標簽鏈接庫描述文件(Tag Library Descriptor, TLD)文件,這個文件是個XML文件,擴展名為*.tld。
infix.tld:
1.0 infix http://club.chuxing/infix Eval Infix eval cc.openhome.InFix double eval(java.lang.String)
在${infix:eval(...)}中,eval名稱就對應於
可以將這個TLD文件直接放在WEB-INF文件夾下,容器會自動找到TLD文件並將其加載。現在可以編寫一個JSP來使用這個自定義的EL函數,例如:
express.jsp:
<%@ page language="java" contentType="text/html; utf-8" pageEncoding="utf-8"%> <%@taglib uri="http://club.chuxing/infix" prefix="infix" %>
taglib指示元素告訴容器在轉譯JSP時,會用到對應uri屬性的自定義函數,prefix則用來設置前置名稱。當JSP中有來自多個不同設計者的EL自定義函數時,就可以避免名稱沖突問題。