JSP && EL運算式__JSP
來源:互聯網
上載者:User
起初被JSP對象弄得好亂,學了EL運算式後更亂~
不過今天花了一上午時間,搞透了(*^__^*) 嘻嘻……
首先說一下JSP內建對象:
JSP內建物件類型對應表
對象名 類型 範圍
request javax.servlet.ServletRequest RequestScope
response javax.servlet.ServletResponse PageScope
pageContext javax.servlet.jsp.PageContext PageScope
session javax.servlet.http.HttpSession SessionScope
application javax.servlet.ServletContext ApplicationScope
out javax.servlet.jsp.JspWriter PageScope
config javax.servlet.ServletConfig PageScope
page java.lang.Object PageScope
exception javax.lang.Throwable PageScope
至於九大內建對象(也叫隱式對象)如何應用,我想我在此無須多說,這方面文章一搜一大片。我想提一下pageContext這個對象。
pageContext這個對象比較特殊,由它的類型可知它是jsp特有的,servlet中沒有此對象。pageContext對象提供了對JSP頁面內所有的對象及名字空間的訪問,也就是說他可以訪問到本頁所在的session,也可以取本頁面所在的 application的某一屬性值,他相當於頁面中所有功能的集大成者。
再說一下EL內建對象:
EL為了方便輸出一些運算式的值,自己也定義了一些內建對象,應用這些內建對象方便的擷取想要輸出的值
JSP EL的內建對象和JSP的內建對象是兩回事,不能互用,即JSP EL內建對象只能在EL中運算式中使用,
JSP的內建對象也只能在JSP中使用而不能在EL中直接用
但是兩種有個對應關係,即EL的內建對象可以調用JSP對應內建對象的儲存資料,從而方便的顯示
JSP EL的內建對象:
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam
可以分為以下三類:
1.與範圍有關的隱含對象
與範圍有關的EL 隱含對象包含以下四個:pageScope、requestScope、sessionScope 和applicationScope;
它們基本上就和JSP的pageContext、request、session和application一樣;
在EL中,這四個隱含對象只能用來取得範圍屬性值,即getAttribute(String name),卻不能取得其他相關資訊。
例如:我們要取得session中儲存一個屬性username的值,可以利用下列方法:
session.getAttribute("username") 取得username的值,
在EL中則使用下列方法
${sessionScope.username}
2.與輸入有關的隱含對象
與輸入有關的隱含對象有兩個:param和paramValues,它們是EL中比較特別的隱含對象。
例如我們要取得使用者的請求參數時,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中則可以使用param和paramValues兩者來取得資料。
${param.name}
${paramValues.name}
3.其他隱含對象
cookie
JSTL並沒有提供設定cookie的動作,
例:要取得cookie中有一個設定名稱為userCountry的值,可以使用${cookie.userCountry}來取得它。
header和headerValues
header 儲存使用者瀏覽器和服務端用來溝通的資料
例:要取得使用者瀏覽器的版本,可以使用${header["User-Agent"]}。
另外在鮮少機會下,有可能同一標題名稱擁有不同的值,此時必須改為使用headerValues 來取得這些值。
initParam
initParam取得設定web網站的環境參數(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}來取得名稱為userid
pageContext
pageContext取得其他有關使用者要求或頁面的詳細資料。
${pageContext.request.queryString} 取得請求的參數字串
${pageContext.request.requestURL} 取得請求的URL,但不包括請求之參數字串
${pageContext.request.contextPath} 服務的web application 的名稱
${pageContext.request.method} 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} 取得使用的協議(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得使用者名稱稱
${pageContext.request.remoteAddr } 取得使用者的IP 位址
${pageContext.session.new} 判斷session 是否為新的
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得主機端的服務資訊
怎麼樣,看了之後恍然大悟了沒(*^__^*) 嘻嘻…… 我想至少也會讓你對內建對象清晰了很多吧~ 這可是俺平生處子博文哦 ~~鼓勵一下吧(*^__^*) 嘻嘻……
=================================================================================
補充一下EL運算式:
一、EL簡介
1).文法結構
${expression}
2).[]與.存取器
EL 提供.和[]兩種存取器來存取資料。
當要存取的屬性名稱中包含一些特殊字元,如.或?等並非字母或數位符號,就一定要使用 []。例如:
${user.My-Name}應當改為${user["My-Name"] }
如果要動態取值時,就可以用[]來做,而.無法做到動態取值。例如:
${sessionScope.user[data]}中data 是一個變數
3).變數
EL存取變數資料的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱為username的變數。
因為我們並沒有指定哪一個範圍的username,所以它會依序從Page、Request、Session、Application範圍尋找。
假如途中找到username,就直接回傳,不再繼續找下去,但是假如全部的範圍都沒有找到時,就回傳null。
屬性範圍在EL中的名稱
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
4).運算子
1.算術運算子有五個:+、-、*或$、/或div、%或mod
2.關係運算子有六個:==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge
3.邏輯運算子有三個:&&或and、||或or、!或not
4.其它運算子有三個:Empty運算子、條件運算子、()運算子
例:${empty param.name}、${A?B:C}、${A*(B+C)}
5) EL函數(functions)
文法:ns:function( arg1, arg2, arg3 …. argN)
其中ns為前置名稱(prefix),它必須和taglib 指令的前置名稱一置
二、EL注意點:
1.
${logininfo.username}
這表明引用logininfo 對象的username 屬性。我們可以通過“.”操作符引
用對象的屬性,也可以用“[]”引用對象屬性,如${logininfo[username]}
與${logininfo.username}達到了同樣的效果。
“[]”引用方式的意義在於,如果屬性名稱中出現了特殊字元,如“.”或者“-”,
此時就必須使用“[]”擷取屬性值以避免文法上的衝突(系統開發時應盡量避免
這一現象的出現)。
與之等同的JSP Script大致如下:
LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到,EL大大節省了編碼量。
這裡引出的另外一個問題就是,EL 將從哪裡找到logininfo 對象,對於
${logininfo.username}這樣的運算式而言,首先會從當前頁面中尋找之前是
否定義了變數logininfo,如果沒有找到則依次到Request、Session、
Application 範圍內尋找,直到找到為止。如果直到最後依然沒有找到匹配的
變數,則返回null.
可以看出:
在EL中得到變數直接用變數名即可,它會自動調用get()方法
如果我們需要指定變數的尋找範圍,可以在EL運算式中指定搜尋範圍:
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
2.
<%@ page isELIgnored="true"%>
表示是否禁用EL語言,TRUE表示禁止.FALSE表示不禁
止.JSP2.0中預設的啟用EL語言.