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

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

       表達式語言(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的作用域(requestsessionapplication以及page)
  • 擴展函數可以與Java類的靜態方法進行映射。

2、與低版本的環境兼容——禁用EL

     目前只要安裝的Web服務器能夠支持Servlet 2.4/JSP 2.0,就可以在JSP頁面中直接使用EL。由於在JSP2.0以前版本中沒有EL,所以JSP爲了和以前的規範兼容,還提供了禁用EL的方法。有以下三種方法:

       1)、使用斜槓”\”

       只需要在EL的起始標記“$”前加上”\”即可;

       2)、使用page指令

       使用JSPpage指令也可以禁用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個用於訪問作用域範圍的隱含對象,即pageScoperequestScopesessionScopeapplicationScope。應用這4個隱含對喜愛那個指定要查找的標識符的作用域後,系統將不再按照默認的順序(pagerequestsessionapplication)來查找相應的標識符。他們與JSP中的pagerequestsessionapplication內置對象類似。只不過這4個隱含對象只能用來取得指定範圍內的屬性值,而不能取得其他相關信息。

       1)、pageScope隱含對象

       pageScope對象用於返回包含page(頁面)範圍內的屬性的集合,返回值爲java.util.Map對象。下面是一個具體例子,通過pageScope對象讀取page範圍內的JavaBean屬性值。

新建JavaBeanUserInfo

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)、headerheaderValues對象

       用於獲取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函數不常用,所以這裏不介紹了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章