本篇我們討論運算式語言(Expression Language,EL)。我們先論述一下它的文法。
EL文法
EL文法很簡單,所有EL運算式都以${開始,以}結束。例如${expr}。
“[]”和“.”操作符
EL使用“[]”和“.”操作符來訪問資料,${expr.identifier}等價於${expr[i"dentifier"]}。例如,訪問javabean對象user的屬性name,可以寫成如下兩種形式。
${user.name};${user["name"]};
如果使用"."操作符,要求點號左邊是一個Map或javabean。例如,在servlet中
Map names = new HashMap();names.put("one","shan");names.put("tow","dong");request.setAtrribute("names",names);
在jsp中,第一個姓名是:${names.one},如果使用“[]”,左邊可以使Map,javabean,List或數組。例如在servlet中,
String names = {"shan","dong"};requset.setAttribute("names",names);
在jsp中,第一個姓名是:${names[0]},也可以用${names["0"]}。在EL中,數組和List中的String類型的索引會被強制轉換為int。
算數操作符
在EL中,共有5個算數操作符+,-,*,/(或div),%(或mod)。分別代表加,減,乘,除,模數。
注意,對於除法運算,如A/B。如果A和B為null,則返回(Long)0,如果A和B類型是BigDecimal或BigInteger,將被強制轉換為BigDecimal,然後返回A.divide(B,BigDecimal.ROUND_HALF_UP),其他情況下,則將A和B強制轉換為Double,然後相除。
關係運算子
在EL中,有6個關係運算子等於(==或eq),不等於(!=或ne),小於(<或lt),大於(>或gt),小於等於(<=或le),大於等於(>=或ge)。
邏輯操作符
在EL中,共有3個邏輯操作符。邏輯與(&&或and),邏輯或(||或or),邏輯非(!或not)。
Empty操作符
Empty操作符是一個首碼操作符,用於檢測一個值是否為null或empty。例如,變數A不存在時,${empty A}返回true。
條件操作符
EL中的條件操作符為“?:”,用法等同於java中的"?:"。
圓括弧
用於改變執行的優先順序。
操作符優先順序(從高到低,從做到右)
[] .
()
-(unary) not ! empty
* / div % mod
+ -(binary)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
?:
隱含對象
EL 運算式定義了11個隱含對象,使用這11個對象可以很方便的讀取到session,cookie,HttpHeader,使用者提交表單(param)等。具體內容如下表。
隱含對象 |
內容 |
applicationScope |
應用程式範圍內的scoped變數組成的集合 |
cookie |
所有cookie組成的集合 |
header |
HTTP要求標頭部,字串 |
headerValues |
HTTP要求標頭部,字串集合 |
initParam |
全部應用程式參數名組成的集合 |
pageContext |
當前頁面的javax.servlet.jsp.PageContext對象 |
pageScope |
頁面範圍內所有對象的集合 |
param |
所有請求參數字串組成的集合 |
paramValues |
所有作為字串集合的請求參數 |
requestScope |
所有請求範圍的對象的集合 |
sessionScope |
所有會話範圍的對象的集合 |
下面是擷取HTTP訪問頭部資料和使用者提交資料的樣本。
${header["host"]},得到HTTP串連頭部的host值
${header["accept"]} ,獲得HTTP頭部的accept值
${header["user-agent"]},獲得HTTP頭部的user-agent值
注意,對於包含連字號“-”和其他一些特殊字元的字串只能使用“[]”操作符,而不能使用"."操作符。所以,上面的兩個例子可以改用${header.host},但是最後的例子只能使用上面的方式。
假設使用者提交資訊為 ?name=shan&alies=shan.net.cn(這裡有兩種訪問方式,一種是使用"[]"來進行訪問,另外一種是使用". "來進行訪問,兩種訪問效果是一樣的。)
${param["name"] } j結果為shan
${param.name}結果為shan
${param["alies"] } 結果為shan.net.cn
${param.alies} 結果為shan.net.cn
命名變數
在EL中,對於命名變數值的尋找是通過PageContext.findAttribute(String)方法來完成的。例如,${user}。這個運算式將按照page,request,session,application範圍的順序尋找命名的屬性user,如果沒找到,返回null。我們也可以利用pageScope,requestScope,sessionScope,applicationScope指定範圍,如${sessionScope.user}。
函數
在EL中,允許定義和使用函數,函數的文法如下:
ns:func(a1,a2,...,an)
其中首碼ns必須匹配包含了函數的標籤庫的首碼,func是函數的名字,n1,n2等是函數的參數。
函數的定義和使用機制類似於標籤庫,例如,編寫一個轉換編碼格式的函數,將字串從一種字元集轉換到GBK編碼。首先編寫一個java類,將該函式宣告為靜態函數。代碼如下:
package com.shan.el;import java.io.*;public class MyFunc {public static toGBK(String str, String charset) throws UnsupportedEncodingException {return new String(str.getBytes(charset),"GBK")}}
然後在標籤庫描述符檔案中對函數進行聲明
<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"><taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <uri>myfunc</uri> <function> <name>toGBK</name> <function-class>com.shan.el.MyFunc</function-class> <function-signature> java.lang.String toGBK(java.lang.String, java.lang.String) </function-signature></taglib>
最後編寫一個測試頁面
<%@ page contentType="text/html;charset=gb2312" %><%@ taglib uri="/myfunc" prefix="myfn"%>歡迎,${myfn:toGBK(param.username,"ISO-8859-1") }!
最後在瀏覽器網址欄輸入對應的url(如http://localhost:8080/Test/test.jsp?username="張三"),就可以看到最後結果。
轉載請註明出處:http://blog.csdn.net/iAm333