鄭州java培訓教程:EL表達式的11個內置對象
我們知道jsp有九個內置對象,而EL表達式有11個對象,這些內置對象無需創建可直接使用。今天我們就來學習EL表達式的11個內置對象。11個內置對象如下所示:
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
initParam
cookie
pageContext
其中,pageScope,requestScope,sessionScope,applicationScope是域相關的內置對象,這里我們就不再多說。這11個內置對象中,有10個內置對象的類型是Map類型,只有pageContext的類型不是Map類型,它的類型是PageContext。下面我們來一一介紹其他的內置對象如下:
1.請求參數相關內置對象
請求參數相關的內置對象是:
param:該內置對象的類型是Map<String,String>,可以用來獲取值為單值的請求參數,其中key指的是請求參數的名稱,value指的是請求參數的值,使用param獲取請求參數與request.getParameter()方法一樣。
paramValues:該內置對象的類型是Map<String,String[]>,可以用來獲取值為多值的請求參數,其中key是參數名,value是多個參數值組成的字符串數組。
注意,在使用EL獲取參數時,如果參數不存在,返回的是空字符串,而不是null。這一點與使用request.getParameter()方法是不同的。
下面通過一個小例子來掌握這兩個內置對象的使用,如下所示:
(1)創建一個web工程,Example7,在該應用的WebRoot目錄下新建一個目錄:params,然后在該目錄下新建一個params.jsp頁面,主要代碼如例1-1所示:
例1-1 params.jsp
<body>
<%– map.key這是el的語法!
map[‘key’]也可以操作map
–%>
${param.username }<br/>
</body>
EL表達式操作map的語法是${map.key},或${map[‘key’]}。
(2)將Example7發布到服務器,然后啟動服務器,在瀏覽器端訪問:http://localhost:8080/Example7/params/params.jsp?username=zhangsan,瀏覽器顯示結果如圖1-1所示:
圖1-1 瀏覽器顯示結果
由圖1-1可知,使用${param.username}成功的將請求參數的值獲取到了。
(3)如果在瀏覽器端訪問時發送了一個多值的請求參數給服務器,在params.jsp頁面中使用paramValues內置對象獲取,params.jsp頁面內容如例1-2所示:
<body>
${param.username }<br/>
${paramValues.hobby }<br/>
</body>
(4)在瀏覽器端訪問:http://localhost:8080/Example7/params/params.jsp?username=zhangsan& hobby=sw& hobby=sj,瀏覽器顯示結果如圖1-2所示:
圖1-2 瀏覽器顯示結果
現在如果希望將數組中的元素使用el表達式輸出在瀏覽器端,el表達式的格式為:${map.key[索引值]}。
(5)修改params.jsp頁面,如例1-3所示:
<body>
${param.username }<br/>
${paramValues.hobby[0] }<br/>
${paramValues.hobby[1] }<br/>
</body>
(6)再次訪問params.jsp,訪問路徑為:http://localhost:8080/Example7/params/params.jsp?username=zhangsan& hobby=sw& hobby=sj,瀏覽器顯示的結果如圖1-3所示:
圖1-3 瀏覽器顯示結果
2.請求頭相關內置對象
與請求頭相關的內置對象是:
header:該內置對象的類型是Map<String,String>,用來獲取值為單值的請求頭信息,其中key代表的是請求頭名稱,value代表的是請求頭的值;
headerValues:該內置對象的類型是Map<String,String[]>,用來獲取值為多值的請求頭信息,key代表的是請求頭名稱,value代表的是請求頭的多個值。
下面通過一個小例子來學習如何使用這兩個內置對象獲取請求頭信息,如下所示:
(1)在Example7的WebRoot目錄下新建一個目錄header,然后再該目錄下新建一個header.jsp頁面,主要代碼如例1-4所示:
例1-4 header.jsp
<body>
${header[‘User-Agent’]}
</body>
例1-4中,請求頭:User-Agent的名字中有一個特殊字符“-“,因此我們獲取這個請求頭的值時,el表達式需要寫成“${map[‘key’]}”。
(2)在瀏覽器端訪問:http://localhost:8080/Example7/header/header.jsp,瀏覽器端顯示結果如圖1-4所示:
圖1-4 瀏覽器顯示結果
由圖1-4可知,使用${header[‘User-Agent’]}成功的獲取到請求頭的值。至于headerValues內置對象這里就不再演示,因為在以后的開發中很少在頁面中使用el表達式獲取請求頭的信息。
3.初始化參數相關內置對象
我們再學習Servlet時,講過在web.xml文件中配置全局初始化參數,并且全局初始化參數可以使用ServletContext對象獲取,現在在EL表達式中內置了一個與初始化參數相關的對象:
initParam:該內置對象的類型是Map<String,String>,用來獲取web.xml文件中<context-param>標簽的參數值,其中key代表的是參數名,value代表的是參數值。
下面通過一個小例子來學習如何使用initParam內置對象獲取全局初始化參數,如下所示:
(1)對Example7應用下的web.xml文件進行編輯,添加全局初始化參數,主要如例1-5所示:
例1-5 web.xml
<context-param>
<param-name>name</param-name>
<param-value>itcast</param-value>
</context-param>
<context-param>
<param-name>address</param-name>
<param-value>beijing</param-value>
</context-param>
(2)在Example7的WebRoot目錄下新建一個目錄initParam,然后再該目錄下新建一個initParam.jsp頁面,頁面的主要代碼如例1-6所示:
例1-6 initParam.jsp
<body>
${initParam.name }
${initParam.address }
</body>
(3)在瀏覽器端訪問:http://localhost:8080/Example7/initParam/initParam.jsp,瀏覽器顯示結果如圖1-5所示:
圖1-5 瀏覽器顯示結果
4.Cookie相關內置對象
EL表達式也內置一個名為cookie的對象,該內置對象與cookie相關,如下:
cookie:該內置對象的類型為Map<String,Cookie>,其中key是Cookie的名字,value是Cookie對象本身。
下面我們就來通過一個小例子來學習如何使用cookie內置對象獲取cookie相關信息,如下所示:
(1)在Example7的WebRoot目錄下新建一個cookie目錄,然后在該目錄下新建一個cookie.jsp頁面,主要代碼如例1-6所示:
例1-6 cookie.jsp
<body>
<h1>
名字為JSESSIONID的cookie的值:
${cookie.JSESSIONID.value }
</h1>
</body>
例1-6中,因為cookie內置對象的key值是cookie的名稱,所以${cookie.JSESSIONID}獲取的是名為JSESSIONID的Cookie對象,而Cookie類有getValue()方法,所以${cookie.JSESSIONID.value}就是獲取Cookie的值。當然如果想要獲取cookie的name值,el表達式為${cookie.JSESSIONID.name}。
(2)在瀏覽器端訪問:http://localhost:8080/Example7/cookie/cookie.jsp,瀏覽器顯示結果如圖1-6所示:
例1-6中,因為cookie內置對象的key值是cookie的名稱,所以${cookie.JSESSIONID}獲取的是名為JSESSIONID的Cookie對象,而Cookie類有getValue()方法,所以${cookie.JSESSIONID.value}就是獲取Cookie的值。當然如果想要獲取cookie的name值,el表達式為${cookie.JSESSIONID.name}。
(2)在瀏覽器端訪問:http://localhost:8080/Example7/cookie/cookie.jsp,瀏覽器顯示結果如圖1-6所示:
圖1-6 瀏覽器顯示結果
將例1-6中的el表達式修改為“${cookie.JSESSIONID}”,再訪問cookie.jsp,瀏覽器顯示結果如圖1-7所示:
圖1-7 瀏覽器顯示結果
由圖1-7可知,${cookie.JSESSIONID}獲取的是名字為JSESSIONID的cookie對象。
5.pageContext內置對象
在文檔的開頭我們就說過,EL表達式的11個內置對象中,有10個內置對象的類型是Map類型,只有pageContext的類型是PageContext。下面我們就來學習如何使用這個內置對象,如下所示:
(1)在Example7的WebRoot目錄下新建一個pageContext目錄,然后在該目錄下新建一個pageContext.jsp頁面,主要內容如例1-7所示:
例1-7 pageContext.jsp
<body>
${pageContext.request}
</body>
(2)在瀏覽器端訪問:http://localhost:8080/Example7/pageContext/pageContext.jsp,瀏覽器顯示結果如圖1-8所示:
圖1-8 瀏覽器顯示結果
圖1-8中輸出的正是request對象,我們知道pageContext內置對象的類型是PageContext,而該類有一個方法:getRequest(),該方法的返回值就是一個ServletRequest類型的對象。因此${pageContext.request}輸出的就是一個request對象。
(3)將例1-7中的el表達式進行修改,該成“${pageContext.request.contextPath}“,然后再訪問pageContext.jsp頁面,瀏覽器端顯示結果如圖1-9所示:”
圖1-9 瀏覽器顯示結果
圖1-9中,瀏覽器端顯示的是當前應用的名稱,我們在學習request對象時講過:調用request的getContextPath()方法可以獲得當前應用的名稱,而el表達式底層就是調用get方法,所以${pageContext.request.contextPath}輸出的是當前工程的名字。
我們在表單或超鏈接中寫的訪問路徑之前都是:/工程名/資源路徑,為了以后開發的維護方便,我們以后在表單或超鏈接中寫的路徑不要直接寫工程名,用${pageContext.request.contextPath}代替,如例1-8所示:
<body>
${pageContext.request.contextPath}
<hr/>
<a href=”${pageContext.request.contextPath }/header/header.jsp”>點擊這里</a>
<form action=”${pageContext.request.contextPath }/cookie/cookie.jsp”?method=”post”>
<input type=”submit”?value=”xxx”/>
</form>
<hr/>
</body>
瀏覽器訪問結果如圖1-10所示:
圖1-10 瀏覽器顯示結果
當然,使用pageContext內置對象還可以獲取session對象的id值,如:${pageContext.session.id}。pageContext對象可以獲取jsp的其他內置對象,所以通過pageContext對象可以獲取其他內置對象的任意的屬性值。