EL,Expression Language,是表达式语言。
使用jsp页面虽然能进行数据输出,但过于麻烦,而使用EL表达式在输出数据时会更简洁。
简单举个例子,如果在jsp页面内设置属性:
<%
request.setAttribute("key", "111");
%>
那么使用表达式脚本获取key的值应该是:
表达式脚本:<%=request.getAttribute("key")%>
而使用EL表达式:
${key}
浏览器上的效果:
注意,如果输出一个不存在的值,那么jsp表达式会输出null,而EL表达式输出空串。
EL表达式主要是在jsp页面上输出数据
EL表达式搜索四个域的顺序:
<%
session.setAttribute("key", "session");
application.setAttribute("key", "app");
request.setAttribute("key", "request");
pageContext.setAttribute("key", "page");
%>
${key}
浏览器会输出page,将pageContext注释后输出request,将request注释后,输出session,将session注释后仍然输出session,这是因为只要不关闭页面,session就会一直保存。如果把浏览器关闭后重新打开,就输出app了。
也就是说,EL表达式的搜索顺序是:pageContext、request、session、application。
EL输出Bean对象
假设我们有这么一个类Person,成员有:
private String name;
private String[] phones;
private List<String> cities;
private Map<String, Object> map;
那么在jsp中使用EL表达式输出的格式为:
<body>
<%
Person p = new Person();
p.setName("caesar");
p.setPhones(new String[] {"134224", "2134421"});
ArrayList<String> cities = new ArrayList<>();
cities.add("北京");
cities.add("上海");
cities.add("深圳");
p.setCities(cities);
HashMap<String, Object> map = new HashMap<>();
map.put("key1", "v1");
map.put("key2", "v2");
map.put("key3", "v3");
p.setMap(map);
pageContext.setAttribute("person", p);
%>
输出p: ${person} <br>
输出p的属性: ${person.name} <br>
输出p的phones数组: ${person.phones[1]} <br>
输出p的cities: ${person.cities} <br>
输出p的map: ${person.map} <br>
输出p的map的某个value值: ${person.map.key2}
</body>
运行结果:
注意,如果只是在Java Bean中定义了属性但没有指定get方法,那么EL表达式不会输出这个属性值,如:
没有给age加get方法:
使用 ${person.age} 获取age的值,发现出错了:
因为EL表达式是根据get方法来获取值的,而且即使没有属性,但有get方法仍然能访问到属性,例如我们把age属性删去,只留get方法:
运行结果如下:
所以EL表达式在输出属性时找到的属性对应的get方法。
运算
关系运算
逻辑运算
算术运算
empty运算
判断一个数据是否为空,若是则为true,否则为false。
- 值为null
- 为空串
- 为Object数组,长度为0
- list集合,元素个数为0
- map集合,元素个数为0
结果为false:
三元运算
- ${3 == 3? “yes”: “no”}
点运算和中括号运算符
如果直接用map.a.a.a获取key="a.a.a"的value值会出错,因为系统会认为.a.a.a是三次点运算,这时要加中括号[],如下图所示:
EL表达式中11个隐含对象
如何使用
之前提到过,直接${key2}就能输出数据,为何非要在前面加上applicationScope呢?多此一举?原因是如果多个域的key相同,那么使用key2会根据就近原则先输出pageContext key2的value,这可能不是我们想要的。
pageContext对象的使用
可以用如下方式简化:
现在只需${req.scheme}即可。
param && paramValues
- 使用${param}可获取从地址栏输入的参数,如:
${param.username}:
而paramValues适用于key有多个值的情况,如:
运行结果:
header && headerValues
输出请求头:${header[‘user-Agent’]}
headerValues同理。
cookie
initParam
${initParam},用于输出xml文件中的context-param映射
运行结果: