我們知道jsp有九個內(nèi)置對象,而EL表達式有11個對象,這些內(nèi)置對象無需創(chuàng)建可直接使用。今天我們就來學習EL表達式的11個內(nèi)置對象。11個內(nèi)置對象如下所示:
- pageScope
- requestScope
- sessionScope
- applicationScope
- param;
- paramValues;
- header;
- headerValues;
- initParam;
- cookie;
- pageContext;
其中,pageScope,requestScope,sessionScope,applicationScope是域相關的內(nèi)置對象,這里我們就不再多說。這11個內(nèi)置對象中,有10個內(nèi)置對象的類型是Map類型,只有pageContext的類型不是Map類型,它的類型是PageContext。下面我們來一一介紹其他的內(nèi)置對象,以下案例的源代碼可點擊此處
下載,如下:
1.請求參數(shù)相關內(nèi)置對象
請求參數(shù)相關的內(nèi)置對象是:
- param:該內(nèi)置對象的類型是Map<String,String>,可以用來獲取值為單值的請求參數(shù),其中key指的是請求參數(shù)的名稱,value指的是請求參數(shù)的值,使用param獲取請求參數(shù)與request.getParameter()方法一樣。
- paramValues:該內(nèi)置對象的類型是Map<String,String[]>,可以用來獲取值為多值的請求參數(shù),其中key是參數(shù)名,value是多個參數(shù)值組成的字符串數(shù)組。
注意,在使用EL獲取參數(shù)時,如果參數(shù)不存在,返回的是空字符串,而不是null。這一點與使用request.getParameter()方法是不同的。
下面通過一個小例子來掌握這兩個內(nèi)置對象的使用,如下所示:
(1)創(chuàng)建一個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發(fā)布到服務器,然后啟動服務器,在瀏覽器端訪問:http://localhost:8080/Example7/params/params.jsp?username=zhangsan,瀏覽器顯示結(jié)果如圖1-1所示:
圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,使用${param.username}成功的將請求參數(shù)的值獲取到了。
(3)如果在瀏覽器端訪問時發(fā)送了一個多值的請求參數(shù)給服務器,在params.jsp頁面中使用paramValues內(nèi)置對象獲取,params.jsp頁面內(nèi)容如例1-2所示:
<body>
${param.username }<br/>
${paramValues.hobby }<br/>
</body> |
(4)在瀏覽器端訪問:http://localhost:8080/Example7/params/params.jsp?username=zhangsan& hobby=sw& hobby=sj,瀏覽器顯示結(jié)果如圖1-2所示:
圖1-2 瀏覽器顯示結(jié)果
現(xiàn)在如果希望將數(shù)組中的元素使用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,瀏覽器顯示的結(jié)果如圖1-3所示:
圖1-3 瀏覽器顯示結(jié)果
2.請求頭相關內(nèi)置對象
與請求頭相關的內(nèi)置對象是:
- header:該內(nèi)置對象的類型是Map<String,String>,用來獲取值為單值的請求頭信息,其中key代表的是請求頭名稱,value代表的是請求頭的值;
- headerValues:該內(nèi)置對象的類型是Map<String,String[]>,用來獲取值為多值的請求頭信息,key代表的是請求頭名稱,value代表的是請求頭的多個值。
下面通過一個小例子來學習如何使用這兩個內(nèi)置對象獲取請求頭信息,如下所示:
(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,瀏覽器端顯示結(jié)果如圖1-4所示:
圖1-4 瀏覽器顯示結(jié)果
由圖1-4可知,使用${header['User-Agent']}成功的獲取到請求頭的值。至于headerValues內(nèi)置對象這里就不再演示,因為在以后的開發(fā)中很少在頁面中使用el表達式獲取請求頭的信息。
3.初始化參數(shù)相關內(nèi)置對象
我們再學習Servlet時,講過在web.xml文件中配置全局初始化參數(shù),并且全局初始化參數(shù)可以使用ServletContext對象獲取,現(xiàn)在在EL表達式中內(nèi)置了一個與初始化參數(shù)相關的對象:
- initParam:該內(nèi)置對象的類型是Map<String,String>,用來獲取web.xml文件中<context-param>標簽的參數(shù)值,其中key代表的是參數(shù)名,value代表的是參數(shù)值。
下面通過一個小例子來學習如何使用initParam內(nèi)置對象獲取全局初始化參數(shù),如下所示:
(1)對Example7應用下的web.xml文件進行編輯,添加全局初始化參數(shù),主要如例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,瀏覽器顯示結(jié)果如圖1-5所示:
圖1-5 瀏覽器顯示結(jié)果
4.Cookie相關內(nèi)置對象
EL表達式也內(nèi)置一個名為cookie的對象,該內(nèi)置對象與cookie相關,如下:
- cookie:該內(nèi)置對象的類型為Map<String,Cookie>,其中key是Cookie的名字,value是Cookie對象本身。
下面我們就來通過一個小例子來學習如何使用cookie內(nèi)置對象獲取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內(nèi)置對象的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,瀏覽器顯示結(jié)果如圖1-6所示:
圖1-6 瀏覽器顯示結(jié)果
將例1-6中的el表達式修改為“${cookie.JSESSIONID}”,再訪問cookie.jsp,瀏覽器顯示結(jié)果如圖1-7所示:
圖1-7 瀏覽器顯示結(jié)果
由圖1-7可知,${cookie.JSESSIONID}獲取的是名字為JSESSIONID的cookie對象。
5.pageContext內(nèi)置對象
在文檔的開頭我們就說過,EL表達式的11個內(nèi)置對象中,有10個內(nèi)置對象的類型是Map類型,只有pageContext的類型是PageContext。下面我們就來學習如何使用這個內(nèi)置對象,如下所示:
(1)在Example7的WebRoot目錄下新建一個pageContext目錄,然后在該目錄下新建一個pageContext.jsp頁面,主要內(nèi)容如例1-7所示:
例1-7 pageContext.jsp
<body>
${pageContext.request}
</body> |
(2)在瀏覽器端訪問:
http://localhost:8080/Example7/pageContext/pageContext.jsp,瀏覽器顯示結(jié)果如圖1-8所示:
圖1-8 瀏覽器顯示結(jié)果
圖1-8中輸出的正是request對象,我們知道pageContext內(nèi)置對象的類型是PageContext,而該類有一個方法:getRequest(),該方法的返回值就是一個ServletRequest類型的對象。因此${pageContext.request}輸出的就是一個request對象。
(3)將例1-7中的el表達式進行修改,該成“${pageContext.request.contextPath}“,然后再訪問pageContext.jsp頁面,瀏覽器端顯示結(jié)果如圖1-9所示:”
圖1-9 瀏覽器顯示結(jié)果
圖1-9中,瀏覽器端顯示的是當前應用的名稱,我們在學習request對象時講過:調(diào)用request的getContextPath()方法可以獲得當前應用的名稱,而el表達式底層就是調(diào)用get方法,所以${pageContext.request.contextPath}輸出的是當前工程的名字。
我們在表單或超鏈接中寫的訪問路徑之前都是:/工程名/資源路徑,為了以后開發(fā)的維護方便,我們以后在表單或超鏈接中寫的路徑不要直接寫工程名,用${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> |
瀏覽器訪問結(jié)果如圖1-10所示:
圖1-10 瀏覽器顯示結(jié)果
當然,使用pageContext內(nèi)置對象還可以獲取session對象的id值,如:${pageContext.session.id}。pageContext對象可以獲取jsp的其他內(nèi)置對象,所以通過pageContext對象可以獲取其他內(nèi)置對象的任意的屬性值。
本文版權歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://xamj520.com/javaee