一,EL 表达式概述(EL主要从域中取数据)
EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL出现的目的是要替代jsp页面中脚本的编写。
二,EL从域中取出数据(EL最重要的作用)
jsp脚本:
<%=request.getAttribute(name)%>
EL表达式替代上面的脚本:
${requestScope.name}
EL最主要的作用是获得四大域中的数据
格式:${ EL表达式 }
EL获得pageContext域中的值 | ${pageScope.key}; |
EL获得request域中的值 | ${requestScope.key}; |
EL获得session域中的值 | ${sessionScope.key}; |
EL获得application域中的值 | ${applicationScope.key}; |
EL从四个域中获得某个值:${key};
EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回"" (注意,不是null,而是空字符串)。
例如:
User实体类:
public class User {private int id;private String name;private String pwd;public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public User() {}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPwd() {return pwd;}public void setPwd(String pwd) {this.pwd = pwd;} }
Index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@ page import="com.zender.*,java.util.*"%> <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body><!-- 模拟域中的数据 --><%//存储字符串request.setAttribute("name","Zender");//存储一个对象User user = new User(1, "Zender", "123");session.setAttribute("user", user);//存储一个集合User user1 = new User(1, "Zender", "123");User user2 = new User(2, "Zender2", "1234");User user3 = new User(3, "Zender3", "1235");List<User> list = new ArrayList<User>();list.add(user1);list.add(user2);list.add(user3);application.setAttribute("list", list);%>通过脚本获取域中的数据:<br/><!-- 通过脚本获取域中的数据 --><%=request.getAttribute("name") %><%User sessionUser = (User)session.getAttribute("user");out.write(sessionUser.getName());%><hr/>通过EL表达式获取域中的数据:<br/><!-- 通过EL表达式获取域中的数据 -->${requestScope.name}${sessionScope.user.name}${applicationScope.list[1].name}<hr/>通过EL表达式,全域查找,获取域中的数据 :<br/><!-- 通过EL表达式,全域查找,获取域中的数据 -->${name}${user.name}${list[2].name}<hr/> </body> </html>
访问index.jsp结果如下:
三,EL表达式执行运算
语法:${运算表达式},EL表达式支持如下运算符:
1、关系运算符
2、逻辑运算符
3、empty运算符:检查对象是否为null(空)
4、二元表达式:${user!=null?user.name :""}
5、[ ] 和 . 号运算符
例如:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="com.zender.*,java.util.*"%> <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>el表达式进行四则运算:<br/>加法运算:${100+100}<br/>减法运算:${100-100}<br/>乘法运算:${100*100}<br/>除法运算:${100/100}<hr/>el表达式进行关系运算:<br/><%--${user == null}和 ${user eq null}两种写法等价--%>${user == null}<br/>${user eq null}<hr/>el表达式使用empty运算符检查对象是否为null(空):<br/><%--使用empty运算符检查对象是否为null(空) --%><% List<String> list = new ArrayList<String>();list.add("Zender");list.add("Zender2");request.setAttribute("list",list);%><c:if test="${!empty(list)}"><c:forEach var="str" items="${list}">${str}<br/></c:forEach></c:if><hr/>EL表达式中使用二元表达式:<br/><% session.setAttribute("user1",new User(1,"Zender","123"));%>${user1 == null ? "对不起,您没有登陆 " : user1.name} </body> </html>
运行结果如下:
四,EL的内置11个对象
pageScope,requestScope,sessionScope,applicationScope | 用于获取JSP中域中的数据 |
param,paramValues | 用于接收参数,相当于request.getParameter(),rquest.getParameterValues() |
header,headerValues | 用于获取请求头信息,相当于request.getHeader(name),request.getHeaders() |
initParam | 用于获取全局初始化参数,相当于this.getServletContext().getInitParameter(name) |
cookie | 用于WEB开发中的cookie,相当于request.getCookies()--->cookie.getName()--->cookie.getValue() |
pageContext | 用于WEB开发中的pageContext |
注意:
测试header和headerValues时,如果头里面有"-" ,例Char-Encoding,则需要header["Char-Encoding"]、headerValues["Char-Encoding"]
测试cookie时,例${cookie.key}取的是cookie对象,如访问cookie的名称和值,必须${cookie.key.name}或者${cookie.key.value}
五,EL表达式保留关键字
所谓保留字的意思是指变量在命名时,应该避开上述的名字,以免程序编译时发生错误。