1、三元运算符
例:
上面代码意思是如果id等于1,文本框就只读,反之,什么也不做。
2、如何遍历集合bean、Map、List
使用点号(.)操作符访问性质和映射值
第一个变量可以是一个隐式对象,也可以是一个属性,点号右边可以是一个映射键(如果第一个变量)是映射,也可以是一个bean性质(如果第一个变量是Java Bean属性)。
a、 如果表达式中变量后面有一个点号,左边的变量必须是一个映射或一个bean。
点号左边的的变量要么是一个Map(有键),要么是一个bean(有性质)。不论变量是一个隐式对象还是一个属性,都是如此。
pageContext隐式对象是一个bean,它有获取方法,所有其他隐式对象都是Map。
${person.name}
bean
java.util.map
b、 点号右边必须是一个映射键或一个bean性质。
${person.name}
getName()
setName()
java.util.map(“name” , “Evan”)
c、点号右边必须遵循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”)。
a、如果表达式中变量后有一个中括号[],左边的变量则有更多选择,可以是Map、bean、List或数组。
${musicList[“something”]}
数组
java.util.Map
bean
java.util.List
b、如果中括号里有一个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