在使用el時,其實el是先看標識符是否是其隱式對象之一,如果不是,才從四個域(page、request、session、application)中順序搜索(使用pagecontext.findattribute方法)。
el總共有如下隱式對象:
而這里,el和jsp一樣擁有pagecontext對象,通過在el中使用pagecontext對象,能獲取jsp中其它幾個隱式對象,然后再獲得這些對象中的屬性。例如獲取當前web工程的名稱的經典el表達式:${ pagecontext.request.contextpath },就是由pagecontext先獲取request對象(因為在jsp的api中,我們可以看到pagecontext有getrequest方法),獲取到request對象后,因為request中含有getcontextpath方法,因此我們還可以獲得request對象中contextpath屬性的值。
pagescope、requestscope、sessionscope、applicationscope這四個el隱式對象分別代表了各自域中的map對象(每個域以關鍵字來保存數據或對象,肯定是使用map集合),這map對象保存了存在這些域中的鍵值對。通過el表達式和這些隱式對象,我們可以直接從指定的域中獲取存儲的數據。
例1:
1
2
3
4
5
6
|
<% user u = new user(); u.setusername( "fjdingsd" ); session.setattribute( "user" , u); %> 歡迎您:${sessionscope.user.username} |
在瀏覽器中觀察:
對于用戶登錄這樣的案例來說,我們檢查用戶是否登錄肯定只需要從session域中查詢,這樣使用el表達式的sessionscope隱式對象就足夠了。
param隱式對象:表示所有請求參數的map集合對象。例如表單提交,那么在請求參數中的數據就以鍵值對存儲在param對象所代表的map集合中,下面的例子我以get方式來替代post方式來模擬表單請求參數:
例2:
1
|
${param.username} |
在地址欄上添加url參數,可以看到:
使用param隱式對象同樣也能作為數據回顯功能,在以前jsp頁面提交的表單如果想做出數據回顯功能,必須創建一個form的bean對象,當表單校驗失敗時,重新將這個bean對象通過轉發(forward)傳回jsp頁面再取出。而使用param對象,不需要新建form的bean對象,只需要在表單校驗失敗時轉發回表單所在的jsp頁面,通過param對象就可以從請求中取出之前的表單數據。
例3:表單驗證失敗的數據回顯demo
在jsp頁面beantag.jsp中:
1
2
3
4
|
<form action= "${pagecontext.request.contextpath}/servlet/formhandler" method= "post" > 用戶名 <input type= "text" name= "username" value= "${param.username}" /> <input type= "submit" value= "提交" > </form> |
在處理表單的servlet中:
1
2
|
//省略表單驗證過程,驗證失敗重新轉發到表單頁面 request.getrequestdispatcher( "/beantag.jsp" ).forward(request, response); |
剛進入表單注冊頁面:
假設表單驗證失敗,則轉發請求到表單注冊頁面,并回顯數據:
paramvalues隱式對象:也是表示一個保存所有的請求參數的map集合對象,但是paramvalues對象和param對象的區別是,對任何一個參數,paramvalues都是以字符串數組(string[])作為保存數據的類型,因此paramvalues對象適合在有同名參數的情況下使用。
例4:
1
|
${paramvalues.name[ 0 ]} |
瀏覽器中觀察:
例5:
1
|
${paramvalues.name[ 1 ]} |
瀏覽器中觀察:
header隱式對象:表示一個保存了該jsp頁面發出請求的請求頭字段的map集合對象。
注意:這個對象只能獲取請求頭字段的信息,不能獲取響應頭字段的信息。另外如果頭字段中含有小橫線的”-”,例如”accept-encoding”,則要使用中括號加引號的el取數據形式,例如 ${ header[‘accept-encoding'] }。
例6:
1
|
${header.connection} |
在瀏覽器中觀察:
例7:
1
|
${header[ 'accept-encoding' ]} |
在瀏覽器中觀察:
headervalues隱式對象功能類似于header隱式對象,但以字符串數組封裝每個保存的請求頭字段信息,這點跟paramvalues隱式對象是一樣的。
cookie隱式對象:表示一個保存了該請求中所有的cookie的map集合對象。
假設在請求中有一個cookie,cookie的鍵值對為:
1
|
jsessionid=e9546ae9c86fb722bdbd7af947157379 |
例8:
1
|
${cookie.jsessionid} |
在瀏覽器中觀察:
可以看到,cookie隱式對象的名稱(cookie)是map集合的名稱,而在這個map集合中,有一個鍵值對的key命名為jsessionid,而通過${cookie.jsessionid}獲取到的是一個cookie對象,那么我們如何獲取該cookie的值呢?
之前說過el表達式都是通過對象的具有的屬性來獲取屬性值,能被稱為屬性的都有getxxx方法,而cookie正是具有getname()方法和getvalue()方法,因此在el表達式中獲取了cookie對象后可以再獲取這兩個屬性:
例9:
1
2
|
${cookie.jsessionid.name} <br> ${cookie.jsessionid.value} <br> |
在瀏覽器中觀察:
initparam隱式對象:表示一個保存了所有web應用初始化參數(context-param)的map集合對象。
<context-param>標簽用于配置全局性的web參數,在servlet中可以使用 servletcontext.getinitparameter方法獲取指定參數的值。
而在jsp頁面中,我們可以同el表達式的initparam方法來獲取為web應用配置的全局性參數。
例10:
在web.xml文件中配置:
1
2
3
4
5
6
7
|
<context-param> <param-name>username</param-name> <param-value>fjdingsd</param-value> </context-param> |
在jsp頁面中:
1
|
${initparam.username } |
在瀏覽器中觀察: