表達式語言(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:useBeanidjsp:useBeanid="user" scope="page" class="com.UserInfo"type="com.UserInfo"></jsp:useBean>
- <jsp:setPropertypropertyjsp: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對象
用於獲取請求參數的值,應用在參數值只有一個的情況,返回結果為字符串。例如:
- <formactionformaction="" method="get" name="form1" >
- <input name="user" type="text"value="小武靈靈">
- <input type="submit">
- </form>
- ${param.user}
2)、paramValues對象
如果一個請求參數名對應多個值,則需要使用paramValues對象獲取請求參數的值,該對象返回的結果為數組。例如:
- <formactionformaction="" 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函數不常用,所以這里不介紹了。