点运算符和索引运算符都可以用来访问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