EL表达式

canca14年前 (2010-11-22)JavaServer Page284

没有脚本的JSP代码,使用EL

<html><body>

Dog’s name is:${person.dog.name}

</body></html>

                     就这么简单!我们甚至没有声明person是什么意思……它自己已经知道。

用这个代码:${person.dog.name}

替代以下代码:

<%= ((foo.person) request.getAttribute(“person”)).getDog().getName() %>

 

 

JSP表达式(EL)解析

表达式语言的语法相当简单,变化也不太大。难的是,有些EL看上去很像Java,但表现却不同。所以你可能会发现,有些在Java中能用的倒了EL 中却不行,反之亦然。所以不要想着把Java语言/语法规则硬往EL上套,明确这一点就行了。可以把EL想成是不使用Java来访问Java对象的一种方 法。

 

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

${person.name}

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

${firstThing.secondThing}

如果EL表达式中第一项是一个属性,可以是存储在任意一个可用作用域中的属性。
 
 

EL隐式对象  或  属性

pageScope

requestScope

sessionScope

applicationScope

 

param

所有这些都是映射对象
 
paramValues

 

header

headerValues

 

cookie

 

initParam

注意:EL隐式对象与JSP脚本中可用的隐式对象不同,只有pageContext除外
 
pageContext

 

页面作用域中的属性

请求作用域中的属性

会话作用域中的属性

应用作用域中的属性

 

在所有隐式对象中,只有pageContext不是映射。这是pageContext对象的实际引用!(pageContext是一个Java Bean)
 
 

 


使用点号(.)操作符访问性质和映射值

 

第一个变量可以是一个隐式对象,也可以是一个属性,点号右边可以是一个映射键(如果第一个变量)是映射,也可以是一个bean性质(如果第一个变量是Java Bean属性)。

 

1.        如果表达式中变量后面有一个点号,左边的变量必须是一个映射或一个bean。

点号左边的的变量要么是一个Map(有键),要么是一个bean(有性质)。不论变量是一个隐式对象还是一个属性,都是如此。

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

 
${person.name}

bean
java.util.map
 
 

2.   点号右边必须是一个映射键或一个bean性质。

${person.name}

getName()
setName()
java.util.map(“name” , “Evan”)
 

3.        点号右边必须遵循Java有关标识符的命名规则。

?         必须以字母,_或$开头。

?         第一个字母后面可以有数字。

?         不能是Java关键字。
 
 

 

[ ]就像是更好的点号

只有当点号右边是左边的一个bean性质或映射键时,点号操作符才能工作。仅此而已,但[]操作符就强大多了,而且更加灵活……

 

以下代码:

${person[“name”]}

与下面的代码等价:

${person.name}

 

简单的点号操作符之所以能工作,是因为person是一个bean,而且name是person的一个性质。

但如果person是一个数组呢?或者如果person是一个List呢?再或者,name不遵循正常的Java命名规则怎么办?

[ ]让你有更多选择……

使用点号操作符时,左边只能是一个Map或一个bean,右边必须遵循 Java关于标识符的命名规则。但是使用[]时,左边可以是一个List或数组(可以是任何类型的数组)。这也说明,右边可以是一个数,或者可以解析为一 个数,也可以是不遵循Java命名规则的标识符。例如,Map键可以是一个包含点号的String(“com.foo.trouble”)。

 

1. 如果表达式中变量后有一个中括号[],左边的变量则有更多选择,可以是Map、bean、List或数组。

 

${musicList[“something”]}

数组 
java.util.Map
bean
java.util.List

 

2.  如果中括号里有一个String直接量(即用引号引起的串),这可以是一个Map键,或是一个bean性质,还可以是List或数组中的索引。

 

${musicList[“something”]}

数组

1:“Zero 7”,2:”BT”
java.util.Map
(“surf”,”tahirt 80”)
getSongList()

setSongList()
java.util.List

