EL全名是Expression Language,主要是用于:
- 获取数据
- 执行运算
- 获取Web开发中的隐含对象
- 调用Java方法
语法:
${Expression}
这里的Expression其实就是setAttribute里面的name,这样就获取到对应的值
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符Expression为关键字,分别从pageScope、requestScope、sessionScope、applicationScope四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” 空串(注意,不是null,而是空字符串)。
例如:
<%
request.setAttribute("name", "hello");
%>
--${name }--<br>
--${pageScope.name }--<br>
--${requestScope.name }--
得到的结果如下:
--hello--
----
--hello--
因此,如果不指定查找域的话,就会按顺序在各个域中找,如果指定了域,就只在该域中找
获取数据:
类型 | 示例 | 对应的调用方法 |
JavaBeans | ${ user.username } | user.getUsername() |
${ user[“username”] } | ||
${ user[ ‘username’] } | ||
数组 | ${ sport[1] } | sport[1] |
${ sport[‘1’] } | ||
${ sport[“1”] } | ||
List | ${ address[2] } | address.get(2) |
${ address[‘2’] } | ||
${ address[‘2’] } | ||
Map | ${ phone[“home”] } | phone.get(“home”) |
${ phone[‘home’] } | ||
${ phone.home } |
注意:如果通过setAttribute存储的是map类型的数据,则通过el表达式获取数据的时候,先获取的是Entry。比如:
<%
Map<String,Customer> map1 = new HashMap<String,Customer>();
map1.put("m1", customer1);
map1.put("m2", customer2);
request.setAttribute("map", map1);
%>
${map["m1"].name}/${map["m2"].age}
Map类型对象map1传入了两个键值对,到调用${map}的时候会返回两个Entry,如果想要获取entry中的值,就需要传入键才能得到值,然后得到customer对象。
而这里的map["m1"].name就是调用customer的getName方法,由此可以看出这里使用了反射机制.
执行运算:
empty运算符:${empty expression},会调用findAttribute方法去找,如果有这个属性的对象就返回false,如果没找到或者说它是一个数组对象,但是却没有数据,就返回true
获取web开发中的隐含对象
(待续)
总结:
el表达式主要是方便获取,无论是数据还是对象,而且里面都使用了反射机制。
如果是要获取数据,就先setAttribute
如果是要获取隐含对象,直接调用${隐含对象名称},例如:${param.name},就是获取了一个map对象,里面有请求参数的数据,然后调用getAttribute,将name作为参数传入,获取该参数对应的值