從最早之前介紹了能夠在JSP裡面寫Java的Scriptlet Element,到讓程式碼可以重用的action element。但是這些方法寫起來還是不那麼的方便。作為最懶的一群人,每一次要取得session裡面的東西都要寫落落長的東西不是很煩,所以Expression Language(EL)就誕生了。
今天,我們就要來看看EL給我們帶來的便利。
(和我部落格同時發佈:http://www.dotblogs.com.tw/alantsai/archive/2013/10/08/jsp-expression_language.aspx)
EL的基本結構
和其他element不一樣在於,EL的基本結構如下:
${ }
在兩個括弧{}中間的就是我們要運算的東西,或者取出資料的內容。
要記得${}不能放到<% %>之間。
EL總共可以用來做兩件事情:
1.方便用來取得collection 裡面的內容
2.用來做運算和boolean判斷
用EL來取得資料
${}裡面的內容可以直接輸入你要取得的資料名稱。例如我們上篇的例子使用了java bean,這個時候我們也可以直接使用java bean的ID來取得裡面的資料:
上面還保留了其他兩種方法。EL寫法是不是更乾淨。
如果我們直接輸入我們要找的key,EL會先去request裡面找有沒有對應的key,如果有顯示value。沒有的話就會去找session裡面有沒有對應的key。
題外話:還記得上一篇提到關於傳遞variable的scope:
•page就只存在此頁(類似 local variable)
•request就是從一個A頁面設定完轉到B頁面可以取出來,但是如果到頁面C就不見了(像asp .net mvc 的ViewBag),
•Session不需要太多說,
•Application - 整個Web Container只有一個此值(像Static variable)
用來取得其他位置的資料
假設EL只能夠從request和session裡面取資料,那麼它就不會那麼的重要。其實EL還可以從很多其他隱藏為物件取得資料。
要從其他地方取得資料,就需要在key的前面加上資料的放置位置,下面我們會有例子比較清楚。
param 取得query string
假設我們鏈接是:test.jsp?a=1&b=2&a=3: 那麼可以用:
${param.a}或者${param["a"]}能夠取得數值1。
使用paramValues則會取得一個String[],所以我們的例子裡面,${paramValues.a}就會取得一個[1,3]的String array。
header 取得標頭的內容
例如:
${header.host}
取得目前的host位置。
同樣有一個headerValues會回傳String[]。
cookie 用來取得cookie資料
假設我們之前做了response.addCookie(new Cookie("name", "abc")),那麼用EL可以把它取出來:
${cookie.name} //取得該cookie
$(cookie.name.value} // 取得abc
${cookie.name.name} //取得name
xxxScope - 4個不同scope裡面的值
還記得上面提到的4個scope:page、request、session和application。這4個加上Scope就是EL取得某一個的前置詞。這邊我就不寫範例了,基本邏輯都一樣。
pageContext - 此頁面所有的變數
這個範圍非常廣,包含上面四個Scope的參數,但同時也包含了request,response等等。因此,如果要輸出使用者的ip,那麼就是:
${pageContext.request.remoteAddr}
initParam - jsp 初始化參數
我們還沒有提到設定jsp初始化參數,不過既然JSP和Servlet有一樣的父輩,那麼Servlet能做的,jsp通常都可以。因此,EL也提供了方法讓我們取得初始化參數
用EL來做判斷式和運算
上面提到了如何用EL來輸出某一個集合的內容,EL還有另外一個作用就是做運算和做判斷。
做運算
運算很簡單,把你要做的 加、減、乘、除和%(mod)都可以直接輸入即可。例如:
${1 + 3} //輸出 4
${ 5 % 3} // 輸出 2
做判斷
那這邊基本判斷都有,&&、||、not、>、<等。
題外話:每一個預算式都有提供文字輸入方式,例如 > 也可以寫成 gt,因此需要的時候可以查詢一下。
那也可以做字串比較,例如:
${"1" == param.a} //判斷query string a的值是不是1
那也有提供集合是否為空的比較:
${empty param.a} //判斷是否為空或者0
EL的缺點
看完EL是不是覺得取資料非常方便。但是它也有自己的局限性。首先,你沒有辦法在scriptlet裡面用EL。因此,如果需要在scriptlet取值做判斷,只能乖乖的用 java方式取得。
其次,他不能訪問普通方法,也不能取得靜態屬性。
看到這裡,應該會浮現出EL只適合用來輸出內容。但是,其實搭配JSTL,EL的威力就會展露無遺。
結語
今天介紹了EL,希望大家對於純粹輸出內容到jsp頁面上面會感覺到如虎添翼。那對於EL的局限性也有比較好的瞭解。
接下來我會在介紹jsp其他比較沒有提到的,然後我們就可以準備迎接其他Servlet漏掉的重要技術。