EL表达式简介:
EL 全名为Expression Language。
EL主要作用:
获取数据:
•EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
执行运算:
•利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
获取web开发常用对象
•EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
调用Java方法
•EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
EL注意事项:
EL表达式是JSP 2.0(JavaEE1.4)规范中的一门技术 。因此,若想正确解析EL表达式,需使用支持Servlet2.4/JSP2.0技术的WEB服务器。
l注意:有些Tomcat服务器如不能使用EL表达式
(1)升级成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
获取数据(1):
l使用EL表达式获取数据语法:“${标识符}”
lEL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。
l示例:${user}
获取数据(2):
lEL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如:
•${user.address.city}
•${user.list[0]}:访问有序集合某个位置的元素
•${map.key} : 获得map集合中指定key的值
l. 和 [ ] 区别
l结合JSTL的foreach标签,使用EL表达式也可以很轻松迭代各种类型的数组或集合,示例:
•迭代数组
•迭代collection类型集合
•迭代map类型集合
执行运算:
l语法:
EL语法
${ EL表达式 } : 注意${间不要有空格。
EL存取变量:${ a },取出某一范围中名称为a的变量,默认会按page、request、session、application的顺序查找。
<%
request.setAttribute("str", str);
%>
${ str }
${ RequestScope.str }
${运算表达式},EL表达式支持如下运算符:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>el支持运算</title>
</head>
<body>
<%
request.setAttribute("n1", 10);
request.setAttribute("n2", 20);
request.setAttribute("n3", 30);
request.setAttribute("n4", 40);
%>
<h4>EL表达式支持运算</h4>
${ n1 + n2 }
<h4>是否相等</h4>
${ n1 == n2 } ${ n1 eq n2 }
<h4>是否不等</h4>
${ n1 != n2 } ${ n1 ne n2 }
<h4>大于或者小于</h4>
${ n1 > n2 } ${ n1 gt n2 } ${ n1 < n2 } ${ n1 lt n2 }
<h4>大于等于或者小于等于</h4>
${ n1 >= n2 } ${ n1 ge n2 } ${ n1 <= n2 } ${ n1 le n2 }
<h4>与或非</h4>
${ n1 > n2 && n3 > n4 } ${ n1>n2 and n3>n4 }
${ n1 > n2 || n3 > n4 } ${ n1>n2 or n3>n4 }
${ !(n1>n2) } ${ not(n1>n2) }
</body>
</html>
EL表达式保留关键字:
l所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误
获得web开发常用对象:
lEL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
l语法:${隐式对象名称} :获得对象的引用
隐含对象名称 |
描 述 |
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-Encodings"] |
cookie |
表示一个保存了所有cookie的Map对象 |
initParam |
表示一个保存了所有web应用初始化参数的map对象 |
测试各个隐式对象
demo1.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day13/jsp/eldemo3.jsp" method="post">
用户名:<input type="text" name="username" /><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
demo2.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>传统方式</h4>
<%= request.getParameter("username") %>
<h4>使用EL表达式内置对象获取请求参数</h4>
${ param.username }
${ paramValues.username[0] }
<h4>使用EL表达式的内置对象获取请求头的信息</h4>
${ header.referer }
${ headerValues.referer[0] }
${ header["user-agent"] }
<h4>获取全局初始化参数的值</h4>
${ initParam.encoding }
<h4>使用传统方式获取cookie中的值</h4>
<%
Cookie [] cookies = request.getCookies();
for(Cookie c : cookies){
if(c.getName().equals("last")){
String value = c.getValue();
%>
<font color="blue"><%= value %></font>
<%
}
}
%>
<h4>使用EL表达式来获取内容</h4>
${ cookie.last.name } -- ${ cookie.last.value }
<font color="red">${ cookie.last.value }</font>
<form action="">
<input type="text" name="username" value="${ cookie.last.value }" />
</form>
<h4>EL表达式中的pageContext对象</h4>
${ pageContext.request.contextPath }
${ pageContext.request.remoteAddr }
<form action="${ pageContext.request.contextPath }/xxx" method="post">
<input type="text" name="username" />
</form>
</body>
</html>
注意事项
•测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
•测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}
EL表达式获取集合的值:
el1.jsp
<%@page import="cn.itcast.domain.Person"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("username", "美美");
request.setAttribute("username", "张默");
session.setAttribute("username", "乌鸦");
application.setAttribute("username", "李代沫");
%>
<h4>EL获取域对象中的值</h4>
${ pageScope.username }
${ requestScope.username }
${ sesssionScope.username }
${ applicationScope.username }
<h4>从数组中取值(把数组存到域对象中)</h4>
<%
String [] arrs = new String[]{"美美","张默","房祖名"};
// 先把数组存到域中
pageContext.setAttribute("arrs", arrs);
%>
${ arrs[2] }
<h4>从List集合中取值(域对象中)</h4>
<%
List<String> list = new ArrayList<String>();
list.add("美美");
list.add("张默");
list.add("房祖名");
pageContext.setAttribute("list", list);
%>
${ list[1] }
<h4>从Map集合中取值</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "美美");
map.put("bbb", "张默");
map.put("ccc-ddd", "房祖名");
pageContext.setAttribute("map", map);
%>
${ map["ccc-ddd"] }
<h4>从List存入对象集合中取值(域对象中)</h4>
<%
List<Person> ulist = new ArrayList<Person>();
ulist.add(new Person("美美","123"));
ulist.add(new Person("张默","456"));
ulist.add(new Person("祖明","789"));
pageContext.setAttribute("ulist", ulist);
%>
${ ulist[2].username }
</body>
</html>
Person.java:
package cn.itcast.domain;
public class Person {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Person(String username, String password) {
super();
this.username = username;
this.password = password;
}
public Person() {
super();
}
public String toString() {
return "Person [username=" + username + ", password=" + password + "]";
}
}