EL表达式简单介绍和使用
EL表达式
为什么需要使用EL表达式
在早期的JSP中,为了实现与用户的动态交互,或者控制页面输出,需要在JSP页面中嵌入大量的java代码。另外在JSP中嵌入Java代码的方式访问JavaBean的属性时,需要调用该属性的getter方法。如果访问的属性时String类型或者其他的基本数据类型,可以比较方便的达到目的。但是如果该属性时另外一个JavaBean的对象,就需要多次调用getter方法,而且有时还需要做强制类型转换。。所以在JSP中嵌入Java代码容易导致结构复杂,使程序可读性差,不易维护。为了解决这些问题,JSP中引入了EL表达式。使用EL表达式后,代码可以进行大大的简化
什么是EL表达式
El表达式的全称是Expression Language,它是一种借鉴了JavaScript和XPath的表达式语言。EL表达式定义了一系列的隐含对象和操作符,使开发人员能够很方便地访问页面的上下文,以及不同作用域内的对象,而无须再JSP页面嵌入Java代码,从而使开发人员即使不熟悉Java也能轻松地编写JSP程序。
El表达式的特点和使用范围
EL表达式提供了在Java代码植物,访问和处理应用程序数据的功能,通常用于在某个作用域(page,request,session,application等)内取得属性值,或者做简单的运算和判断。EL表达式有以下的特点。
(1)自动转换类型。在使用EL得到某个数据时可以自动转换类型,对类型的限制比较宽松。
(2)使用简单。与JSP页面中嵌入的Java代码相比,EL表达式使用起来非常简单。
EL表达式的语法
了解什么是El表达式,以及EL表达式的应用特点和作用,下面具体介绍EL表达式的语法。
语法:
E
l
表
达
式
E
l
表
达
式
的
语
法
有
两
个
要
素
:
{El 表达式} El 表达式的语法有两个要素:
El表达式El表达式的语法有两个要素: 和{},两种缺一不可。
1.点操作符
EL 表达式通常由两部分组成:对象和属性。就像在Java代码中一样,在EL表达式中也可以用点操作符“.”来访问对象的某个属性。例如,通过 e m p l o y e e . c o m p u t e r 可 以 访 问 e m p l o y e e 对 象 的 c o m p u t e r 属 性 , 而 通 过 {employee.computer}可以访问employee对象的computer属性,而通过 employee.computer可以访问employee对象的computer属性,而通过{employee.computer.manufacturer}则可以访问某个雇员所使用的计算机生产厂商。
2.[]操作符
与点操作符类似,“[]”操作符也可以访问对象的某个属性,如
e
m
p
l
o
y
e
e
[
"
c
o
m
p
u
t
e
r
"
]
可
以
访
问
雇
员
的
计
算
机
属
性
。
但
是
,
除
此
之
外
,
“
[
]
”
操
作
符
还
提
供
了
更
加
强
大
的
功
能
。
当
属
性
名
中
包
含
了
特
殊
字
符
如
‘
.
’
或
“
−
”
等
的
情
况
下
,
就
不
能
使
用
点
操
作
符
来
访
问
,
这
时
只
能
用
“
[
]
”
操
作
符
。
访
问
数
组
,
如
果
有
一
个
对
象
名
为
a
r
r
a
y
的
数
组
,
那
么
可
以
根
据
索
引
值
来
访
问
其
中
的
元
素
,
如
{employee["computer"]}可以访问雇员的计算机属性。但是,除此之外,“[]”操作符还提供了更加强大的功能。 当属性名中包含了特殊字符如‘.’或“-”等的情况下,就不能使用点操作符来访问,这时只能用“[]”操作符。 访问数组,如果有一个对象名为array的数组,那么可以根据索引值来访问其中的元素,如
employee["computer"]可以访问雇员的计算机属性。但是,除此之外,“[]”操作符还提供了更加强大的功能。当属性名中包含了特殊字符如‘.’或“−”等的情况下,就不能使用点操作符来访问,这时只能用“[]”操作符。访问数组,如果有一个对象名为array的数组,那么可以根据索引值来访问其中的元素,如{array[0],KaTeX parse error: Expected 'EOF', got '}' at position 9: array[1]}̲等。 ‘[]’操作符中可以…{employee[propertyName]},propertyName是另一个变量,改变其值可以动态访问emloyee的不同属性。
示例:
<body>
<%
Map names=new HashMap();
names.put("one","LiYang");
names.put("two","WangHua");
request.setAttribute("names",names);
%>
姓名:${names.one}
姓名:${names["two"]}
</body>
3.关系操作符
在El表达式中,有六个关系操作符如8-1.
关系操作符 | 说明 | 示例 | 结果 |
---|---|---|---|
== 或 eq | 等于 | 23 = = 5 或 {23==5}或 23==5或{23 eq 5} ${“a”==“a”}或{“a” eq “a”} | false true |
!= 或ne | 不等于 | 23 ! = 5 或 {23!=5}或 23!=5或{23 ne 5} | true |
<或lt | 小于 | 23 < 5 或 {23<5} 或 23<5或{23 lt 5} | false |
>或gt | 大于 | 23 > 5 或 {23>5} 或 23>5或{23 gt 5} | true |
<=或 le | 小于等于 | 23 < = 5 或 {23<=5}或 23<=5或{23 le 5} | false |
>=或ge | 大于等于 | 23 > = 5 或 {23>=5}或 23>=5或{23 ge 5} | true |
4.逻辑操作符
在EL中有三个逻辑操作符,如表
逻辑操作符 | 说明 | 示例 | 结果 |
---|---|---|---|
&&或and | 逻辑与 | 如果A为true,B为false,则KaTeX parse error: Expected '}', got '&' at position 3: {A&̲&B} 或{A and B} | false |
或or | 逻辑或 | 如果A为true,B为false 则 A B 或 {A B} 或 AB或{A or B} | true |
! 或 not | 逻辑非 | 如果A为true,则 ! A 或 {!A} 或 !A或{not A} | false |
5.Empty操作符
Empty操作符是一个前缀操作符,用于检测一个变量值是否为null 或者为empty(如长度为0的字符串变量或集合变量)。例如,变量a不存在,则 e m p t y a 返 回 的 结 果 为 t r u e , {empty a}返回的结果为true, emptya返回的结果为true,{not empty a}或${! empty a}返回的结果为false。
表达式隐式对象
JSP提供了page,requset,session,application,pageContext等若干隐式对象。这些隐式对象无须声明,就可以很方便地在JSP页面中使用。相应地,在EL表达式语言也提供了一系列可以直接使用的隐式对象。EL隐式对象按照使用途径的不同分为作用域访问对象,参数访问对象和JSP隐式对象。
1.作用域访问对象
开发Java Web应用时,可以把变量存放在不同作用域中以满足不同范围的访问需求,作用域共有四个选项:page requset session application。在EL表达式中为了访问这四个作用域内的变量和属性,提供了四个作用域访问对象。
对象名称 | 说明 |
---|---|
pageScope | 与页面作用域(page)中的属性相关联的Map类 |
requsetScope | 与请求作用域(requset)中的属性相关联的Map类 |
sessionScope | 与会话作用域(session)中的属性相关联的Map类 |
applicationScope | 与应用程序作用域(application)中的属性相关联的Map类 |
当使用El表达式访问某个变量时,应该指定查找的范围,如 r e q u s e t S c o p e . e m p l o y e e 即 在 请 求 作 用 域 范 围 内 查 找 e m p l o y e e 变 量 。 如 果 不 指 定 查 找 范 围 , 即 {requsetScope.employee}即在请求作用域范围内查找employee变量。如果不指定查找范围,即 requsetScope.employee即在请求作用域范围内查找employee变量。如果不指定查找范围,即{employee},则会按照page-requset-session-application的顺序依次查找employee变量。
2.参数访问对象
参数访问对象是与页面输入参数有关的隐式对象,通过它们可以得到用户的请求参数。参数访问对象的内容如下。
对象名称 | 说明 |
---|---|
param | 按照参数名访问单一请求值的Map对象 |
paramValues | 按照参数名称访问数组请求值的Map对象 |
两者之间的不同之处在于,param对象用于得到请求中单一名称的参数,而paramValues对象用于得到请求中的多个值。例如,在用户注册时,通常只填写一个名为userName的参数,那么就可以用 p a r a m . u s e r N a m e 来 访 问 此 参 数 , 等 同 于 调 用 R e q u e s t . g e t P a r a m t e r ( " u s e r n a m e " ) ; 而 在 用 户 注 册 时 , 也 可 以 选 择 多 个 业 余 爱 好 , 这 样 通 过 {param.userName}来访问此参数,等同于调用Request.getParamter("username");而在用户注册时,也可以选择多个业余爱好,这样通过 param.userName来访问此参数,等同于调用Request.getParamter("username");而在用户注册时,也可以选择多个业余爱好,这样通过{paramValues.habits}可以得到用户选择的值,等同于调用request.getParamterValues(“habits”)。
3.JSP隐式对象
为了能够方便访问JSP隐式对象,EL表达式语言引入了pageContext,如下,它是JSP和EL的一个公共对象,通过pageContext可以访问其它八个JSP内置对象(request,response等),这也是EL表达式语言把它作为内置对象的一个主要原因。
JSP隐式对象
对象名称 | 说明 |
---|---|
pageContext | 提供对页面信息和JSP内置对象的访问,语法如${pageContext.requset.contextPath} |