EL中的运算符
EL表达式支持简单的运算,例如,加(+)、减(-)、乘(*)、除(/)等。为此,在EL中提供了多种运算符,根据运算方式的不同,EL中的运算符包括以下几种:
1、点运算符(.)
EL表达式中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象、List对象、Array对象等,其语法格式如下:
${customer.name}
在上述语法格式中,表达式${customer.name}中点运算符的作用就是访问customer对象中的name属性。
2、方括号运算符([])
EL表达式中的方括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”或“?”等并非字母或数字的符号,就只能使用方括号运算符来访问该属性,其语法格式如下:
${user["My-Name"]}
需要注意的是,在访问对象的属性时,通常情况都会使用点运算符作为简单的写法,但实际上,方括号运算符比点运算符应用更加广泛。接下来就对比一下这两种运算符在实际开发中的应用,具体如下:
● 点运算符和方括号运算符在某种情况下可以互换,如${student.name}等价于${student["name"]}。
● 方括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].userName}可以访问集合或
数组中的第一个元素的userName属性。
● 方括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}用于访问集合或数组中第一个元素。在这种情况下,只能使用方括号运算符,而不能使用点运算符。
3、算术运算符
EL表达式中的算术运算符用于对整数和浮点数的值进行算术运算。使用这些算术运算符可以非常方便地在JSP页面进行算术运算,并且可以简化页面的代码量。接下来通过表1来列举EL表达式中所有的算术运算符。
表1 算术运算符
算术运算符 | 说明 | 算术表达式 | 结果 |
---|---|---|---|
+ | 加 | ${10+2} | 12 |
- | 减 | ${10-2} | 8 |
* | 乘 | ${10*2} | 20 |
/(或div) | 除 | ${10/4}或${10 div 2} | 2.5 |
%(或mod) | 去模(取余) | ${10%4}或${10 mod 2} | 2 |
表1中,列举了EL表达式中所有的算术运算符,这些运算符相对来说比较简单。在使用这些运算符时需要注意两个问题,“-”运算符即可以作为减号,也可以作为负号,“/”或“div”运算符在进行除法运算时,商为小数。
4、比较运算符
EL表达式中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的运算符执行的结果都是布尔类型。接下来通过表2来列举EL表达式中所有的比较运算术符。
表2 比较运算符
比较运算符 | 说明 | 算术表达式 | 结果 |
---|---|---|---|
==(或eq) | 等于 | ${10==2}或${10 eq 2} | false |
!=(或ne) | 不等于 | ${10!=2}或${10 ne 2} | true |
<(或lt) | 小于 | ${10<2}或${10 lt 2} | false |
>(或gt) | 大于 | ${10>2}或${10 gt 2} | true |
<=(或le) | 小于等于 | ${10<=2}或${10 le 2} | false |
>=(或ge) | 大于等于 | ${10>=2}或${10 ge 2} | true |
表2中,列举了EL表达式中所有的比较运算符,在使用这些运算符时需要注意两个问题,具体如下:
● 比较运算符中的“==”是两个等号,千万不可只写一个等号。
● 为了避免与JSP页面的标签产生冲突,对于后四种比较运算符,EL表达式中通常使用括号内的表示方式,例如使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如${1lt 2},但后面如果有其它符号时则可以不加空格,例如${1lt(1+1)}。
5、逻辑运算符
EL表达式中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。接下来通过表3来列举EL表达式中所有的逻辑运算术符。
表3 逻辑运算符
逻辑运算符 | 说明 | 算术表达式 | 结果 |
---|---|---|---|
&&(and) | 逻辑与 | ${true&&false}或${true and false} | false |
||(or) | 逻辑或 | ${false||true}或${false or true} | true |
!(not) | 逻辑非 | ${!true}或${not true} | false |
表3中,列出了EL表达式中的3种逻辑运算符,需要注意的是,在使用&&运算符时,如果有一个表达式结果为false,则结果必为false,在使用||运算符时,如果有一个表达式的结果为true,则结果必为true。
6、empty运算符
EL表达式中的empty运算符用于判断某个对象是否为null或””,结果为布尔类型,其基本的语法格式如下所示:
${empty var}
需要注意的是,empty运算符可以判定变量(或表达式)是否为null或””。例如下列情况empty运算符的返回值为true:
1)var变量不存在,即没有定义,例如表达式${empty name},如果不存在name变量,就返回true。
2)var变量的值为null,例如表达式${empty customer.name},如果customer.name的值为null,就返回true。
3)var变量引用集合(Set、Map和List)类型对象,并且在集合对象中不包含任何元素。
7、条件运算符
EL表达式中条件运算符用于执行某种条件判断,它类似于Java语言中的if-else语句,其语法格式如下:
${A?B:C}
在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B并返回B的值;如果表达式A的计算结果为false,就执行表达式C并返回C的值,例如表达式${(1==2)?3:4}的结果就为4。
8、“( )”运算符
EL表达式中的圆括号用于改变其它运算符的优先级,例如表达式${ab+c},正常情况下会先计算ab的积,然后再将计算的结果与c相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为${a*(b+c)},这样则先计算b与c的和,再将计算的结果与a相乘。
需要注意的是,EL表达式中的运算符都有不同的运算优先级,当EL表达式中包含了多种运算符时,它们必须按照各自优先级的大小来进行运算。接下来,通过表4来描述这些运算符的优先级。
表4 运算符的优先级
优先级 | 运算符 |
---|---|
1 | [] . |
2 | () |
3 | -(unary) not ! empty |
4 | * / div % mod |
5 | + -(binary) |
6 | < > <= >= lt gt le ge |
7 | == != eq ne |
8 | && and |
9 | || or |
10 | ?: |
表4列举了不同运算符各自的优先级大小。对于初学者来说,这些运算符的优先级不必刻意的去记忆。为了防止产生歧义,建议大家尽量使“()”运算符来实现想要的运算顺序。
注意:
在应用EL表达式取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。