教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

JAVA培訓(xùn)之EL表達(dá)式的11個(gè)內(nèi)置對(duì)象

更新時(shí)間:2016年09月29日16時(shí)31分 來(lái)源:傳智播客JAVA培訓(xùn)學(xué)院 瀏覽次數(shù):

我們知道jsp有九個(gè)內(nèi)置對(duì)象,而EL表達(dá)式有11個(gè)對(duì)象,這些內(nèi)置對(duì)象無(wú)需創(chuàng)建可直接使用。今天我們就來(lái)學(xué)習(xí)EL表達(dá)式的11個(gè)內(nèi)置對(duì)象。11個(gè)內(nèi)置對(duì)象如下所示:
  • pageScope
  • requestScope
  • sessionScope
  • applicationScope
  • param;
  • paramValues;
  • header;
  • headerValues;
  • initParam;
  • cookie;
  • pageContext;
其中,pageScope,requestScope,sessionScope,applicationScope是域相關(guān)的內(nèi)置對(duì)象,這里我們就不再多說(shuō)。這11個(gè)內(nèi)置對(duì)象中,有10個(gè)內(nèi)置對(duì)象的類型是Map類型,只有pageContext的類型不是Map類型,它的類型是PageContext。下面我們來(lái)一一介紹其他的內(nèi)置對(duì)象,以下案例的源代碼可點(diǎn)擊此處 下載,如下:

1.請(qǐng)求參數(shù)相關(guān)內(nèi)置對(duì)象

請(qǐng)求參數(shù)相關(guān)的內(nèi)置對(duì)象是:
  • param:該內(nèi)置對(duì)象的類型是Map<String,String>,可以用來(lái)獲取值為單值的請(qǐng)求參數(shù),其中key指的是請(qǐng)求參數(shù)的名稱,value指的是請(qǐng)求參數(shù)的值,使用param獲取請(qǐng)求參數(shù)與request.getParameter()方法一樣。
  • paramValues:該內(nèi)置對(duì)象的類型是Map<String,String[]>,可以用來(lái)獲取值為多值的請(qǐng)求參數(shù),其中key是參數(shù)名,value是多個(gè)參數(shù)值組成的字符串?dāng)?shù)組。
注意,在使用EL獲取參數(shù)時(shí),如果參數(shù)不存在,返回的是空字符串,而不是null。這一點(diǎn)與使用request.getParameter()方法是不同的。
下面通過(guò)一個(gè)小例子來(lái)掌握這兩個(gè)內(nèi)置對(duì)象的使用,如下所示:
(1)創(chuàng)建一個(gè)web工程,Example7,在該應(yīng)用的WebRoot目錄下新建一個(gè)目錄:params,然后在該目錄下新建一個(gè)params.jsp頁(yè)面,主要代碼如例1-1所示:
例1-1 params.jsp
<body>
    <%-- map.key這是el的語(yǔ)法!
    map['key']也可以操作map
     --%>
${param.username }<br/>
</body>
EL表達(dá)式操作map的語(yǔ)法是${map.key},或${map[‘key’]}。
(2)將Example7發(fā)布到服務(wù)器,然后啟動(dòng)服務(wù)器,在瀏覽器端訪問(wèn):http://localhost:8080/Example7/params/params.jsp?username=zhangsan,瀏覽器顯示結(jié)果如圖1-1所示:

圖1-1 瀏覽器顯示結(jié)果
由圖1-1可知,使用${param.username}成功的將請(qǐng)求參數(shù)的值獲取到了。
(3)如果在瀏覽器端訪問(wèn)時(shí)發(fā)送了一個(gè)多值的請(qǐng)求參數(shù)給服務(wù)器,在params.jsp頁(yè)面中使用paramValues內(nèi)置對(duì)象獲取,params.jsp頁(yè)面內(nèi)容如例1-2所示:
<body>
${param.username }<br/>
${paramValues.hobby }<br/>
</body>
(4)在瀏覽器端訪問(wèn):http://localhost:8080/Example7/params/params.jsp?username=zhangsan& hobby=sw& hobby=sj,瀏覽器顯示結(jié)果如圖1-2所示:

圖1-2 瀏覽器顯示結(jié)果
現(xiàn)在如果希望將數(shù)組中的元素使用el表達(dá)式輸出在瀏覽器端,el表達(dá)式的格式為:${map.key[索引值]}。
(5)修改params.jsp頁(yè)面,如例1-3所示:
<body>
${param.username }<br/>
${paramValues.hobby[0] }<br/>
${paramValues.hobby[1] }<br/>
</body>
(6)再次訪問(wèn)params.jsp,訪問(wèn)路徑為:http://localhost:8080/Example7/params/params.jsp?username=
zhangsan& hobby=sw& hobby=sj,瀏覽器顯示的結(jié)果如圖1-3所示:

