java----EL表達式


 Java Web中的EL(表達式語言)詳解

       表達式語言(Expression Language)簡稱EL,它是JSP2.0中引入的一個新內容。通過EL可以簡化在JSP開發中對對象的引用,從而規范頁面代碼,增加程序的可讀性及可維護性。EL為不熟悉Java語言頁面開發的人員提供了一個開發Java Web應用的新途徑。下面對EL的語法、運算符及隱含對象進行詳細介紹。

一、EL概述

1、EL簡介

       EL沒出現之前,開發Java Web應用程序時,經常需要將大量的Java代碼片段嵌入到JSP頁面中,這會使頁面開起來很亂,如下例子:

[php]  view plain  copy
 
 print?
  1. <%if(session.getAttribute(“username”)!= null){  
  2.   
  3.        out.println(session.getAttribute(“username”).toString());  
  4.   
  5. }%>  

 

       而是用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>元素

[html]  view plain  copy
 
 print?
  1. <jsp-config>  
  2.   
  3.        <jsp-property-group>  
  4.   
  5.               <url-pattern>*.jsp</url-pattern>  
  6.   
  7.               <el-ignored>true</el-ignored>  
  8.   
  9.        </jsp-property-group>  
  10.   
  11. </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)、獲取數組元素(只能使用[],不能用.)

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3.        String[] str = {"一號" , "二號" , "三號" , "四號" , "五號"};  
  4.   
  5.        request.setAttribute("user",str);  
  6.   
  7. %>  
  8.   
  9. <%  
  10.   
  11.        String[] str1 =(String[])request.getAttribute("user");  
  12.   
  13.        for(int i=0; i str1.length; i++){  
  14.   
  15.               request.setAttribute("rt",i);  
  16.   
  17. %>  
  18.   
  19.        ${rt}: ${user[rt] }<br>  
  20.   
  21. <% }%>  

 

       2)、List集合元素的獲取(只能使用[],不能用.)

      

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3.        List<Stringlist = newArrayList<String>();  
  4.   
  5.        list.add("一號");  
  6.   
  7.        list.add("二號");  
  8.   
  9.        list.add("三號");  
  10.   
  11.        session.setAttribute("user",list);  
  12.   
  13. %>  
  14.   
  15. <%  
  16.   
  17.        List<Stringlist1 =(List<String>)session.getAttribute("user");  
  18.   
  19.        for(int i = 0 ; i list1.size() ;i++){  
  20.   
  21.               request.setAttribute("rt",i);  
  22.   
  23. %>  
  24.   
  25.        ${rt}: ${user[rt] }<br>  
  26.   
  27. <%  }%>  


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}

例如:

[html]  view plain  copy
 
 print?
  1. <%request.setAttribute("user" , "");%>  
  2.   
  3.          <%request.setAttribute("user1"  , null);%>  
  4.   
  5.          <%request.setAttribute("user2"  , 2);%>  
  6.   
  7.          ${emptyuser}       //返回值為true  
  8.   
  9.          ${emptyuser1}     //返回值為true  
  10.   
  11.          ${emptyuser2}    //返回值為false  


4、在EL中進行邏輯關系運算

       在EL中,通過邏輯運算符和關系運算符可以實現邏輯關系運算。其使用方法都差不多,下面給出一個例子:

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3.        request.setAttribute("userName","小武");  
  4.   
  5.        request.setAttribute("pwd","123456");  
  6.   
  7. %>  
  8.   
  9. userName= ${userName }<br>  
  10.   
  11. pwd= ${pwd }<br>  
  12.   
  13. \${userName!= "" and (pwd == "asd" )}  
  14.   
  15. ${userName!= "" and (pwd == "asd" )}<br>  
  16.   
  17. \${userName== "小武" and pwd == "123456" }  
  18.   
  19. ${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:

[java]  view plain  copy
 
 print?
  1. package com;  
  2.   
  3. public class UserInfo {  
  4.   
  5.        private String name ="";  
  6.   
  7.        public void setName(Stringname) {  
  8.   
  9.               this.name = name;  
  10.   
  11.        }  
  12.   
  13.        public String getName() {  
  14.   
  15.               return name;  
  16.   
  17.        }  
  18.   
  19. }  

Index.jsp添加:

[html]  view plain  copy
 
 print?
  1. <body>  
  2.   
  3. <jsp:useBeanidjsp:useBeanid="user" scope="page" class="com.UserInfo"type="com.UserInfo"></jsp:useBean>  
  4.   
  5. <jsp:setPropertypropertyjsp:setPropertyproperty="name" name="user" value="小武靈靈" />  
  6.   
  7. ${pageScope.user.name}  
  8.   
  9. </body>  


       2)、requestScope隱含對象

       用於返回包含request范圍內的屬性值的集合,返回值為java.util.Map對象。例如:

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3. request.setAttribute("userName","小武靈靈");  
  4.   
  5. %>  
  6.   
  7. ${requestScope.userName }  

 

       3)、sessionScope隱含對象

       用於返回包含session范圍內的屬性值的集合。例如:

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3. session.setAttribute("userName","小武靈靈");  
  4.   
  5. %>applicationapplication  
  6.   
  7. ${sessionScope.userName }  

 

       4)、applicationScope隱含對象

       用於返回包含application范圍內的屬性值的集合。例如:、

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3. application.setAttribute("userName","小武靈靈");  
  4.   
  5. >  
  6.   
  7. {applicationScope.userName }  

 

3、訪問環境信息的隱含對象

       EL中提供了6個訪問環境信息的隱含對象,分別為:

       1)、param對象

       用於獲取請求參數的值,應用在參數值只有一個的情況,返回結果為字符串。例如:

[html]  view plain  copy
 
 print?
  1. <formactionformaction="" method="get" name="form1"  >  
  2.   
  3.        <input name="user" type="text"value="小武靈靈">  
  4.   
  5.        <input type="submit">  
  6.   
  7. </form>  
  8.   
  9. ${param.user}  

 

       2)、paramValues對象

       如果一個請求參數名對應多個值,則需要使用paramValues對象獲取請求參數的值,該對象返回的結果為數組。例如:

[html]  view plain  copy
 
 print?
  1. <formactionformaction="" method="get" name="form1"  >  
  2.   
  3.        <input type="checkbox"name="affect" id="affect" value="1">  
  4.   
  5.        <input type="checkbox"name="affect" id="affect" value="2">  
  6.   
  7.        <input type="checkbox"name="affect" id="affect" value="3">  
  8.   
  9.        <input type="checkbox"name="affect" id="affect" value="4">  
  10.   
  11.        <input type="submit">  
  12.   
  13. </form>  
  14.   
  15. <%request.setCharacterEncoding("GB18030"); %>  
  16.   
  17. 選擇的是:${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。例如:

[html]  view plain  copy
 
 print?
  1. <%  
  2.   
  3. Cookie cookie = new Cookie("user", "xiaowu");  
  4.   
  5. response.addCookie(cookie);  
  6.   
  7. %>  
  8.   
  9. ${cookie.user.value }  

 

四、定義和使用EL函數

       EL允許定義和使用函數,但是eclipse好像不能自動生成tld文件,我嫌麻煩,而且EL函數不常用,所以這里不介紹了。


免責聲明!

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



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