第七章 表达式语言
内容关键词:表达式,语言,运算
授课老师:张森鹏
一、知识笔记
JSP 2.0 最重要的特性之一就是表达式语言(EL),JSP 用户可以用它来访问应用程序数据。
由于受到 ECMAScript 和 XPath 表达式语言的启发,EL 也设计成可以轻松地编写免脚本的 JSP页面。
表达式语言的重要性
JSP 2.0 最初是将 EL 应用在 JSP 标准标签库(JSTL)1.0 规范中。JSP 1.2 程序员将标准
库导入到他们的应用程序中,就可以使用 EL。JSP 2.0 及其更高版本的用户即使没有 JSTL,
也能使用 EL,但在许多应用程序中,还是需要 JSTL 的,因为它里面还包含了与 EL 无关的
其他标签。
语法
EL 表达式以 ${ 开头,并以 } 结束。EL 表达式的结构如下:
${expression}
#{expression}
例如,表达式 x+y,可以写成:
${x+y}
或
#{x+y}
$ {exp}和#{exp}结构都由 EL 引擎以相同的方式进行计算。然而,当 EL 未被用作独立引
擎而是使用诸如 JSF 或 JSP 的底层技术时,该技术可以不同地解释构造。
关键字
和其他语言一样,关键字一样不能作为标识符
以下是关键字
and eq gt true instanceof
or ne le false empty
not lt ge null div mod
运算符
EL表达式可以返回任意类型的值。如果EL表达式的结果是一个带有属性的对象,则可以利
用[ ]或者.运算符来访问该属性。[ ]和.运算符类似;[ ]是比较规范的形式,.运算符则比较快捷。
为了访问对象的属性,可以使用以下任意一种形式:
${object["propertyName"]}
${object.propertyName}
但是,如果 propertyName 不是有效的 Java 变量名,只能使用[ ]运算符。例如,下面这两
个 EL 表达式就可以用来访问隐式对象标题中的 HTTP 标题 host:
${header["host"]}
${header.host}
取值规则
取值方法如下:
(1)先计算 expr-a 得到 value-a。
(2)如果 value-a 为 null,则返回 null。
(3)然后计算 expr-b 得到 value-b。
(4)如果 value-b 为 null,则返回 null。
(5)如果 value-a 为 java.util.Map,则会查看 value-b 是否为 Map 中的一个 key。若是,则
返回 value-a.get(value-b),若不是,则返回 null。
(6)如果 value-a 为 java.util.List,或者假如它是一个 array,则要进行以下处理:
a.强制 value-b 为 int,如果强制失败,则抛出异常。
b.如果 value-a.get(value-b)抛出 IndexOutOfBoundsException,或者假如 Array.get
(value-a, value-b)抛出 ArrayIndexOutOfBoundsException,则返回 null。
c.否则,若 value-a 是个 List,则返回 value-a.get(value-b);若 value-a 是个 array,
则返回 Array.get(value-a, value-b)。
(7)如果 value-a 不是一个 Map、List 或者 array,那么,value-a 必须是一个 JavaBean。
在这种情况下,必须强制 value-b 为 String。如果 value-b 是 value-a 的一个可读属性,则要调
用该属性的 getter 方法,从中返回值。如果 getter 方法抛出异常,该表达式就是无效的,否则,
该表达式有效。
二、重要记录
1、对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为 String,并且连接在一起。
2、如果对象的属性碰巧返回带有属性的另一个对象,既可以用[ ],也可以用. 运算符来访问第二个对象的属性。
3、利用隐式对象 paramValues 可以获取一个请求参数的多个值。这个对象表示一个包含所有请求参数,并以参数名称作为 key 的 Map。
4、隐式对象 header 表示一个包含所有请求标题的 Map。为了获取 header 值,要利用 header名称作为 key。
5、与 head 不同的是,隐式对象 headerValues 返回的 Map 返回的是一个字符串数组。
参考资料:《Spring MVC学习指南》