- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
8.2 表达式语言的语法
EL 表达式以 ${ 开头,并以 } 结束。EL 表达式的结构如下:
${expression}
#{expression}例如,表达式 x+y,可以写成:
${x+y}或
#{x+y}$ {exp}和#{exp}结构都由 EL 引擎以相同的方式进行计算。然而,当 EL 未被用作独立引擎而是使用诸如 JSF 或 JSP 的底层技术时,该技术可以不同地解释构造。例如,在 JSF 中,${exp}结构用于立即计算,#{expr}结构用于延迟计算(即表达式直到系统需要它的值时,才进行计算)。另一方面,立即计算的表达式,会在 JSP 页面编译时同时编译,并在执行 JSP 页面时被执行。在 JSP 2.1 和更高版本中,#{exp}表达式只能在接受延迟表达式的标签属性中使用。
两个表达式可以连接在一起。对于一系列的表达式,它们的取值将是从左到右进行,计算结果的类型为 String,并且连接在一起。假如a+b等于 8,c+d等于 10,那么这两个表达式的计算结果将是 810:
${a+b}${c+d}表达式${a+b}and${c+d}的取值结果则是 8and10。
如果在定制标签的属性值中使用 EL 表达式,那么该表达式的取值结果字符串将会强制变成该属性需要的类型:
< my:tag someAttribute="${expression}"/>像${这样的字符顺序就表示是一个 EL 表达式的开头。如果需要的只是文本${,则需要在它前面加一个转义符,如\${。
8.2.1 关键字
以下是关键字,它们不能用作标识符:
and eq gt true instanceof or ne le false empty not lt ge null div mod8.2.2 [ ]和.运算符
EL 表达式可以返回任意类型的值。如果 EL 表达式的结果是一个带有属性的对象,则可以利用[ ]或者.运算符来访问该属性。[ ]和.运算符类似;[ ]是比较规范的形式,.运算符则比较快捷。
为了访问对象的属性,可以使用以下任意一种形式:
${object["propertyName"]}
${object.propertyName}但是,如果 propertyName 不是有效的 Java 变量名,只能使用[ ]运算符。例如,下面这两个 EL 表达式就可以用来访问隐式对象标题中的 HTTP 标题 host:
${header["host"]}
${header.host}但是,要想访问 accept-language 标题,只能使用[ ]运算符,因为 accept-language 不是一个合法的 Java 变量名。如果用. 运算符访问它,将会导致异常。
如果对象的属性碰巧返回带有属性的另一个对象,既可以用[ ],也可以用. 运算符来访问第二个对象的属性。例如,隐式对象 pageContext 是表示当前 JSP 的 PageContext 对象。它有 request 属性,表示 HttpServletRequest。HttpServletRequest 带有 servletPath 属性。那么,下列几个表达式的结果相同,均能得出 pageContext 中 HttpServletRequest 的 servletPath 属性值:
${pageContext["request"]["servletPath"]}
${pageContext.request["servletPath"]}
${pageContext.request.servletPath}
${pageContext["request"].servletPath}要访问 HttpSession,可以使用以下语法:
${pageContext.session}例如,以下表达式会得出 session 标识符。
${pageContext.session.id}8.2.3 取值规则
EL 表达式的取值是从左到右进行的。对于 expr-a[expr-b]形式的表达式,其 EL 表达式的取值方法如下:
(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 方法抛出异常,该表达式就是无效的,否则,该表达式有效。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论