EL表达式语言是在JSP2.0版本中引入的新特性,它用于JSP文件中的数据访问。这种表达式语言能简化JSP文件中的数据访问的代码,可用来替代传统的基于<%=%>形式的Java表达式,以及部分基于<%%>形式的Java程序片段。
在JSP2.0中,EL是作为JSTL标签库的一部分而存在。但是从JSP2.1开始,把EL变成了独立于JSTL标签库的表达式语言。
例如以下代码包含了传统的Java程序片段和Java表达式,它们用于显示会话范围内的属性名为cart的ShoppingCart对象中的所有书的金额:
<%
ShoppingCart cart=(ShoppingCart)session.getAttribute("cart");
if(cart!=null){
%>
<%=cart.getTotal()%>
<%}%>
上述代码和以下EL表达式的作用是等价的:
${sessionScope.cart.total}
比较上述两段代码,可以看出,EL表达式能大大简化JSP代码,并能提高JSP代码的可读性。
基本语法:
从JSP2.0版本开始引进的EL表达式语言是一种简洁的数据访问语言。通过它可以在JSP文件中方便地访问应用程序数据,从而替代传统的基于<%=%>形式的Java表达式以及部分基于<%%>形式的Java程序片段。
EL表达式的基本形式为:${var},所有的表达式都以“${”开头,以"}"结尾。如果在JSP文件的模版文本中使用EL表达式,那么表达式的值会输出到网页上。
例如以下Java表达式和EL表达式的作用相同,都用于输出请求参数username:
Java表达式:<%=request.getParameter("username")%>
EL表达式:${param.username}
EL表达式语言可以使用点号运算符“.”来访问对象的属性,例如表达式${customer.name}表示customer对象的name属性。
EL表达式也可以使用方括号运算符“[ ]”来访问对象的属性,例如表达式${customer["name"]}和${customer.name}是等价的。
方括号运算符还可以用来访问数组中的元素,例如${customers[0]}表示访问customers数组中的第一个元素。
EL运算符:
EL语言支持算术运算符、关系运算符和逻辑运算符等,以完成常见的数据处理操作。
EL语言提供了一个用于测试对象是否为空的特殊运算符“empty”,其语法形式为${empty var},它能判断var命名变量是否为空。在以下情况下empty运算符返回true:
1. var变量不存在,即没有被定义。例如对于表达式${empty some},如果不存在some变量,就返回true。
2. var变量的值为null。例如对于表达式${customer.name},如果customer.name的值为null,就返回true。
3. var变量引用集合(Set、List和Map)类型的对象,并且在集合对象中不包含任何元素。
empty运算符可以与“!”运算符一起使用,比如对于表达式${! empty customer.name},如果customer.name不为空,就返回true。
隐含对象:
EL语言定义了11个隐含对象,它们都是java.util.Map类型,网页制作者可通过它们来便捷地访问web应用中的特定数据。
隐含对象的固定变量名 | 类型 | 说明 |
pageScope | java.util.Map | 把页面范围内的属性名和属性值进行映射 |
requestScope | java.util.Map | 把请求范围内的属性名和属性值进行映射 |
sessionScope | java.util.Map | 把会话范围内的属性名和属性值进行映射 |
applicationScope | java.util.Map | 把web应用范围内的属性名和属性值进行映射 |
header | java.util.Map | 把HTTP请求头部的项目名称和项目值进行映射,例如${header.host}等价于 <%=request.getHeader("host")%> |
headerValues | java.util.Map | 把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射,例如 ${headerValues["accept-language"]} 等价于<%=request.getHeaders("accept-language")%> |
param | java.util.Map | 把客户请求中的请求参数名和参数值进行映射 |
paramValues | java.util.Map | 把客户请求中的请求参数名和所有匹配的参数值数组进行映射,例如${paramValues.username} 等价于<%=request.getParameterValues("username")%> |
cookie | java.util.Map | 把客户请求中的Cookie名和Cookie对象进行映射 |
pageContext | java.util.Map | 表示javax.servlet.jsp.PageContext对象 |
initParam | java.util.Map | 把web应用的初始化参数名和参数值进行映射 |
1. 表示特定范围,包括pageScope,requestScope,sessionScope,applicationScope.
2. 表示HTTP请求中的特定数据,包括header,headerValues,param,paramValues和cookie
3. 表示PageContext对象,为pageContext
4. 表示web应用的初始化参数集合,为initParam
命名变量:
EL表达式中的变量称为命名变量,它不是JSP文件中的局部变量或实例变量,而是存放在特定范围内的属性,命名变量的名字和属性名字对应。例如${username}等价于以下代码:
<%
String username=(String)pageContext.findAttribute("username");
if(username!=null){
%>
<%=username%>
<%}%>
再例如${cart.total}等价于以下代码:
<%
ShoppingCart cart=(ShoppingCart)pageContext.findAttribute("cart");
if(cart!=null){
%>
<%=cart.getTotal()%>
<%}%>
以下代码先定义了一个username局部变量,再试图通过${username}来访问这个变量:
<%
String username="Tom";
%>
${username}
以上代码不会打印username局部变量。因为${username}代表特定范围内的username属性,不是局部变量。如果在所有范围内都不存在username属性,那么${username}没有任何打印结果。
以下代码先定义了一个会话范围内的username属性,再试图通过${username}来访问这个属性:
<%
pagecontext.setAttribute("username","Tom",PageContext.SESSION_SCOPE);
%>
${username}