表達式語言(Expression Language)簡稱EL,它是JSP2.0中引入的一個新內容。通過EL可以簡化在JSP開發中對對象的引用,從而規範頁面代碼,增加程序的可讀性及可維護性。EL爲不熟悉Java語言頁面開發的人員提供了一個開發Java Web應用的新途徑。下面對EL的語法、運算符及隱含對象進行詳細介紹。
一、EL概述
1、EL簡介
EL沒出現之前,開發Java Web應用程序時,經常需要將大量的Java代碼片段嵌入到JSP頁面中,這會使頁面開起來很亂,如下例子:
<%if(session.getAttribute(“username”)!= null){
out.println(session.getAttribute(“username”).toString());
}%>
而是用EL則只需要下面的依據代碼即可實現:
${username}
通過上面的例子我們可以知道,EL表達式的語法非常簡單,它以”${”開頭,以”}”結束,中間爲合法的表達式,具體的語法格式爲:
${expression}
expression用於指定要輸出的內容,可以使字符串,也可以是由EL運算符組成的表達式。
例如在EL表達式中要輸出一個字符串,可以將此字符串放在一對單引號或雙引號內:
${‘我叫小武靈靈’} 或${“我叫小武靈靈”}
EL有以下幾個特點:
-
EL可以與JSTL結合使用,也可以與JavaScript語句結合使用;
-
EL中會自動進行類型轉換。如果想通過EL輸入兩個字符串型數值的和,可以直接通過”+”號進行連接,如${num1+num2};
-
EL不僅可以訪問一般變量,還可以訪問JavaBean中的屬性以及嵌套屬性和集合對象;
-
在EL中可以獲得命名空間(PageContext對象,它是頁面中所有其他內置對象的最大範圍的集成對象,通過它可以訪問其他內置對象);
-
在使用EL進行除法運算時,如果除數爲0,則返回無窮大Infinity,而不是錯誤;
-
在EL中可以訪問JSP的作用域(request、session、application以及page);
-
擴展函數可以與Java類的靜態方法進行映射。
2、與低版本的環境兼容——禁用EL
目前只要安裝的Web服務器能夠支持Servlet 2.4/JSP 2.0,就可以在JSP頁面中直接使用EL。由於在JSP2.0以前版本中沒有EL,所以JSP爲了和以前的規範兼容,還提供了禁用EL的方法。有以下三種方法:
1)、使用斜槓”\”
只需要在EL的起始標記“$”前加上”\”即可;
2)、使用page指令
使用JSP的page指令也可以禁用EL表達式,語法格式如下;
<%@ page isELIgnored=”布爾值”%> true爲禁用EL
3)、在web.xml文件中配置<el-ignored>元素
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
3、保留的關鍵字
EL中保留的關鍵字如下,在爲變量命名時,應該避免使用這些關鍵字:
and |
eq |
gt |
instanceof |
div |
or |
le |
false |
empty |
not |
Lt |
ge |
二、EL的運算符使用
EL的運算符在按照從左向右的計算原則下,優先級如下:
1、通過EL訪問數據
通過EL提供的”[]”和”.”運算符可以訪問數據。通常情況下這兩個運算符是等價的,可以相互代替。
但也不是所有情況下都可以相互代替,例如當對象的屬性名中包含一些特殊的符號(-或.)時,就只能使用[]來訪問對喜愛那個的屬性。例如${userInfo[user-id]}是正確的,而${userInfo.user-name}是錯誤的。
下面給出通過這兩運算符訪問數據的例子:
1)、獲取數組元素(只能使用[],不能用.)
<%
String[] str = {"一號" , "二號" , "三號" , "四號" , "五號"};
request.setAttribute("user",str);
%>
<%
String[] str1 =(String[])request.getAttribute("user");
for(int i=0; i < str1.length; i++){
request.setAttribute("rt",i);
%>
${rt}: ${user[rt] }<br>
<% }%>
2)、List集合元素的獲取(只能使用[],不能用.)
<%
List<String> list = newArrayList<String>();
list.add("一號");
list.add("二號");
list.add("三號");
session.setAttribute("user",list);
%>
<%
List<String> list1 =(List<String>)session.getAttribute("user");
for(int i = 0 ; i < list1.size() ;i++){
request.setAttribute("rt",i);
%>
${rt}: ${user[rt] }<br>
<% }%>
2、在EL中進行算術運算
運算符 |
功能 |
示例 |
結果 |
+ |
加 |
${1+1} |
2 |
- |
減 |
${1-1} |
0 |
* |
乘 |
${2*2} |
4 |
/或div |
除 |
${2/1}或${2 div 1} |
2 |
${2/0}或${2 div 0} |
Infinity |
||
%或 mod |
求餘 |
${3%2}或${3mod2} |
1 |
${3%0}或${3 mod0} |
異常:java.lang.ArithmeticException:/by zero |
3、在EL中判斷對象是否爲空
通過empty運算符實現,用來確定一個對象或比那輛是否爲null或空,格式如下:
${empty expression}
例如:
<%request.setAttribute("user" , "");%>
<%request.setAttribute("user1" , null);%>
<%request.setAttribute("user2" , 2);%>
${emptyuser} //返回值爲true
${emptyuser1} //返回值爲true
${emptyuser2} //返回值爲false
4、在EL中進行邏輯關係運算
在EL中,通過邏輯運算符和關係運算符可以實現邏輯關係運算。其使用方法都差不多,下面給出一個例子:
<%
request.setAttribute("userName","小武");
request.setAttribute("pwd","123456");
%>
userName= ${userName }<br>
pwd= ${pwd }<br>
\${userName!= "" and (pwd == "asd" )}
${userName!= "" and (pwd == "asd" )}<br>
\${userName== "小武" and pwd == "123456" }
${userName== "小武" and pwd == "123456" }<br>
5、在EL中進行條件運算
在EL中進行條件運算,唯一的優點在於其非常簡單方便,和Java語言中的用法完全一致,其語法格式如下:
${條件表達式? 表達式1 : 表達式2}
例如:${1==1 ? “對”: “錯“}
三、EL的隱含對象
爲了能夠獲得Web應用程序中的相關數據,EL提供了11個隱含對象,這些對象類似於JSP的內置對象,也是直接通過對象名進行操作。
1、頁面上下文對象
pageContext用於訪問JSP內置對象和servletContext。在獲取到這些內置對象後,就可以獲取器屬性值。這些屬性與對象的gexxx()方法相對象,在使用時,去掉方法名中的get,並將首字母改爲小寫即可。下面介紹如何應用頁面上下文對象訪問你JSP的內置對象和servletContext對象。
1)、訪問request對象——${pageContext.request}
獲取到request對象後,就可以通過該對象獲取與客戶端相關的信息。例如要訪問getServerPort()方法,可以使用下面的代碼:
${pageContext.request.serverPort}
注意不可以通過pageContext對象獲取保存到request範圍內的變量。
2)、訪問response對象——${pageContext.response}
3)、訪問out對象——${pageContext.out}
4)、訪問session對象——${pageContext.session}
5)、訪問exception對象——${pageContext.exception}
6)、訪問page對象——${pageContext.page}
7)、訪問servletContext對象——${pageContext.servletContext}
2、訪問作用域範圍的隱含對象
在EL中提供了4個用於訪問作用域範圍的隱含對象,即pageScope、requestScope、sessionScope和applicationScope。應用這4個隱含對喜愛那個指定要查找的標識符的作用域後,系統將不再按照默認的順序(page、request、session及application)來查找相應的標識符。他們與JSP中的page、request、session及application內置對象類似。只不過這4個隱含對象只能用來取得指定範圍內的屬性值,而不能取得其他相關信息。
1)、pageScope隱含對象
pageScope對象用於返回包含page(頁面)範圍內的屬性的集合,返回值爲java.util.Map對象。下面是一個具體例子,通過pageScope對象讀取page範圍內的JavaBean屬性值。
新建JavaBean爲UserInfo:
package com;
public class UserInfo {
private String name ="";
public void setName(Stringname) {
this.name = name;
}
public String getName() {
return name;
}
}
Index.jsp添加:
<body>
<jsp:useBeanid="user" scope="page" class="com.UserInfo"type="com.UserInfo"></jsp:useBean>
<jsp:setPropertyproperty="name" name="user" value="小武靈靈" />
${pageScope.user.name}
</body>
2)、requestScope隱含對象
用於返回包含request範圍內的屬性值的集合,返回值爲java.util.Map對象。例如:
<%
request.setAttribute("userName","小武靈靈");
%>
${requestScope.userName }
3)、sessionScope隱含對象
用於返回包含session範圍內的屬性值的集合。例如:
<%
session.setAttribute("userName","小武靈靈");
%>applicationapplication
${sessionScope.userName }
4)、applicationScope隱含對象
用於返回包含application範圍內的屬性值的集合。例如:、
<%
application.setAttribute("userName","小武靈靈");
>
{applicationScope.userName }
3、訪問環境信息的隱含對象
EL中提供了6個訪問環境信息的隱含對象,分別爲:
1)、param對象
用於獲取請求參數的值,應用在參數值只有一個的情況,返回結果爲字符串。例如:
<formaction="" method="get" name="form1" >
<input name="user" type="text"value="小武靈靈">
<input type="submit">
</form>
${param.user}
2)、paramValues對象
如果一個請求參數名對應多個值,則需要使用paramValues對象獲取請求參數的值,該對象返回的結果爲數組。例如:
<formaction="" method="get" name="form1" >
<input type="checkbox"name="affect" id="affect" value="1">
<input type="checkbox"name="affect" id="affect" value="2">
<input type="checkbox"name="affect" id="affect" value="3">
<input type="checkbox"name="affect" id="affect" value="4">
<input type="submit">
</form>
<%request.setCharacterEncoding("GB18030"); %>
選擇的是:${paramValues.affect[0]}${paramValues.affect[1]}${paramValues.affect[2]}${paramValues.affect[3]}
3)、header和headerValues對象
用於獲取HTTP請求的一個具體的header值,當同一個header存在多個值時需使用headerValues對象。例如:
${header[“connection”]}獲取HTTP請求的header的是否需要持久連接這一屬性
4)、initParam對象
用於獲取Web應用初始化參數的值。例如:
在web.xml文件中設置一個初始化參數user:
<context-param>
<param-name>user</param-name>
<param-value>小武</param-value>
</context-param>
使用EL獲取該參數:
${initParam.user}
5)、cookie對象
用於訪問由請求設置的cookie。例如:
<%
Cookie cookie = new Cookie("user", "xiaowu");
response.addCookie(cookie);
%>
${cookie.user.value }
四、定義和使用EL函數
EL允許定義和使用函數,但是eclipse好像不能自動生成tld文件,我嫌麻煩,而且EL函數不常用,所以這裏不介紹了。