JavaWeb高级编程(上) (6)

EL语法是弱类型,并且它包含许多内建的隐式类型转换。表达式主要的规则是执行后要产生某个值。不能在表达式中声明变量、执行赋值语句或者不产生结果的操作。

EL中的保留关键字:

true、false、null、instanceof、empty、div、mod、and、or、not、eq、ne、lt、gt、le、ge

举例:
关键字empty用于验证某些集合、Map或者数组是否含有值,或者某些字符串是否含有一个或多个字符。

${empty x}

eq、ne、lt、gt、le和ge运算符分别是Java关系运算符==,!=,<,>,<=和>=,当然你仍然可以使用传统的关系运算符。

EL表达式中第一个执行的操作符是括号[]和点(.)解析操作符。如:

${mycollection["key"].memberName["anotherKey"]}

引擎首先将解析对象myCollection中映射到key的值。然后在该值中解析memberName方法、字段或者属性。最后在该方法、字段或者属性中再解析anotherKey所对应的值。在这些操作符都执行之后,下面开始解析分组圆括号操作符()。
EL引擎执行的最后一个操作符是分号(;)。该操作看上去与C中的逗号(,)相像,它允许在表达式中同时使用多个表达式,但只有最后一个表达式的值会被保留下来。如:

${x = y + 3; obj.callMethod(x); 'hello, world'}

该表达式最后执行字符串字面量"hello, world"。该表达式的最终结果是最后一个分号之后的表达式"hello, world"。
EL中字符串字面量既可以使用双引号也可以使用单引号。
在EL表达式中,只允许使用十进制字面量,对于其他类型的字面量,EL表达式中没有对应的用法。
无论何时需要,都可以直接在EL表达式中创建集合。
字面量集合中的元素以逗号分隔开。

{1,2,'three',4.00,x}

其中x可以是任何数据类型。
构造列表的方法与构造集合的方法基本一致,区别在于列表使用的是方括号,而集合使用的是花括号。

[1,2,'three',[x,y],{'foo','bar'}]

列表中的元素将以逗号分隔。
HashMap<Object,Object>集合字面量:

{'one':1,2:'two','key':x,'list':[1,2,3]}

EL除了使用公共访问方法访问属性的标准语法,还提供了访问JavaBean中属性的简化语法。假设现在有一个名为Shirt的类,它包含一个公开字段size。现有一个名为shirt的变量,使用EL访问size字段:

${shirt.size}

当使用这种方法时,EL引擎看到该语法,它将寻找shirt中的属性而不是字段。所以需要对Shirt类进行修改,使用标准JavaBean访问和设置方法getSize和setSize将size封装为私有字段。表达式shirt.size就变成了shirt.getSize()的快捷方式。
还可以使用[]操作符访问属性:

${shirt["size"]}

在EL早期版本,只可以访问JavaBean属性,不可以调用对象方法,不过在EL2.1添加了在JSP中调用对象方法的能力。因此,可以通过${shirt.getSize()}访问Shirt的size属性。
在EL中,函数是映射到类中静态方法的一个特殊工具。函数调用的语法如下所示:[ns]是命名空间,[fn]是函数名,从[a1]到[an]都是参数

${[ns]:[fn]([a1[,a2[,a3[,...]]]])}

JSTL函数库的命名空间为fn;不过也可以在taglib指令中使用任何其他命名空间。

与Java访问静态字段和方法的方式相同:在EL中使用完全限定的类名,接着是点操作符,再接着是字段或者方法名。如:

${java.lang.Integer.MAX_VALUE}

除非使用的类已经使用JSP page指令导入,否则必须使用完全限定的类型。在JSP中,如同Java一样,所有在java.lang包中的类都已经被隐式地导入。
在大多数情况下,lambda表达式是一个参数名字的列表,紧接着是某种类型的操作符,最后是函数体。EL中的lambda表达式语法几乎与Java8中的一样。
EL的lambda表达式体中包含的则是另一个EL表达式。
访问Map值的方式:

${map["username"]} ${map.username}

列表访问方式:

${list[0]} ${list{'0'}}

empty操作符使用:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxgps.html