(1:“Zero 7”,2:”BT”)
 
 

数组和List中的String索引会强制转换为int

访问数组的EL与访问List的EL是一样的。

大家要记住,这不是Java。在EL中,[]操作符并不是数组的访问操作符。不是这样的,它只是叫做[]操作符。如果实在要给它一个名字,就应该是“数组/List/Map/bean性质访问操作符

 

如果中括号左边是一个数组或List,而且索引是一个String直接量,那么这个索引会强制转换为int。

下面这样不行:

${favoriteFood[“one”]}

因为”one”不能转换为一个int。如果索引无法强制转换,你就会得到一个错误。

 

如果不是String直接量,就会计算

如果中括号里没有引号,容器就会计算中括号中的内容,搜索与该名字绑定的属性,并替换为这个属性的值(如果有一个同名的隐式对象,则始终使用隐式对象)。

Music is: ${musicMap[Ambient]}

查找一个名为“Ambient”的属性。

使用这个属性的值作为Map的键,或者返回null。

 

Servlet中:

java.util.Map muicMap = new java.util.HashMap();

muicMap.put(“Ambient”,”Zero 7”);

muicMap.put(“Surf”,”Tahiti 80”);

muicMap.put(“DJ”,”BT”);

muicMap.put(“Indie”,”Frou Frou”);

 

request.setAttribute(“musicMap”,musicMap);

request.setAttribute(“Genre”,” Ambient”);

 

在JSP中这是可以的:

Music is: ${musicMap[Genre]}      计算为    Music is: ${musicMap[” Ambient”]}

 

由于有一个名为” Genre”的请求属性,它的值为” Ambient”,而且” Ambient”是musicMap的一个键。

 

在JSP中,下面这样是不行的:

Music is: ${musicMap[“Genre”]}       不变     Music is: ${musicMap[“Genre”]]}

因为musicMap中没有名为“Genre”的键。由于加了引号,容器不会进行计算,而只认为只是一个直接量键名。

 

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

El中都是表达式。可以任意做嵌套表达式,深度不限。换句话说,可以把一个复杂的表达式放在另一个表达式中,而后者可以再放在一个表达式中……(如此继续)。表达式会从最内层中括号开始计算。

这一部分对你来说相当直观,因为这与小括号里嵌套Java代码没有什么不同。麻烦的是,要当心加不加引号。

 

Servlet中:

java.util.Map muicMap = new java.util.HashMap();

muicMap.put(“Ambient”,”Zero 7”);

muicMap.put(“Surf”,”Tahiti 80”);

muicMap.put(“DJ”,”BT”);

muicMap.put(“Indie”,”Frou Frou”);

request.setAttribute(“musicMap”,musicMap);

 

String[] musicTypes = {“Ambient”,” Surf”,” DJ”,” Indie”};

request.setAttribute(“MusicType”,musicTypes);

 

JSP中这样是可以的:

Music is ${musicMap[MusicType[0]]}

              变成:Music is ${ musicMap [“Ambient”]}         

              变成:Music is Zero 7

相关文章

JBoss,Tomcat 中文URL支持方法

JBOSS 找到jboss4的deploy\jbossweb-tomcat50.sar\server.xml,编辑该文件,在下面的XML节点中增加红色的字<Connector port="808...

在web.xml不认<taglib>解决办法

在web.xml不认<taglib>解决办法: 如果是头是这样的<!DOCTYPE web-app PUBLIC "-//Sun Micros...

<html:select>设置默认值

在ActionFrom的reset方法里赋初值就可以,这样不管是调用的action或jsp都会先调用reset方法。...

struts,ajax乱码解决方案

乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UT...

浏览网页时的错误代号

① 客户方错误    100  继续    101  交换协议  ② 成功   ...

FCKeditor的秘密

       哈哈。。由于项目的需要,这几天一直在搞FCKeditor。其实,FCKeditor配置很简单。但不知道怎么样。在我的项目里FC...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。