程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> [Servlet&JSP] 表達式語言EL

[Servlet&JSP] 表達式語言EL

編輯:關於JSP

[Servlet&JSP] 表達式語言EL


EL簡介

對於JSP中一些簡單的屬性、請求參數、標頭與Cookie等信息的取得,一些簡單的運算或判斷,可以使用表達式語言來處理,還可以將一些常用的功用函數編寫為EL函數,這樣可以減少網頁上一部分的Scriptlet。

例如,對於以下的Scriptlet:

<%
    String a = request.getParameter("a");
    String b = request.getParameter("b");
    out.println("a + b = " + (Integer.parseInt(a) + Integer.parseInt(b)));
%>

如果使用EL,則可以只用一行程序代碼來改寫,甚至加強這段Scriptlet。例如:


${param.a} + ${param.b} = ${param.a + param.b}

EL使用${和}來包括要進行處理的表達式。可使用點運算符(.)指定要訪問的屬性,使用加號(+)運算符進行加法運算。param是EL的隱含對象之一,表示用戶的請求參數,param.a表示取得用戶所發出的請求參數a的值,所輸入的請求參數自動轉換為基本類型並進行運算。

在參數為null時,EL直接以空字符串表示,不會直接顯示null值,在進行運算是時,也不會因此發生錯誤而拋出異常。

EL的點運算符可以連續訪問對象,就如同在Java程序代碼中一樣。例如,原來需要這樣寫:

<%= ((HttpServletRequest)pageContext.getRequest()).getMethod() %>
<%= ((HttpServletRequest)pageContext.getRequest()).getQueryString() %>
<%= ((HttpServletRequest)pageContext.getRequest()).getRemoteAddr() %>

使用EL,則可以這樣編寫:

${pageContext.request.method}

${pageContext.request.queryString}

${pageContext.request.remoteAddr}

pageContext也是EL的隱含對象之一。通過點運算符之後街上xxx名稱,表示嗲用調用getXxx()方法。如果必須轉換類型,EL也會自行處理。

可以使用page指示元素的isELIgnored屬性(默認為true),來設置JSP網頁是否使用EL。會這樣做的原因可能在於,網頁中已含有與EL類似的${}語法功能。例如,使用了某個模板(Template)框架之類。

也可以在web.xml中設置標簽為true,來決定不使用EL。例如:

<web-app ...>
    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <el-ignored>true</el-ignored>
        </jsp-property-group>
    </jsp-config>
</web-app>

以上標簽用來設置符合的JSP網頁是否使用EL。如果JSP網頁使用page命令元素的isElIgnored來設置是否支持EL,則以page命令元素的設置為主。

使用EL訪問屬性

在EL中,可以使用EL隱含對象指定范圍來訪問屬性。如果不指定屬性的存在范圍,則默認是以page、request、session、application的順序來尋找EL中所指定的屬性。

如果EL所訪問的對象是一個數組對象或者List類型對象,則可以使用[]運算符來指定索引以訪問數組中的元素。

使用點運算符與[]運算符的總結:

如果使用點運算符,則左邊可以是JavaBean或Map對象。 如果使用[]運算符,則左邊可以是JavaBean、Map、數組或List對象。

當左邊是Map對象時,建議使用[]運算符,因為設置Map時鍵(key)名稱可能有空白或點字符。

EL隱含對象

在EL中提供了11個隱含對象,其中除了pageContext銀行對象對應pageContext之外,其他隱含對象都對應Map類型。

pageContext隱含對象

對應於PageContext類型,PageContext本身就是一個JavaBean,只要是getXxx()方法,就可以用${pageContext.Xxx}來取得。

與屬性范圍有關的隱含對象

與屬性范圍相關的隱含對象由pageScope、requestScope、sessionScope與applicationScope,分別可以取得使用JSP隱含對象pageContext、request、session與application的setAttribute()方法所設置的屬性對象。如果不使用EL隱含對象指定作用范圍,則默認從pageScope的屬性開始查找。

EL隱含對象pageScope、requestScope、sessionScope與applicationScope不等同於JSP隱含對象pageContext、request、session與application。EL隱含對象僅僅代表作用范圍。

與請求參數相關的隱含對象

與請求參數相關的EL隱含對象由param與paramValues。對應request的getParameter()和getParameterValues()方法。

與標頭(Header)相關的隱含對象

如果要取得用戶請求的標頭數據,則可以使用header或headrValues隱含對象。對應request的getHeader()和getHeaders()方法。

cookie隱含對象

cookie隱含對象可以用來取得用戶的Cookie設置值。如果在Cookie中設置了username屬性,則可以使用${cookie.username}來取得值。

初始化參數隱含對象

initParam可以用來取得web.xml中設置的ServletContext初始參數,也就是在中設置的初始參數。

EL運算符

算數運算符
+ - * (/或div) (%或mod) ?: 邏輯運算符
and or not 關系運算符
小於:< 或 lt
小於或等於:<= 或le
大於:> 或 gt
大於或等於:>=或 ge
等於:== 或 eq

EL運算符的優先級與Java運算符對應

EL自定義函數

自定義函數的第一步是編寫類,它必須是一個公開類,而想要調用的方法也必須是公開的且為靜態方法。例如:

public class Infix {
    public static double eval(String infix) {
        double result = 0;
        //other process
        return result;
    }
}

web容器必須知道如何將這個類的eval()方法當做EL函數來使用,所以必須編寫一個標簽鏈接庫描述文件(Tag Library Descriptor, TLD)文件,這個文件是個XML文件,擴展名為*.tld。

infix.tld:

 

  1.0
  infix
  http://club.chuxing/infix   
  
    Eval Infix 
    eval     
    
        cc.openhome.InFix    
    
    
        double eval(java.lang.String)   
    
  

在${infix:eval(...)}中,eval名稱就對應於標簽的設置,而實際上eval名稱背後執行的類與真正的靜態方法,分別是由設置的。

可以將這個TLD文件直接放在WEB-INF文件夾下,容器會自動找到TLD文件並將其加載。現在可以編寫一個JSP來使用這個自定義的EL函數,例如:
express.jsp:

<%@ page language="java" contentType="text/html; utf-8"
    pageEncoding="utf-8"%>
<%@taglib uri="http://club.chuxing/infix" prefix="infix" %>  

${param.expression} = ${infix:eval(param.expression}}

taglib指示元素告訴容器在轉譯JSP時,會用到對應uri屬性的自定義函數,prefix則用來設置前置名稱。當JSP中有來自多個不同設計者的EL自定義函數時,就可以避免名稱沖突問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved