作者:http://blog.csdn.net/goskalrie/article/details/51315397
簡介
EL(Expression Language)表達式語言實在JSP2.0版本中引入的新特性,它用於JSP文件中的數據訪問。這種表達式語言能簡化JSP文件中數據訪問的代碼,可用來代替傳統的基於”<%=”和”%>”形式的Java表達式,以及部分基於“<%”heels“%>”形式的Java程序片段。
例如:
<%
ShoppingCart cart =(ShoppingCart)session.getAttribute(“cart”);
if(cart != null){
%>
<%=cart.getTotal()%>
<%} %>
上述代碼等價於:
${sessionScope.cart.total}
基本語法
EL表達式的基本形勢為:${var},所有的表達式都以”${”符號開頭,以”}”符號結尾。如果在JSP文件的模版文件中使用EL表達式,那么表達式的值會輸出到網頁上。
例如以下Java表達式和El表達式的作用相同,都用於輸出請求參數username:
Java表達式:<%=request.getParameter(“username”)%>
EL表達式:${param.username}
比較以上兩種表達式的形式,可以看出,EL表達式使得JSP文件的穿件人員能用更加簡單的語法來訪問數據。
EL表達式和Java表達式一樣,既可以直接插入到JSP文件的模版文件中,也可以作為JSP標簽的屬性的值:
<jsp:useBeanid=”myBean” scope=”page” class=”defaultPackage.CounterBean”/>
<jsp:setProerptyname=”myBean” property=”count” value=”${myBean.count+1}”/>
Current countvalue is :${myBean.count}
訪問對象的屬性及數組的元素
EL表達式語言可以使用點號運算符”.”來訪問對象的屬性,例如表達式${customer.name}表示customer對象的name屬性。
EL表達式語言也可以使用方括號運算符”[]”來訪問對象的屬性,例如表達式${customer[“name”]}和${customer.name}是等價的。
方括號運算符”[]”還可以用來訪問數組中的元素,例如${sustomers[0]}表示訪問customers數組中的第一個元素。
EL語言的運算符
運算符類型 |
運算符 |
說明 |
范例 |
結果 |
算 術 運 算 符 |
+ |
加 |
${16+5} |
21 |
- |
減 |
${16-5} |
11 |
|
* |
乘 |
${16*5} |
80 |
|
/或div |
除 |
${16/5} |
3.2 |
|
%或mod |
模(求余) |
${16%5} |
1 |
|
關 系 運 算 符 |
==或eq |
等於 |
${16==5} |
false |
!=或ne |
不等於 |
${16!=5} |
true |
|
<或lt |
小於 |
${16<5} |
false |
|
>或gt |
大於 |
${16>5} |
true |
|
<=或le |
小於等於 |
${16<=5} |
false |
|
>=或ge |
大於等於 |
${16>=5} |
true |
|
邏輯 運算 符 |
&&或and |
邏輯與 |
${16>5&&16<18} |
true |
||或or |
邏輯或 |
${16>5||16<18} |
true |
|
!或not |
邏輯非 |
${!(16>5)} |
false |
|
empty運算符 |
empty |
檢查是否為空值 |
${empty var} |
如果變量var為null,就返回true |
條件運算符 |
a?b:c |
條件運算符 |
${16>5?16:5} |
16 |
EL語言提供了一個用於測試對象是否為空的特殊運算符“empty“,其語法形式為${empty var},它能判斷var變量(確切地說,應該是命名變量)是否為空。在以下情況下empty運算符返回true:
· var變量不存在,即沒有定義。
· var變量的值為null。
· var變量引用集合(Set、List和Map)類型的對象,並且在i集合對象中不包含任何元素。
empty運算符可以與”!”運算符一起使用。
隱含對象
EL語言定義了11個隱含對象,他們都是java.util.Map類型。
EL表達式語言中的隱含對象
隱含對象的固定變量名 |
類型 |
說明 |
applicationScope |
java.util.Map |
把Web應用范圍內的屬性名和屬性值進行映射 |
cookie |
java.util.Map |
把客戶請求中的Cookie名和Cookie對象進行映射 |
header |
java.util.Map |
把HTTP請求頭部的項目名和項目值進行映射 |
headerValues |
java.util.Map |
把HTTP請求頭部的項目名和項目值的數組進行映射,例如${headerValues[“accept-language”]}等價於<%=request.getHeaders(“accept-laguage”)%> |
initParam |
java.util.Map |
把Web應用的初始化參數名和參數值進行映射 |
pageContext |
java.util.Map |
表示javax.servlet.jsp.PageContext對象 |
pageScope |
java.util.Map |
把頁面范圍內的屬性名和屬性值進行映射 |
param |
java.util.Map |
把客戶請求中的請求參數名和參數值進行映射 |
paramValues |
java.util.Map |
把客戶請求中的請求參數名和所有匹配的參數值數組進行映射 |
resquestScope |
java.util.Map |
把請求范圍內的屬性名和屬性值進行映射 |
sessionScope |
java.util.Map |
把會話范圍內的屬性名和屬性值進行映射 |
命名變量
EL表達式中的變量稱為命名變量,它不是JSP文件中的局部變量或實例變量,而是存放在特定該范圍內的屬性,命名變量的名字和屬性名字對應。例如${username}等價於以下代碼:
<%
Stringusername=(String)pageContext.finAttribute(“username”);
if(username != null){
%>
<%=username%>
<%} %>
假如在Person類中並不存在username屬性,而是提供了public類型的getUsername()方法:
public String getUsername(){
returnthis.lastName + “.” + this.firstName;
}
就可以通過${person.username}表達式獲得person.getUsername()方法的返回值。
自定義和使用EL函數
EL表達式語言可以訪問EL函數。EL函數實際上與Java類的方法對應,這個Java類必須定義為public類型,並且作為函數的方法必須聲明為public static類型。當Java類定義好以后,應該在標簽描述符(TLD)文件中,把Java類的方法映射為函數。
創建一個簡單的工具類,定義靜態方法localNowDate()方法,在頁面中顯示當前的本地時間。靜態方法styleTable1()設置常用的表格樣式,靜態方法funcAlert()自定義簡單的js方法,靜態方法返回一個自定義的頁面控件。
- public static String localNowDate(){
- Date date = new Date();
- String dateString = (1900+date.getYear()) + " 年 " + (date.getMonth() + 1) + " 月 " + date.getDate() + " 日 \n"
- +date.toLocaleString().substring(9);
- return dateString;
- }
- public static String styleTable1(){
- return "font-size:20px;color:#E91E63;background-color: #795548;";
- }
- public static String funcAlert(String content){
- System.out.println(content);
- return "alert('" + content +"')";
- }
- public static String myTable(){
- return "<table id='myTable' style='border-width:2px;border-style: solid;border-color:#795548;'>"
- + "<tr style='background-color:#666666;'><th>Head1</th><th>Head2</th></tr>"
- + "<tr><td>Element1</td><td>Element2</td></tr></table>";
- }
然后定義TLD文件:
- <?xml version="1.0" encoding="utf-8" ?>
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
- version="2.0">
- <tlib-version>1.0</tlib-version>
- <short-name>elDemo</short-name>
- <uri>elDemo</uri>
- <function>
- <description>show local now dateTime</description>
- <name>localNowDate</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String localNowDate()</function-signature>
- </function>
- <function>
- <description>styleTable1</description>
- <name>styleTable1</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String styleTable1()</function-signature>
- </function>
- <function>
- <description>styleTable1</description>
- <name>funcAlert</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String funcAlert(java.lang.String)</function-signature>
- </function>
- <function>
- <description>myTable</description>
- <name>myTable</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String myTable()</function-signature>
- </function>
- </taglib>
在web.xml文件中注冊taglib:
- <taglib>
- <taglib-uri>/elDemo</taglib-uri>
- <taglib-location>fiels/elDemo.tld</taglib-location>
- </taglib>
在JSP文件中使用自定義的EL表達式:
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8" isELIgnored="false"%>
- <%@ taglib prefix="me" uri="/elDemo" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>MyELDemo</title>
- </head>
- <script type="text/javascript">
- </script>
- <body>
- <p>${me:localNowDate()}</p><br/>
- <table style="${me:styleTable1()}">
- <tr>
- <td>1.1</td>
- <td>1.2</td>
- <td>1.3</td>
- </tr>
- <tr>
- <td>2.1</td>
- <td>2.2</td>
- <td>2.3</td>
- </tr>
- <tr>
- <td>3.1</td>
- <td>3.2</td>
- <td>3.3</td>
- </tr>
- </table>
- <hr/>
- <a href="#" onclick="${me:funcAlert('Clicked me!!!')}">click me</a>
- <hr/>
- ${me:myTable() }
- </body>
- </html>
啟動服務器,查看頁面效果:
總結:
EL表達式的使用能夠簡化頁面內容,提高代碼的復用率,其可以完成類似於自定義JSP標簽,CSS樣式。假如有這樣的一種情況,需要在頁面中使用內聯樣式,而樣式的內容又很多,這樣頁面中不僅有標簽還有大量的內聯樣式,不免有些混亂,使用上面例子中的自定義EL就可以解決此類問題。
EL=Expression Language=Easy Language(簡化語言)