EL 表达式和 JSTL 标签
# 120.EL 表达式和 JSTL 标签
之前我们说过 MVC 模式,JSP 只负责展示数据,很少写 Java 代码;而有时候我们又确实需要写 Java 代码,此时可以用 EL 表达式和 JSTL 标签来代替
# EL 表达式
EL,全称 Expression Language,就是表达式语言,一种语言,JSP 默认支持 EL 表达式的
作用:替换和简化 JSP 页面中 Java 代码的编写,常用来计算和获取值
语法:${表达式}
实践:新建一个 ELDemo1.jsp,文件内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${ 3 > 4}
</body>
</html>
2
3
4
5
6
7
8
9
页面显示的内容:false
如果要忽略 EL 表达式,可以这样做:
- 忽略整个页面的所有 EL 表达式:设置 JSP 中 page 指令中的属性:
isELIgnored="true"
- 忽略当前的 EL 表达式:用反斜线
\${表达式}
:
# EL 表达式中的运算
EL 支持如下运算符:
算数运算符: + - * / (div) % (mod)。 除号可以用
div
表示,模可以用mod
表示比较运算符: >、 <、 > = 、 <=、== 、 !=
逻辑运算符:与或非,&& || ! ,可以用
and
表示&&
,or
表示||
,not
表示!
空运算符: empty。功能:用于判断字符串、集合、数组对象是否为 null 或者长度是否为 0,后续再演示。
${empty list}
:判断字符串、集合、数组对象是否为 null 或者长度为 0${not empty str}
:表示判断字符串、集合、数组对象是否不为 null 并且 长度 > 0
我们来演示一些运算符:新建一个 ELDemo2.jsp
算数运算符:<br>
${3 + 4}<br>
${3 / 4}<br>
${3 div 4}<br>
${3 % 4}<br>
${3 mod 4}<br>
比较运算符:<br>
${3 == 4}<br>
2
3
4
5
6
7
8
9
页面展示:
算数运算符:
7
0.75
0.75
3
3
比较运算符:
false
2
3
4
5
6
7
8
# EL 表达式获取值
EL 表达式只能从域对象中获取值,语法:
- 语法一
${域名称.键名}
:从指定域对象中获取指定键的值。如果获取为 null,也不会在页面上显示 null。还记得我们之前写的登录案例吗?为了不显示 null,还写了一个三元表达式,而用 EL 表达式可以大大简化代码 - 语法二
${键名}
:表示依次从最小的域对象中查找是否有该键对应的值,直到找到为止。查找顺序如下:pageScope→requestScope →sessionScope →applicationScope
域名称和域对象的对应关系:
- pageScope --> pageContext
- requestScope --> request
- sessionScope --> session
- applicationScope --> application(ServletContext)
# 获取基本类型
举例:在 request 域中存储了 name = 张三,则可以这样获取:${requestScope.name}
。
我们新建一个 ELDemo3.jsp 来演示下:
<!--演示EL表达式获取值 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//在域中存储数据
session.setAttribute("name","李四");
request.setAttribute("name","张三");
session.setAttribute("age","23");
request.setAttribute("str","");
%>
<h3>el获取值</h3>
${requestScope.name}
${sessionScope.age}
${sessionScope.haha} <!-- 没有这个属性,不会显示在页面上 -->
${name} 从小到大依次寻找,所以找到的是request的,输出张三。
${sessionScope.name}
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 获取对象的值
之前我们都是获取字符串的值,但如果要获取对象、List 集合、Map 集合的值呢?语法格式:
对象:
${域名称.键名.属性名}
通过的是对象的属性来获取,本质上会去调用对象的 getter 方法。setter 或 getter 方法,去掉 set 或 get,在将剩余部分,首字母变为小写,就是属性名,例如 setName() --> Name --> name,那么 name 就是属性名。
即使不是我们自定义类,也可以使用,例如 Date 类有 getMonth 方法,我们就可以用 month 属性。
List 集合:
${域名称.键名[索引]}
Map 集合:
${域名称.键名.key名称}
或${域名称.键名["key名称"]}
,单引号双引号都可以。
我们新建一个 ELDemo4.jsp 来演示下
<%@ page import="com.peterjxl.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<!--演示EL表达式获取对象类型的值 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
User user = new User();
user.setName("张三");
request.setAttribute("u",user);
List list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add(user);
request.setAttribute("list",list);
Map map = new HashMap();
map.put("sname","李四");
map.put("gender","男");
map.put("user",user);
request.setAttribute("map",map);
%>
<h3>el获取对象中的值</h3>
${requestScope.u}<br> 相当于System.out.println(u); 打印对象的地址
${requestScope.u.name}<br>
${u.name}<br>
<h3>el获取List值</h3>
${list}<br>
${list[0]}<br>
${list[1]}<br>
${list[10]} 如果越界了,不会在页面上展示错误信息。<br>
${list[2].name} User对象
<h3>el获取Map值</h3>
${map.gender}<br>
${map["gender"]}<br>
${map.user.name}
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
显示内容:
el获取对象中的值
User{id=0, name='张三', password='null'}
相当于System.out.println(u); 打印对象的地址 张三
张三
el获取List值
[aaa, bbb, User{id=0, name='张三', password='null'}]
aaa
bbb
如果越界了,不会在页面上展示错误信息。
张三 User对象
el获取Map值
男
男
张三
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 空运算符: empty
现在我们可以来讲讲空运算符了。
空运算符的功能:用于判断字符串、集合、数组对象是否为 null 或者长度是否为 0,根据情况显示 false 和 true。
${empty list}
:判断字符串、集合、数组对象是否为 null 或者长度为 0
${not empty str}
:表示判断字符串、集合、数组对象是否不为 null 并且 长度 > 0
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<!--演示EL表达式 空运算符 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String str = "";
request.setAttribute("str",str);
List list = new ArrayList<>();
request.setAttribute("list",list);
%>
empty str: ${empty str} <br>
not empty str: ${not empty str} <br>
empty list: ${empty list} <br>
not empty list: ${not empty list} <br>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
页面上的显示:
empty str: true
not empty str: false
empty list: true
not empty list: false
2
3
4
# 隐式对象
EL 表达式中有 11 个隐式对象,例如 pageContext,可以用来获取 JSP 其他八个内置对象:
<!--演示EL表达式 隐式对象 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式 隐式对象</title>
</head>
<body>
${pageContext.request} <br>
${pageContext.request.contextPath} 在JSP页面动态获取虚拟目录 <br>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
页面显示:
org.apache.catalina.connector.RequestFacade@38adec06
/hello
2