11_EL 表达式语言

每篇一句:宇宙就是一座黑暗森林,每个文明都是带枪的猎人,像幽灵般潜行于林间,轻轻拨开挡路的树枝,竭力不让脚步发出一点儿声音,连呼吸都小心翼翼······  ——《三体 II :黑暗森林》

EL 简介

EL 表达式总是放在大括号里,而且前面有一个美元符前缀

${person.name}

表达式中第一个命名变量可以是一个隐式对象,也可以是一个属性。

点号操作符

点号 (.) 操作符允许使用一个 Map 键或一个 bean 性质名来访问值

例如:

${ person.name }

点号左边是一个 Map 或一个 bean,右边是一个 Map 键或一个 bean 性质

PageContext 隐式对象是一个 bean,它有获取方法,所有其他隐式对象都是 Map

如果对象是一个 bean,但是指定的性质不存在,会抛出一个异常

[] 操作符

概述

实例:

${ person["name"] }

左边可能是一个 Map 或一个 bean,还可以是一个 List 或数组。而右边就可以是一个 Map 键,或是一个 bean 性质,还可以是 List 或数组中的索引

详细

1.数组或 List 中的 String 索引会强制转换为一个 int

${ favotiteFood[0] }

${ favotiteFood["0"] }

String 索引会强制转换为 int,如果索引无法转换,就会得到一个错误

2.如果不是 String 直接量,容器会计算中括号中的内容,搜索与该名字绑定的属性,并替换为这个属性的值
如果在 servlet 这样设置

request.setAttribute("Genre", "Ambient")

则在 JSP 中会计算为

${ musicMap[Genre] } -->  ${ musicMap["Ambient"]

3.而如果确定放在引号里,且不是一个数组或 List 中的索引,容器会把看作是性质或键的直接量名

${ musicMap["Ambient"] } -->  ${ musicMap["Ambient"]

4.在中括号里可以使用嵌套表达式

${ musicMap[MusicType[0]] } --->  ${ musicMap["Ambient"] }

EL隐式对象

11 个隐式对象如下:

  • pageScope
  • requestScope
  • sessionScope
  • applicationScope
  • param
  • paramValues
  • header
  • headerValues
  • cookie
  • initParam
  • pageContext

在所有隐式对象中,只有 pageContext 不是映射,这是 pageContext 对象的实际引用

EL 的请求参数

如果对应特定的参数名只有一个参数,就可以用 param 隐式对象。如果有多个参数名,就要使用 paramValues

${ param.name }

${ paramValues.food[0]

host 头部

${ header["host"]
${ header.host }

header 隐式对象保存了所有首部的一个 Map。使用任意一个访问操作符,传入首部名,可打印首部的值

得到 HTTP 请求方法

${ pageContext.request.method }

pageContext 有一个 request 性质,而 request 有一个 method 性质

requestScope

隐式的 requestScope 只是请求作用域属性的一个 Map,而不是 request 对象本身

如果有命名冲突,使用作用域隐式对象域则可以避免

${ requestScope["foo.Person"].name }

打印 “userName” Cookie 的值

${ cookie.userName.value }

使用 cookie 隐式对象只需提供名,就会从 Cookie/值对的 Map 返回相应的值

打印一个上下文初始化参数的值

${ initParam.mainEmail }

EL 隐式对象 “initParam” 对应的是上下文参数

EL 函数

函数名. TLD 和 JSP
11_EL 表达式语言_第1张图片


其中,有函数的类必须是公共的,而且是一个静态方法

标记库描述文件中, TLD 提供了定义函数的 Java 类与调用函数的 JSP 之间的一个映射

在 JSP 中 taglib 指令中 prefix 指定了一个前缀,uri 告诉容器 TLD 的名字

EL 操作符

算术操作符

法则 符号
加法 +
减法 -
乘法 *
除法 / 和 div
取模 % 和 mod

注意:在 EL 中是可以除 0 的,将得到 INFINITY,而不是错误。但是不能对 0 使用取模操作符,否则会得到一个异常

逻辑操作符

法则 符号
&& 和 and
|| 和 or
! 和 not

关系操作符

法则 符号
等于 == 和 eq
不等于 != 和 ne
小于 < 和 It
大于 > 和 gt
小于等于 <= 和 le
大于等于 >= 和 ge

EL 还能处理 unknown 或 null 值,在算术表达式中,EL 把 null 值看作是 “0”。在逻辑表达式中,EL 把 null 看作是 “false”

写在最后

如果有任何问题或建议,欢迎交流学习。

你可能感兴趣的:(JavaWeb)