个人对这部分的内容级别定义为:"看看就行"
EL 表达式
JSP 2.0 的最重要特性就是表达式语言(EL),EL 的目的是帮助程序员编写无脚本的 JSP 页面。
最初 EL 表达式被创造出来是为了 JSTL 服务,配合 JSTL 使用的。不过从 JSP 2.0 开始即便项目中没有引入 JSTL,也可以(单独)使用 EL 。
EL 的默认关闭
在 Servlet 3.0 以下版本中,EL 表达式的功能默认是关闭的。
如何判断你的项目使用的是哪个 Servlet ?可以查看你的 web.xml 配置文件的头部声明。
通常情况下,我们一般不会使用 3.0 以下(甚至是 3.0)版本,最常见的至少是 3.1 版本起。但是,有时我们通过开发工具去自动创建 Web 项目时,很有被创建出来的项目默认的 Servlet 版本会偏低。因为这些工具的模板会偏老旧。
如果因为某些原因,你使用的是低版本的 Servlet,记得要将 EL 表达式的功能打开。
在 JSP 的 page
指令中,通过 isELIgnored
属性可以在当前页面 启用/禁止 EL 表达式。
或者在 web.xml 作出全局性设置:
xml
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>false</el-ignored>
</jsp-property-group>
</jsp-config>
EL 语法
EL 表达式以 ${
开头,并以 }
结束,其结构为 ${ 表达式 }
,其计算结果的类型是一个『字符串』。
EL 表达式的结果值可以是任何类型,但是浏览器会将其值以字符串形式(toString 方法)的形式将其「替换」到 EL 表达式所处位置。
EL 表达式可以返回任意类型的值。如果 EL 表达式的结果是一个带有属性的对象,则可以利用 [ ]
或者 .
运算符来访问该属性。如果是使用 [ ]
,属性名需要用引号括起来。例如:
-
${object["propertyName"]}
-
${object.propertyName}
如果,propertyName 不是一个有效的 Java 变量名,例如:accept-language
,那么,此时只能使用 [ ]
语法,而不能使用 .
语法。
如果,对象的属性碰巧又是另一个对象,那么可以用 [ ]
,也可以使用 .
运算符来访问第二个对象的属性。例如:
-
${pageContext["request"]["servletPath"]}
-
${pageContext.request["servletPath"]}
-
${pageContext.request.servletPath}
-
${pageContext["request"].servletPath}
如果 object 的类型是一个 Map,那么,这里使用的是键值对的键:${object["key"]}
如果 object 的类型是一个 Array 或 List,那么这里使用的是其下标索引:${object[0]}
。这里的下标索引 0
没有使用 ""
,它必须是一个数字。
EL 隐式对象
在 JSP 页面中,可以利用 JSP 脚本来访问 JSP 隐式对象,
注意,在页面上显示 EL 表达式的值时,不需要 out.print()
或者 <%= %>
,容器会执行 EL 表达式并将其结果「写在」它所在的位置。
隐含对象 | 描述 |
---|---|
pageContext | 当前 JSP 页面的 pageContext 对象 |
initParam | Application 的初始化参数,初始化参数通常是在 web.xml 中通过 <context-param> 及其子元素 <param-name> 和 <param-value> 配置项配置 |
param | 一个包含了所有请求参数的 Map,其中请求参数名为 key。不过,它无法处理一个请求参数,多个值的情况。通过 key 始终只有第一个值返回。 |
paramValues | 和 param 类似,不过它可以处理一个参数名有多个参数值的情况。不过,如果参数只有一个值,它的返回值仍然是一个数组 |
applicationScope | 包含了 ServletContext 对象中所有属性的 map,并用属性名作 key。 |
sessionScope | 包含了 HttpSession 对象中所有属性的 Map,并用属性名作 key。 |
requestScope | 包含了 HttpServletRequest 对象中所有属性的Map,并用属性名作key。 |
pageScope | 包含了全页面范围内的属性的 Map,并用属性名作 Key。 |
cookie | 包含了当前请求对象中所有 Cookie 对象的Map。以 Cookie 的名称作为 key,并且每一个 key 都映射到一个 Cookie 对象。 |
header | HTTP 请求信息头,字符串 |
headerValues | HTTP 信息头,字符串数组。对应一个请求名,多个请求值的情况。通过 key 取出的始终是数组。 |
E L表达式所提供的隐式对象中,并没有 request、response、session、application、out 等这些JSP中所存在的隐式对象。这是 EL 隐式对象与 JSP 隐式对象的区别。
不过 EL 的隐式对象中有 pageContext(和 JSP 中一样),通过它我们依旧可以访问到上述这些 JSP 中直接提供,但 EL 中没有直接提供的对象。
EL 表达式中可以使用 + 、- 、*、/、% 五种算数运算符。
EL 表达式中可以使用 &&、||、! 三种逻辑运算符。
EL 表达式中可以使用 ==、!=、>、>=、<、<= 六种关系运算符。
EL 表达式中提供了一个 empty 运算符专门用于 空和非空 的判断(当然,你也可以用 == null 判断)。例如:
java
${empty X}
X 为 null,或者 X 是一个空字符串,或者 X 是一个空数组、空List、空Map、空Set,它都将返回 true 。