EL表达式
标签(空格分隔): JavaWeb
EL(Expression Language)提供了在JSP中简化表达式的方法,让Jsp的代码更加简化。用于JSP文件中的数据访问。这种表达式语言能简化JSP文件中数据访问的代码,可用来代替传统的基于<%=%>
形式的Java表达式,以及部分基于<%heels%>
形式的Java程序片段。
基本语法
EL表达式的基本形式为:${var}
,所有的表达式都以${
符号开头,以}
符号结尾。如果在JSP文件的模版文件中使用EL表达式,那么表达式的值会输出到网页上。
例如以下Java表达式和El表达式的作用相同,都用于输出请求参数username:
<%=request.getParameter(“username”)%>
${param.username}
比较以上两种表达式的形式,可以看出,EL表达式能以更加简单的语法来访问数据。
EL表达式和Java表达式一样,既可以直接插入到JSP文件的模版文件中,也可以作为JSP标签的属性的值:
<jsp:useBeanid="myBean" scope="page" class=”defaultPackage.CounterBean”/>
<jsp:setProerptyname="myBean" property="count" value="${myBean.count+1}"/>
Current countvalue is :${myBean.count}
访问对象的属性及数组的元素
EL表达式语言可以使用点号运算符.
来访问对象的属性,例如表达式${customer.name}
表示customer对象的name属性。
EL表达式语言也可以使用方括号运算符”[]”来访问对象的属性,例如表达式${customer["name"]}
和${customer.name}
是等价的。
方括号运算符”[]”还可以用来访问数组中的元素,例如${sustomers[0]}
表示访问customers数组中的第一个元素。
获取数据
EL表达式可以用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据(某个web域中的对象,访问javabean的属性、访问list,map集合、访问数组)。
在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果对象中不存在标识符所对应的对象,则返回”“(注意不是null)。下面是EL表达式获取数据的几种情况,由于JSP是用来获取servlet传递过来的数据,所以在这个JSP里面先模拟向域中存放数据,再获取。具体看下面的例子:
<%@page import="javaBean.Address"%>
<%@page import="javaBean.Person"%> <!-- javaBean的具体代码就不写了,很简单 -->
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
request.setAttribute("name", "aaa"); //先向request域中存个对象
%>
<!-- 相当于pageContext.findAttribute("name") 会从page request session application四个域中寻找 -->
${name }
<!-- 在JSP页面中使用EL表达式可以获取bean的属性 -->
<%
Person p = new Person();
p.setAge(12);
request.setAttribute("person", p);
%>
${person.age}
<!-- 在JSP页面中使用EL表达式可以获取bean中的bean。。。 -->
<%
Person person = new Person();
Address address = new Address();
person.setAddress(address);
request.setAttribute("person", person);
%>
${person.address.name}
<!-- 在JSP页面中使用EL表达式可以获取List集合指定位置的数据 -->
<%
Person p1 = new Person();
p1.setName("aa");
Person p2 = new Person();
p2.setName("bb");
List<Person> list = new ArrayList<Person>();
list.add(p1);
list.add(p2);
request.setAttribute("list", list);
%>
${list[0].name}
<!-- 在JSP页面中使用EL表达式可以获取map集合的数据 -->
<%
Map<String,String> map = new HashMap<String,String>();
map.put("a", "aaaax");
map.put("b", "bbbbx");
map.put("1", "ccccx");
request.setAttribute("map", map);
%>
${map.a}
${map["1"] } <!-- 以数字为关键字时候的取法 -->
<!-- 使用EL表达式可以获取web应用的名称 -->
<a href="${pageContext.request.contextPath }/1.jsp">点击</a>
</body>
</html>
执行运算符
EL表达式中还可以使用算数运算符,关系运算符,逻辑运算符,条件运算符。
EL语言提供了一个用于测试对象是否为空的特殊运算符“empty“,其语法形式为${empty var},它能判断var变量(确切地说,应该是命名变量)是否为空。在以下情况下empty运算符返回true:
- var变量不存在,即没有定义。
- var变量的值为null。
- var变量引用集合(Set、List和Map)类型的对象,并且在i集合对象中不包含任何元素。
empty运算符可以与”!”运算符一起使用。
获取web开发常用对象
EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
语法:${隐式对象名称}
: 获得对象的引用。
隐含对象名称以及描述:
pageContext: //对应于JSP页面中的pageContext对象(注意:取的是pageContext对象)
pageScope: //代表page域中用于保存属性的Map对象
requestScope: //代表request域中用于保存属性的Map对象
sessionScope: //代表session域中用于保存属性的Map对象
applicationScope: //代表application域中用于保存属性的Map对象
param: //表示一个保存了所有请求参数的Map对象
paramValues: //表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String[]
header: //表示保存了所有http请求头字段的Map对象
headerValues: //同上,返回String[]数组。注意:如果头里面有"-",例如Accept-Encoding,则要headerValues["Accept-Encoding"]
cookie: //表示一个保存了所有cookie的Map对象
initParam: //表示了一个保存了所有web应用初始化参数的Map对象
具体看下面的例子:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL隐式对象</title>
</head>
<body>
<!-- ${name} 表示 pageContext.findAttribute("name")
过程是这样:首先判断name是否为EL的隐式对象,如果是直接返回该隐式对象的引用,不是则调用findAttribute方法
-->
${pageContext } <!-- 拿到pageContext的引用:org.apache.jasper.runtime.PageContextImpl@155ef996 -->
<!-- 拿到pageContext就可以拿到所有其他域对象了,比如 ${pageContext.request} -->
<br>
<!-- 从指定的page域中查找数据 -->
<%
pageContext.setAttribute("name", "aaa");//map
%>
${pageScope.name }
<!-- ${name}会从四个域里面查找name 而${pageScope.name}只会从page域中查找 -->
<br>
<!-- 从request域中查找数据 -->
<%
request.setAttribute("name", "bbb");
%>
${requestScope.name }
<!-- 如果用${name}会取到aaa,因为会首先在pageContext中查找 -->
<br>
<!-- 从session域中查找数据,可以用于检查用户是否登陆 -->
<!-- 从application域中查找数据,与上面的原理都相同 -->
<!-- 获得用于保存请求参数的map,并从map中获取数据 -->
<!-- http://localhost:8080/test/1.jsp?name=ccc -->
${param.name } <!-- 拿到ccc -->
<!-- 此表达式会经常用在数据回显上 -->
<form action="${pageContext.request.contextPath }/servlet/ReqisterServlet" method="post">
<input type="text" name="username" value="${param.username }">
<input type="submit" value="注册">
</form>
<br>
<!-- paramValue获得请求参数 map{"",String[]} -->
<!-- http://localhost:8080/test/1.jsp?like=sing&like=dance -->
${paramValues.like[0] }
${paramValues.like[1] }
<br>
<!-- header获取请求头 -->
${header.Accept }
${header["Accept-Encoding"]}
<br>
<!-- headerValues和paramValues一样的 -->
<!-- 获取客户机提交的cookie -->
${cookie.JSESSIONID.value } <!-- 获得cookie对象中名为JSESSIONID的cookie值 -->
<br>
<!-- 获取web应用初始化参数 -->
${initParam.name } <!-- 用于获得web.xml中<context-Param>中的参数 -->
<br>
</body>
</html>