1. 程式人生 > >EL(表示式語言)的運用

EL(表示式語言)的運用

EL(表示式語言) 一、EL(表示式語言)概述 在EL(表示式語言)沒有出現之前,開發Java Web應用程式時,需要將大量的Java程式碼片段嵌入到JSP頁面中,這樣會使頁面看起來很亂,而使用EL則比較簡潔。 1、EL的基本語法 EL表示式語法非常簡單,它以“${"開頭,以“}”結束,中間為合法的表示式,具體的語法格式如下: ${expresssion} 引數說明: expression:用於指定要輸出的內容,可以是字串,也可以是由EL運算子組成的表示式 注意:要想在頁面顯示“${”字串,必須在前面加上“\”,即"\${",或者寫成"${'${'}",也就是用EL表示式輸出"${".
2、EL表示式的特點 EL除了具有語法簡單、使用方便的特點,還具有以下特點: (1)EL可以與JSTL結合使用,也可以與javaScript語句結合使用。 (2)EL中會自動進行型別轉換。如果想通過EL輸入兩個字串型數值的和,可以直接通過“+”號進行連線(如${number1+numbei2}). 3)EL不僅可以訪問一般變數,還可以訪問JavaBean中的屬性以及巢狀屬性和集合物件。 (4)在EL中可以執行算術運算、邏輯運算、關係運算和條件運算等操作。 (5)在EL中可以訪問JSP的作用域(request、session、page、application)
(6)擴充套件函式可以與Java類的靜態方法進行對映。
二、與低版本的環境相容-禁用EL EL已經是一項成熟、標準的技術,只要安裝的Web伺服器能夠支援Servlet2.4/JSP2.0,就可以在JSP頁面中直接使用EL。由於在JSP2.0以前的版本中沒有EL,所以JSP為了和以前的規範相容,提供了禁用EL的方法。JSP提供了三種禁用EL的方法,如下: 1、使用斜槓“\”符號 使用斜槓符號禁用是一種比較簡單的禁用EL的方法,該方法只需在EL的其實標記“${”前面加一個“\”符號。 2、使用page指令
使用JSP的page指令也可以禁用EL表示式,其具體語法格式如下: <%@ page isELIgnore="布林值"%> 引數說明: isELIgnore:用於指定是否禁用頁面中的EL,如果屬性值為true,則忽略頁面中的EL,否則將解析頁面中的EL。 3、在web.xml檔案中配置<el-ignored>元素 在web.xml檔案中配置<el-ignored>元素可以實現禁用伺服器中的EL,如下:
<jsp-config>    <jsp-property-group>        <url-pattern>*.jsp</url-pattern>        <el-ignored>true</el-ignored>    </jsp-property-group> </jsp-config> 該方法適合於禁用Web'應用中所有JSP頁面中的EL.
三、EL的運算子優先順序 EL可以訪問資料運算子、算術運算子、關係運算符、邏輯運算子、條件運算子及empty運算子等。運算子的優先順序決定了在多個運算子同時存在時,各個運算子的求值順序,對於同級的運算符采用從左到右計算原則,使用括號可以改變優先順序。
1、通過EL訪問資料 通過EL提供的“[]”和“.”運算子可以訪問資料。通常情況下,“[]”和"."運算子是等價,可以相互代替。
例如:${info.id}和${info[id]是等價的。 但是也不是所有的情況都可以相互替代,例如,當物件的屬性名中包括一些特殊的符號(-或.)時,就只能用“[]”運算子來訪問物件的屬性。例如,${info[user-id]}是正確的,而${info.user-name}是錯誤的。另外,EL的“[]”還有一個用途,就是用來獲取陣列或List集合中的資料。 (1)陣列元素的獲取 應用“[]”運算子可以獲取陣列的指定元素,但是“.”運算子不能。 如:${info[0]}或 <body>
    <%
      String[] arr={"Java Web開發典型模組大全","Java範例完全自學手冊","JSP專案開發全程實錄"};
      request.setAttribute("book",arr);
    %>
    <%
    String[] arr1= (String[]) request.getAttribute("book");
    for(int i=0;i<arr1.length;i++){
        request.setAttribute("request1",i);
   %>
       ${request1}:${book[request1]}<br>
   <%
    }
  %>
  </body>
</html>
(2)List集合的獲取 應用“[]”運算子還可以獲取List集合中的指定元素,但是“.”運算子則不能。 2、在EL中進行算術運算 在EL中,也可以進行算術運算,同java語言一樣,EL提供了加、減、乘、除和求餘5種算術運算子。 3、在EL中判斷物件是否為空 在EL中,判斷物件是否為空,可以通過empty運算子實現,該運算子是一個字首(prefix)運算子,即empty運算子位於運算元前方,用來確定一個物件或變數是否為null或空。empty運算子的格式如下:
${empty expression} 引數說明: expression用於指定要判斷的變數或物件。 注意:一個變數或物件為null或空的意義是不同的。null表示這個變數沒有指明任何物件,而空表示這個變數所屬的物件的內容為空,例如,空字串、空的陣列或空的List容器。 4、在EL中進行邏輯運算
在EL中,通過邏輯運算子和關係運算符可以實現邏輯關係運算。關係運算符用於實現對兩個表示式的比較,進行比較的表示式可以是數值型,也可以是字串型。而邏輯運算子,則常用對JavaBean型的資料進行操作。邏輯運算子和關係運算符經常一同使用。
五、EL也直接通過物件名的隱含物件 為了能夠獲得Web應用程式中的相關資料,EL提供了11個隱含物件,這些物件類似於JSP的內建物件,也是直接通過物件名進行操作。在EL的隱含物件中,除了PageContext是JavaBean物件,對應與javax.servlet.jsp.PageContext型別,其它的隱含物件都對應於Java.util.Map型別。這些隱含物件可以分為頁面上下文物件、訪問作用域範圍物件和訪問環境資訊的隱含物件3種。 1、頁面上下文物件 頁面上下文物件為pageContext,用於訪問JSP內建物件(如request、response、out、session、exception和page等,但不能獲取application、config和pageContext物件)和servletContext。在獲取到這些物件後,就可以獲取其屬性值。這些屬性與物件的getXXX()方法相對應,在使用時,去掉方法名中的get,並將首字母改為小寫即可。下面將分別介紹如何應用頁面上下文物件訪問JSP的內建物件和servletContext物件。 (1)訪問request物件,如下: ${pageContext.request} 獲取到request物件之後,就可以通過該物件獲取與客戶端相關的資訊。例如,HTTP報頭資訊、客戶資訊提交方式、客戶端主機IP地址與埠號,例如: ${pageContxt.request.serverPort} (2)訪問response物件,如下: 通過pageContext獲取JSP內建物件中的response物件 ${pageContext.response} 獲取到response物件之後,就可以通過該物件獲取與響應有關的資訊,例如: ${pageContext.response.contentType},返回響應的內容型別,這裡為“text/html;charset=UTF-8”; (3)訪問out物件,如下: ${pageContext.out} 獲取out物件之後,就可以通過該物件獲取與輸出有關的資訊,例如:
${pageContext.out.bufferSize}
(4)訪問session物件 ${pageContext.session} 獲取session物件後,就可以通過該物件獲取與session相關的資訊,例如: ${pageContext.session.maxInactiveInterval} (5)訪問exception物件 ${pageContext.exception} 獲取exception物件之後,就可以通過該物件獲取JSP頁面的異常資訊,例如: ${pageContext.exception.message} (6)訪問page物件 ${pageContext.page} 獲取page物件後,就可以通過該物件獲取當前頁面的類檔案,例如: ${pageContext.page.class} 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物件。 (2)requestScope隱含物件 sessioinScope隱含物件用於返回包含session範圍內的屬性值的集合,返回值為java.util.Map物件。 (3)sessionScope隱含物件 sessionScope隱含物件返回session範圍內屬性值的集合,返回值為java.util.Map物件。 (4)applicationScope物件 applicationScope隱含物件返回application範圍內的屬性值的集合,返回值為java.util.Map物件。 3、訪問環境資訊的隱含物件
在EL中,提供了6個訪問環境的隱含物件。下面分別介紹:
(1)param物件 param物件用於獲取請求引數的值,應用在引數值只有一個的情況下。在應用param物件時,返回的結果為字串。 例如:<input type="text" name="name"> 當表單提交後,要獲取name文字框的值,使用下面的程式碼: ${param.name} (2)paramValues物件 如果請求引數名對應多個值時,則需要使用paramValues物件獲取請求引數的值,返回的結果為陣列。 (3)header和headerValues物件 header物件用於獲取HTTP請求的一個具體的header的值,但是在有些情況下,可能存在同一個header擁有多個不同的值的情況,這時就需要使用headerValues物件。 (4)initParam物件 initParam物件用於獲取Web應用初始化引數的值。 在web.xml檔案中設定一個初始化引數author,用於指定作者。具體程式碼如下: <context-param>      <param-name>author</param-name>      <parma-value>lyt</param-value> </context-param> 應用EL獲取引數author的值,${initParam.author} (5)cookie物件 雖然在EL中,並沒有提供向cookie中儲存值的方法,但是它提供了訪問由請求設定的cookie的方法,這可以通過cookie隱含物件實現。如果在cookie中已經設定一個名稱為username的值,那麼可以使用${cookie.username}來獲取該cookie物件,但是如果要獲取cookie中的值,需要使用cookie物件的value屬性。例如: <%         Cookie  cookie=new Cookie("user","mrbccd");        response.addCookie(cookie); %> ${cookie.user.value} 注意:所謂的cookie是一個文字檔案,它是以key、value的方法將使用者會話資訊記錄在這個文字檔案內,並將其暫時存放在客戶端瀏覽器中。
六、定義和使用EL函式 1.定義和使用函式 函式的定義和使用分為以下三步驟: (1)編寫一個Java類,並在該類中編寫公用的靜態方法,用於實現自定義EL函式的具體功能。 (2)編寫標籤庫描述檔案,對函式進行說明,該檔案的副檔名為.tld被儲存在Web應用的WEB-INF資料夾下。 (3)在JSP頁面中引用標籤庫,並呼叫定義的EL函式,實現相應的功能。 例如: 第一步:
package com.wgh;

public class StringDeal {
    public static String shiftEnter(String str){
        String newStr=str.replaceAll("\r\n","<br>");
        newStr=newStr.replaceAll(" ","&nbsp;");
        return newStr;
    }
}
第二步:
<?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
        http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <tlib-version>1.0</tlib-version>
    <uri>/stringDeal</uri>
    <function>
        <name>shiftEnter</name>
        <function-class>com.wgh.StringDeal</function-class>
        <function-signature>java.lang.String shiftEnter(java.lang.String)</function-signature>
    </function>
</taglib>
第三步:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
      <form name="form1" method="post" action="deal.jsp">
          <textarea name="context" cols="30" rows="5"></textarea>
          <br>
          <input type="submit" value="提交" >
      </form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="/stringDeal" prefix="wghfn"%>
<%request.setCharacterEncoding("UTF-8");%>
<html>
<head>
    <title>顯示結果</title>
</head>
<body>
    內容為:<br>
  ${wghfn:shiftEnter(param.context)}<!--param.context獲取文字框的內容-->
</body>
</html>