EL表達式及其定義和使用 轉


作者: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方法,靜態方法返回一個自定義的頁面控件。

 

[java]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. public static String localNowDate(){  
  2.     Date date = new Date();  
  3.     String dateString = (1900+date.getYear()) + " 年 " + (date.getMonth() + 1) + " 月 " + date.getDate() + " 日    \n"  
  4.             +date.toLocaleString().substring(9);  
  5.     return dateString;  
  6. }  
  7.   
  8. public static String styleTable1(){  
  9.     return "font-size:20px;color:#E91E63;background-color: #795548;";  
  10. }  
  11.   
  12. public static String funcAlert(String content){  
  13.     System.out.println(content);  
  14.     return "alert('" + content +"')";  
  15. }  
  16.   
  17. public static String myTable(){  
  18.     return "<table id='myTable' style='border-width:2px;border-style: solid;border-color:#795548;'>"  
  19.             + "<tr style='background-color:#666666;'><th>Head1</th><th>Head2</th></tr>"  
  20.             + "<tr><td>Element1</td><td>Element2</td></tr></table>";  
  21. }  

然后定義TLD文件:

 

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"  
  5.     version="2.0">  
  6.     <tlib-version>1.0</tlib-version>  
  7.     <short-name>elDemo</short-name>  
  8.     <uri>elDemo</uri>  
  9.     <function>  
  10.         <description>show local now dateTime</description>  
  11.         <name>localNowDate</name>  
  12.         <function-class>dis.geo.demos.el.ELDemo</function-class>  
  13.         <function-signature>java.lang.String localNowDate()</function-signature>  
  14.     </function>  
  15.       
  16.     <function>  
  17.         <description>styleTable1</description>  
  18.         <name>styleTable1</name>  
  19.         <function-class>dis.geo.demos.el.ELDemo</function-class>  
  20.         <function-signature>java.lang.String styleTable1()</function-signature>  
  21.     </function>  
  22.       
  23.     <function>  
  24.         <description>styleTable1</description>  
  25.         <name>funcAlert</name>  
  26.         <function-class>dis.geo.demos.el.ELDemo</function-class>  
  27.         <function-signature>java.lang.String funcAlert(java.lang.String)</function-signature>  
  28.     </function>  
  29.       
  30.     <function>  
  31.         <description>myTable</description>  
  32.         <name>myTable</name>  
  33.         <function-class>dis.geo.demos.el.ELDemo</function-class>  
  34.         <function-signature>java.lang.String myTable()</function-signature>  
  35.     </function>  
  36. </taglib>  

在web.xml文件中注冊taglib:

 

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <taglib>  
  2.     <taglib-uri>/elDemo</taglib-uri>  
  3.     <taglib-location>fiels/elDemo.tld</taglib-location>  
  4. </taglib>  

在JSP文件中使用自定義的EL表達式:

 

 

[html]  view plain  copy
 
 print?在CODE上查看代碼片派生到我的代碼片
  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8" isELIgnored="false"%>  
  3.     <%@ taglib prefix="me" uri="/elDemo" %>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  5. <html>  
  6. <head>  
  7. <title>MyELDemo</title>  
  8. </head>  
  9. <script type="text/javascript">  
  10.       
  11. </script>  
  12. <body>  
  13.     <p>${me:localNowDate()}</p><br/>  
  14.     <table style="${me:styleTable1()}">  
  15.         <tr>  
  16.             <td>1.1</td>  
  17.             <td>1.2</td>  
  18.             <td>1.3</td>  
  19.         </tr>  
  20.         <tr>  
  21.             <td>2.1</td>  
  22.             <td>2.2</td>  
  23.             <td>2.3</td>  
  24.         </tr>  
  25.         <tr>  
  26.             <td>3.1</td>  
  27.             <td>3.2</td>  
  28.             <td>3.3</td>  
  29.         </tr>  
  30.     </table>  
  31.     <hr/>  
  32.     <href="#" onclick="${me:funcAlert('Clicked me!!!')}">click me</a>  
  33.     <hr/>  
  34.     ${me:myTable() }  
  35. </body>  
  36. </html>  

 

啟動服務器,查看頁面效果:

總結:

EL表達式的使用能夠簡化頁面內容,提高代碼的復用率,其可以完成類似於自定義JSP標簽,CSS樣式。假如有這樣的一種情況,需要在頁面中使用內聯樣式,而樣式的內容又很多,這樣頁面中不僅有標簽還有大量的內聯樣式,不免有些混亂,使用上面例子中的自定義EL就可以解決此類問題。

EL=Expression  Language=Easy Language(簡化語言)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM