Servlet&JSP的那些事兒(十七)

來源:互聯網
上載者:User

本篇我們討論運算式語言(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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.