六、使用 EL 和 JSTL 简化 JSP
6.1 使用 EL 表达式
EL 表达式借鉴了 JavaScript 和 XPath 的表达式语言
EL 表达式提供了一种在 JSP 中简化表达式的方法
EL 表达式通常用于在某个作用域 {page、request、session、application等} 内取得属性值
6.1.1 使用 EL 表达式
- EL 表达式语法
${表达式}
- EL 表达式一般操作的是域对象,操作不了局部变量
- 域对象的概念在 JSP 中存在的有: pageContext、request、session、application
- 作用范围依次为 本页面、一次请求、一次会话、整个应用程序
- 使用时通过给域对象设置的 name 值来调用值
- 如果四个域对象的 name 值都相同时,EL 默认的查找方式是从小到大查找
- 示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
pageContext.setAttribute("uname","pageContext");
request.setAttribute("uname", "request");
session.setAttribute("uname", "session");
application.setAttribute("uname", "application");
// 局部变量
String str="你好";
%>
局部变量${str}<br>
域变量${uname}
</body>
</html>
- 输出结果
局部变量
域变量pageContext
- 因为 EL 表达式操作的是域对象,所以调用局部变量并没有找到值
- 因此也可以看出,当 EL 表达式操作的值为空时,会返回一个空的字符串,而不是 null
6.1.2 使用 EL 表达式操作对象
- EL 表达式经常用来访问两类内容: 对象和属性
1、用 点 (.) 操作符
- 与 Java 语言类似,在 EL 表达式中,也可以用点操作符来访问对象的属性
- 用 点 (.) 操作符访问对象属性 示例
${对象名.属性}
2、 [] 操作符
- 与点操作符类似,[] 操作符也可以访问对象的属性
- 它也可以用来访问一些包含了特殊字符的 如
.
或-
等的属性名 - 也可以用来访问数组
- [] 操作符示例
${对象名[属性]}
${数组[下标]}
3、 EL 表达式的简单用于,操作 Map 集合
- 将用户信息存储在 Map 中,并通过 EL 表达式输出
- 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
Map<String, String> map=new HashMap<String, String>();
map.put("name","巧克力");
map.put("hobby","胡思乱想");
request.setAttribute("user",map);
%>
用户名:${user.name}<br>
用户爱好:${user.hobby}<br>
</body>
</html>
- 输出结果
6.1.3 Empty 运算符
- Empty 运算符是一个前缀操作符,用于检测一个变量是否为空
- 如引用为 null,字符串或集合的长度为 0 等,结果都会返回为 true
- 如果不为空则返回 false
- 代码示例
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
String str=null;
String str1="";
Map map=null;
Map map1=new HashMap();
Map map2=new HashMap();
map2.put("str","123");
request.setAttribute("str",str);
request.setAttribute("str1",str1);
request.setAttribute("map",map);
request.setAttribute("map1",map1);
request.setAttribute("map2",map2);
%>
空字符串:${empty str}<br>
值为空格的字符串:${empty str1}<br>
空 map:${empty map}<br>
长度为0的 map:${empty map1}<br>
有值的 map:${empty map2}<br>
</body>
</html>
- 运行结果
6.1.4 EL 表达式的隐式对象
- EL 表达式提供了若干隐式对象,以便 JSP 的开发
- EL 表达式的隐式对象按照使用途径的不同分为 作用域访问对象、参数访问对象、JSP 隐式对象、首部访问对象和初始化参数访问对象
- EL 表达式的隐式对象
1、作用域访问对象
- 在 Java Web 中存储变量时,共有 page、request、session、application 四个作用域选项
- 但是如果四个作用域内存储的值的 name 都相同时,可以使用作用域对象,指定在某个作用域查找的值
- 将作用域内的所有属性转为 Map 类,通过 key 值来调用
- EL 表达式提供了四个作用域访问对象
对象名称 | 说明 |
---|---|
pageScope | 与 page 作用域中的属性相关联的 Map 类 |
requestScope | 与 request 作用域中的属性相关联的 Map 类 |
sessionScope | 与 session 作用域中的属性相关联的 Map 类 |
applicationScope | 与 application 作用域中的属性相关联的 Map 类 |
- 当使用 EL 表达式访问某个变量时,应该指定查找范围,如 ${rquestScope.pageObje}
- 代码示例
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP</title>
</head>
<body>
<%--设置数据--%>
<%
pageContext.setAttribute("uname","pageContext");
request.setAttribute("uname", "request");
session.setAttribute("uname", "session");
application.setAttribute("uname", "application");
%>
PageContext作用域:${pageScope.uname}<br>
requset作用域:${requestScope.uname}<br>
session作用域:${sessionScope.uname}<br>
application作用域:${applicationScope.uname}<br>
</body>
</html>
- 输出结果
e", “application”);
%>
PageContext作用域:
p
a
g
e
S
c
o
p
e
.
u
n
a
m
e
<
b
r
>
r
e
q
u
s
e
t
作用域
:
{pageScope.uname}<br> requset作用域:
pageScope.uname<br>requset作用域:{requestScope.uname}
session作用域:
s
e
s
s
i
o
n
S
c
o
p
e
.
u
n
a
m
e
<
b
r
>
a
p
p
l
i
c
a
t
i
o
n
作用域
:
{sessionScope.uname}<br> application作用域:
sessionScope.uname<br>application作用域:{applicationScope.uname}
- 输出结果