JSP運算式語言(2)
點運算子和索引運算子都可以用來訪問map。比如,下列兩個EL運算式都會返回名為myKey的鍵對應的值:
但是兩者還是有著一小點區別:如果鍵名中包含能混淆EL的字元,你就不能使用點運算子。例如使用${header["user-agent"]}沒有問題,但${header.user-agent}就出錯了,因為第二個運算式中user和agent之間的破折號被解析為減號。除非有一個變數名為agent,而且header.user和agent都為null,依照EL規範文檔,${null - null}結果為零。而第一個運算式有可能返回零。如果map鍵名中含有點號,你可能會遇到不同但更嚴重的問題。例如,你可以正常地使用${param["my.par"]},而${param.my.par}可能會得到null。這將是嚴重的問題,因為null是一個可能出現的有效結果。我們建議你在所有的場合都使用方括弧的形式,並忘掉這些問題。
和JSP類似,EL也包含隱式對象,如表2-7所示。
表2-7 EL的隱式對象
對象 |
描述 |
pageContext |
JSP頁面上下文。特別是,pageContext. servletContext得到的引用和JSP中隱 式變數application引用指向同一個對象。 同理,pageContext. session等 價於JSP中的session,pageContext. request等價於JSP中的request, pageContext.response等價於 JSP中的response |
param |
把請求參數名稱映射到它的第一個值上 |
paramValues |
把請求參數名稱映射到包含它的值的數組上 |
header |
把要求標頭名稱映射到它的第一個值上 |
headerValues |
把要求標頭名稱映射到包含它的值的數組上 |
cookie |
把cookie名稱映射到唯一的cookie上 |
initParam |
把上下文初始化參數映射到它的值上 |
pageScope |
把page-scoped變數名稱映射到它們的值上 |
requestScope |
把requset-scoped變數名稱映射到它們的值上 |
sessionScope |
把seesion-scoped變數名稱映射到它們的值上 |
applicationScope |
把application-scoped變數名稱映射到它們的值上 |
注意JSP指令碼變數在EL運算式中無效。
你可能已經注意到EL並沒有包含任何聲明變數的方法。在EL運算式中,你可以使用JSTL核心動作c:set(我們將在下一節講述)或者範圍屬性(scoped attributes)設定的變數。例如,下面幾種定義都可以讓你使用EL運算式${xyz}。
然而,你必須對範圍多加註意。c:set設定的變數和pageContext中的屬性是同一個變數。也就是說,c:set定義了一個在page上下文中的屬性。sessionContext中的屬性是與其不同的變數,並且你不能用${xyz}的方式訪問它,因為它"隱藏"在page上下文中同名屬性的後面。要訪問session屬性,你必須在屬性名稱之前加上sessionScope首碼,像${sessionScope.xyz}這樣。如果你不指定範圍,EL會首先在page中尋找屬性,接著是request,然後是session,最後在application範圍。
注意EL運算式不能嵌套。像${expr1[${expr2}]}這樣的運算式是非法的。
你可以把幾個EL運算式和附加文本組合成複合運算式,如下例所示:
但是,你不能混用格式${}和#{}。
轉自:http://book.51cto.com/art/200909/150189.htm