JSP - Expression Language (EL)

從最早之前介紹了能夠在JSP裡面寫Java的Scriptlet Element,到讓程式碼可以重用的action element。但是這些方法寫起來還是不那麼的方便。作為最懶的一群人,每一次要取得session裡面的東西都要寫落落長的東西不是很煩,所以Expression Language(EL)就誕生了。

今天,我們就要來看看EL給我們帶來的便利。

前言

從最早之前介紹了能夠在JSP裡面寫Java的Scriptlet Element,到讓程式碼可以重用的action element。但是這些方法寫起來還是不那麼的方便。作為最懶的一群人,每一次要取得session裡面的東西都要寫落落長的東西不是很煩,所以Expression Language(EL)就誕生了。

今天,我們就要來看看EL給我們帶來的便利。

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漏掉的重要技術。

Dotblogs 的標籤:

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。