一、EL表达式介绍
- Expression Language表达式语言
- 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
- 在JSP2.0开始引入概念
语法格式:
在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
二、EL获取数据
- EL只能从四大域中获取属性 page、request、session、application
1. 使用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>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }
</body>
</html>
三、EL中的内置对象
EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型
1、域属性相关(4个)
pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
<%@ 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("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }<br>
name=${pageScope.name }<br>
name=${sessionScope.name }<br>
name=${requestScope.name }<br>
</body>
</html>
2、其他重要内置对象(4个)
(1)pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象。在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象
重点:其中最常用的:${pageContext.request.contextPath },代表web应用下的根
<%@ 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.request.contextPath }代表web应用的根 --%>
<form action="${pageContext.request.contextPath }/regster" method="POST">
xxx<input type="text" name="name"/><br>
yyy<input type="text" name="age"/><br>
<input type="submit" value="点击">
</form>
</body>
</html>
(2)param(获取请求中的指定参数)
name=${param.name }<br>
age=${param.age }<br>
----等价于-----
request.getParameter()
(3)paramValues
hobby[0]=${paramValues.hobby[0] }<br>
hobby[1]=${paramValues.hobby[1] }<br>
------等价于--------
request.getParameterValues()
(4)initParam
提示初始化参数是在web.xml文件中设置的。与上面两个不一样。
name=${initParam.name }
------等价于---------
ServletContext.getInitParameter()
四、EL访问Bean的属性
1、什么是java Bean
JavaBean是公共Java类,但是为了编辑工具识别
需要满足至少三个条件
(1)有一个public默认构造器(例如无参构造器)
(2)属性使用public 的get,set方法访问,也就是说设置成private同时get,set方法与属性名的大小也需要对应。
(3)需要序列化。这个是框架,工具跨平台反映状态必须的
2、EL访问Bean属性
EL可以通过${key.属性}的方式获取到指定值,其底层实际调用的是该对象的相应属性的get方法
<%@ page language="java" contentType="text/html; charset=UTF-8"
import="linjie.com.Demo"
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>
<%
Demo test=new Demo("linjie",12);
request.setAttribute("ELttt", test);
%>
name=${requestScope.ELttt.name }<br>
age=${requestScope.ELttt.age }<br>
<!-- 若访问为null的对象的属性,EL是不会抛出空指针异常的,只是不显示而已 -->
names=${requestScope.ELtttxx.name }<br>
</body>
</html>
五、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>Insert title here</title>
</head>
<body>
<%
String[] names={"xlj","lucy","king"};
pageContext.setAttribute("names", names);
%>
name[1]=${names[1] }<br>
<!-- 若访问的数组元素下标超出了数组下标上限,EL不会抛出越界异常,只是不显示 -->
names[5]=${names[5] }<br>
</body>
</html>
六、EL获取list中数据
<%@page import="java.util.*"%>
<%@ 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>
<%
List<String> names=new ArrayList<String>();
names.add("xlj");
names.add("lucy");
pageContext.setAttribute("names", names);
%>
<!-- 因为List底层是数组,所以可以这样写 -->
names[1]=${names[1] }<br>
</body>
</html>
【提示】EL可以通过索引访问List,但无法访问Set。因为Set中没有索引概念
七、EL访问Map
<%@page import="java.util.*"%>
<%@ 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>
<%
Map<String,Object> map=new HashMap<String,Object>();
map.put("age", 20);
map.put("name", "xlj");
pageContext.setAttribute("map", map);
%>
name=${map.name }<br>
age=${map.age }<br>
</body>
</html>
八、EL中的运算符(empty)
1、先说说几个常用运算符
- 算术运算符:+、-、*、/、%(不支持++、–)
- 关系运算符:==、!=、>、>=、<、<=
- 逻辑运算符:!、&&、||、not、and、or
- 条件运算符:?:
- 取值运算符:[]、点号
2、empty运算符
用法为${empty 变量},结果为布尔值
总结
EL表达式不能出现在Java代码块、表达式块等JSP动态代码部分
EL只能从四大域属性空间中获取数据(pageContext、request、session、application)
EL不会抛出空指针异常,只会不显示
EL不会抛出数组越界异常,只会不显示
EL不具有对字符串进行处理的能力(可以使用JSTL的EL或者自定义EL函数)