圖1-3 瀏覽器顯示結(jié)果

2.請(qǐng)求頭相關(guān)內(nèi)置對(duì)象

與請(qǐng)求頭相關(guān)的內(nèi)置對(duì)象是:
  • header:該內(nèi)置對(duì)象的類型是Map<String,String>,用來(lái)獲取值為單值的請(qǐng)求頭信息,其中key代表的是請(qǐng)求頭名稱,value代表的是請(qǐng)求頭的值;
  • headerValues:該內(nèi)置對(duì)象的類型是Map<String,String[]>,用來(lái)獲取值為多值的請(qǐng)求頭信息,key代表的是請(qǐng)求頭名稱,value代表的是請(qǐng)求頭的多個(gè)值。
下面通過(guò)一個(gè)小例子來(lái)學(xué)習(xí)如何使用這兩個(gè)內(nèi)置對(duì)象獲取請(qǐng)求頭信息,如下所示:
(1)在Example7的WebRoot目錄下新建一個(gè)目錄header,然后再該目錄下新建一個(gè)header.jsp頁(yè)面,主要代碼如例1-4所示:
例1-4 header.jsp
<body>
${header['User-Agent']}
</body>
例1-4中,請(qǐng)求頭:User-Agent的名字中有一個(gè)特殊字符“-“,因此我們獲取這個(gè)請(qǐng)求頭的值時(shí),el表達(dá)式需要寫(xiě)成“${map[‘key’]}”。
(2)在瀏覽器端訪問(wèn):http://localhost:8080/Example7/header/header.jsp,瀏覽器端顯示結(jié)果如圖1-4所示:

圖1-4 瀏覽器顯示結(jié)果
由圖1-4可知,使用${header['User-Agent']}成功的獲取到請(qǐng)求頭的值。至于headerValues內(nèi)置對(duì)象這里就不再演示,因?yàn)樵谝院蟮拈_(kāi)發(fā)中很少在頁(yè)面中使用el表達(dá)式獲取請(qǐng)求頭的信息。

3.初始化參數(shù)相關(guān)內(nèi)置對(duì)象

我們?cè)賹W(xué)習(xí)Servlet時(shí),講過(guò)在web.xml文件中配置全局初始化參數(shù),并且全局初始化參數(shù)可以使用ServletContext對(duì)象獲取,現(xiàn)在在EL表達(dá)式中內(nèi)置了一個(gè)與初始化參數(shù)相關(guān)的對(duì)象:
  • initParam:該內(nèi)置對(duì)象的類型是Map<String,String>,用來(lái)獲取web.xml文件中<context-param>標(biāo)簽的參數(shù)值,其中key代表的是參數(shù)名,value代表的是參數(shù)值。
下面通過(guò)一個(gè)小例子來(lái)學(xué)習(xí)如何使用initParam內(nèi)置對(duì)象獲取全局初始化參數(shù),如下所示:
(1)對(duì)Example7應(yīng)用下的web.xml文件進(jìn)行編輯,添加全局初始化參數(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目錄下新建一個(gè)目錄initParam,然后再該目錄下新建一個(gè)initParam.jsp頁(yè)面,頁(yè)面的主要代碼如例1-6所示:
例1-6 initParam.jsp
<body>
${initParam.name }
${initParam.address }
</body>
(3)在瀏覽器端訪問(wèn):http://localhost:8080/Example7/initParam/initParam.jsp,瀏覽器顯示結(jié)果如圖1-5所示:

圖1-5 瀏覽器顯示結(jié)果

4.Cookie相關(guān)內(nèi)置對(duì)象

EL表達(dá)式也內(nèi)置一個(gè)名為cookie的對(duì)象,該內(nèi)置對(duì)象與cookie相關(guān),如下:
  • cookie:該內(nèi)置對(duì)象的類型為Map<String,Cookie>,其中key是Cookie的名字,value是Cookie對(duì)象本身。
下面我們就來(lái)通過(guò)一個(gè)小例子來(lái)學(xué)習(xí)如何使用cookie內(nèi)置對(duì)象獲取cookie相關(guān)信息,如下所示:
(1)在Example7的WebRoot目錄下新建一個(gè)cookie目錄,然后在該目錄下新建一個(gè)cookie.jsp頁(yè)面,主要代碼如例1-6所示:
例1-6 cookie.jsp
<body>
<h1>
名字為JSESSIONID的cookie的值:
${cookie.JSESSIONID.value }
</h1>
</body>
例1-6中,因?yàn)閏ookie內(nèi)置對(duì)象的key值是cookie的名稱,所以${cookie.JSESSIONID}獲取的是名為JSESSIONID的Cookie對(duì)象,而Cookie類有g(shù)etValue()方法,所以${cookie.JSESSIONID.value}就是獲取Cookie的值。當(dāng)然如果想要獲取cookie的name值,el表達(dá)式為${cookie.JSESSIONID.name}。
(2)在瀏覽器端訪問(wèn):http://localhost:8080/Example7/cookie/cookie.jsp,瀏覽器顯示結(jié)果如圖1-6所示:

圖1-6 瀏覽器顯示結(jié)果
將例1-6中的el表達(dá)式修改為“${cookie.JSESSIONID}”,再訪問(wèn)cookie.jsp,瀏覽器顯示結(jié)果如圖1-7所示:

圖1-7 瀏覽器顯示結(jié)果
由圖1-7可知,${cookie.JSESSIONID}獲取的是名字為JSESSIONID的cookie對(duì)象。

5.pageContext內(nèi)置對(duì)象

在文檔的開(kāi)頭我們就說(shuō)過(guò),EL表達(dá)式的11個(gè)內(nèi)置對(duì)象中,有10個(gè)內(nèi)置對(duì)象的類型是Map類型,只有pageContext的類型是PageContext。下面我們就來(lái)學(xué)習(xí)如何使用這個(gè)內(nèi)置對(duì)象,如下所示:
(1)在Example7的WebRoot目錄下新建一個(gè)pageContext目錄,然后在該目錄下新建一個(gè)pageContext.jsp頁(yè)面,主要內(nèi)容如例1-7所示:
例1-7 pageContext.jsp
<body>
${pageContext.request}
</body>
(2)在瀏覽器端訪問(wèn):http://localhost:8080/Example7/pageContext/pageContext.jsp,瀏覽器顯示結(jié)果如圖1-8所示:

圖1-8 瀏覽器顯示結(jié)果
圖1-8中輸出的正是request對(duì)象,我們知道pageContext內(nèi)置對(duì)象的類型是PageContext,而該類有一個(gè)方法:getRequest(),該方法的返回值就是一個(gè)ServletRequest類型的對(duì)象。因此${pageContext.request}輸出的就是一個(gè)request對(duì)象。
(3)將例1-7中的el表達(dá)式進(jìn)行修改,該成“${pageContext.request.contextPath}“,然后再訪問(wèn)pageContext.jsp頁(yè)面,瀏覽器端顯示結(jié)果如圖1-9所示:”

圖1-9 瀏覽器顯示結(jié)果
圖1-9中,瀏覽器端顯示的是當(dāng)前應(yīng)用的名稱,我們?cè)趯W(xué)習(xí)request對(duì)象時(shí)講過(guò):調(diào)用request的getContextPath()方法可以獲得當(dāng)前應(yīng)用的名稱,而el表達(dá)式底層就是調(diào)用get方法,所以${pageContext.request.contextPath}輸出的是當(dāng)前工程的名字。
我們?cè)诒韱位虺溄又袑?xiě)的訪問(wèn)路徑之前都是:/工程名/資源路徑,為了以后開(kāi)發(fā)的維護(hù)方便,我們以后在表單或超鏈接中寫(xiě)的路徑不要直接寫(xiě)工程名,用${pageContext.request.contextPath}代替,如例1-8所示:
<body>
    ${pageContext.request.contextPath  }
    <hr/>
    <a href="${pageContext.request.contextPath }/header/header.jsp">點(diǎn)擊這里</a>
    <form action="${pageContext.request.contextPath }/cookie/cookie.jsp" method="post">
      <input type="submit" value="xxx"/>
    </form>
    <hr/>
</body>
瀏覽器訪問(wèn)結(jié)果如圖1-10所示:

圖1-10 瀏覽器顯示結(jié)果
當(dāng)然,使用pageContext內(nèi)置對(duì)象還可以獲取session對(duì)象的id值,如:${pageContext.session.id}。pageContext對(duì)象可以獲取jsp的其他內(nèi)置對(duì)象,所以通過(guò)pageContext對(duì)象可以獲取其他內(nèi)置對(duì)象的任意的屬性值。

本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee
0 分享到:
和我們?cè)诰€交談!