1.导言
- 表达式语言
EL
(Expression Language)是JSP 2.0 的重要特性
。 EL 设计成可以轻松地编写免脚本的 JSP 页面,也就是说,页面不使用任何 JSP 声明、表达式或者 scriptlets 。 JSTL
(JavaServer Pages Standard Tag Library,JSP 标准标签库
)主要提供给 Java Web 开发人员一个标准通用的标签函数库,标签库同时支持 EL 用于获取数据
,Web开发人员能够用此标签库取代直接在页面中嵌入 Java 程序的做法,以提高程序的可读性和易维护性。
2. EL 简介
EL表达式以'${'开头,并以'}'
结束。
语法格式为:${expression} 。
EL表达式中的常量包括布尔常量、整型常量、字符串常量和NULL常量。
(1)EL中的标识符
EL 的标识符可以由任意的大小写字母、数字和下划线组成。但 EL 的标识符:① 不能以数字开头;② 不能是EL 中的保留字;③ 不能是隐式对象;④ 不能包含单引号、双引号、减号和正斜杠等特殊字符。
(2)变量与保留关键字
EL 表达式中的变量须从 JSP 四大作用域范围中依序进行查找。( page、request、session 和 application )
以下是 EL 中的保留关键字,不能用作标识符。
and、or、not、eq、ne、lt、gt、le、ge、true、false、null、instanceof、empty、div、mod 。
(3) [ ] 和 . 运算符
通过 EL 提供的“[ ]”和“.”运算符可以访问数据。
①“.”运算符:EL 表达式可使用点操作符来访问对象的属性。例如
o
b
j
e
c
t
.
p
r
o
p
e
r
t
y
n
a
m
e
。
②
“
[
]
”
运
算
符
:
与
点
操
作
符
类
似
,
也
用
于
访
问
对
象
的
属
性
,
属
性
名
须
用
双
引
号
括
起
来
。
③
“
[
]
”
运
算
符
可
以
访
问
M
a
p
对
象
的
k
e
y
关
键
字
的
值
,
例
如
{object.propertyname} 。 ②“[ ]”运算符:与点操作符类似,也用于访问对象的属性,属性名须用双引号括起来。 ③“[ ]”运算符可以访问 Map 对象的 key 关键字的值,例如
object.propertyname。②“[]”运算符:与点操作符类似,也用于访问对象的属性,属性名须用双引号括起来。③“[]”运算符可以访问Map对象的key关键字的值,例如{map[ “key”]}。
2.1 EL 的运算符和优先级
2.2 EL 隐式对象
EL为了能够获得Web 应用程序中的相关数据,EL 提供了11个隐式对象,类似于JSP的内置对象
。
在EL的隐式对象中,除 PageContext
是JavaBean
对象,对应于javax.servlet.jsp.PageContext
类型外,其他的隐式对象都对应于java.util.Map
类型。
这些隐式对象可分为页面上下文对象、访问作用域范围的隐式对象和访问环境信息的隐式对象 3 种
。如表 5-5 所示。
2.2.1 PageContext对象
<%@ 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>PageContext隐式对象的使用</title>
</head>
<body>
PageContext隐式对象的使用<br><hr>
获取请求URI:${pageContext.request.requestURI }<br>
获取请求URL:${pageContext.request.requestURL }<br>
获取响应的内容类型:${pageContext.response.contentType }<br>
获取服务器信息:${pageContext.servletContext.serverInfo }<br>
获取Servlet注册名:${pageContext.servletConfig.servletName }<br>
获取session创建时间:${pageContext.session.creationTime }<br>
获取session会话最长空闲时间:${pageContext.session.maxInactiveInterval }<br>
获取session会话的id:${pageContext.session.id }
</body>
</html>
2.2.2 作用域范围隐式对象(pageScope—requestScope—sessionScope—applicationScope)
<%@ 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>作用域范围隐式对象的使用</title>
</head>
<body>
<% pageContext.setAttribute("cityName", "Soochow"); %>
<% request.setAttribute("university", "华东师范大学"); %>
<% session.setAttribute("bookName", "《Android应用开发实践教程》"); %>
<% application.setAttribute("cityName", "New York"); %>
<p>pageScope隐式对象中key为"cityName"的值:${pageScope.cityName }</p>
<p>requestScope隐式对象中key为"university"的值:${requestScope.university }</p>
<p>session隐式对象中key为"bookName"的值:${sessionScope.bookName }</p>
<p>applicationScope隐式对象中key为"cityName"的值:${applicationScope.cityName }</p>
<p>表达式\${cityName}的值:${pageScope.cityName}</p>
</body>
</html>
2.2.3 param和paramValues对象
访问param.jsp,提交到param_result.jsp
param.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>param和paramValues隐式对象的使用</title>
</head>
<body>
<h2>个人信息</h2>
<form action="${pageContext.request.contextPath}/page/ch5/param_result.jsp">
<p>姓名:<input type="text" name="user" /></p>
<p>爱好:<input type="checkbox" name="hobby" value="swim">游泳
<input type="checkbox" name="hobby" value="pingpang">乒乓球
<input type="checkbox" name="hobby" value="music">音乐
<input type="checkbox" name="hobby" value="Go">围棋</p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
param_result.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>个人信息</title>
</head>
<body>
<p>姓名:${param.user}</p>
<p>爱好:${paramValues.hobby[0]} ${paramValues.hobby[1]} ${paramValues.hobby[2]}</p>
</body>
</html>
2.2.4 Cookie对象
<%@ 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>Cookie隐式对象的使用</title>
</head>
<body>
<h3>Cookie隐式对象的使用</h3>
<p>获取名为JSESSIONID的Cookie对象:${cookie.JSESSIONID }</p>
<p>获取名为JSESSIONID的Cookie对象的名称:${cookie.JSESSIONID.name }</p>
<p>获取名为JSESSIONID的Cookie对象的值:${cookie.JSESSIONID.value }</p>
<hr>
<%
Cookie cookie2 = new Cookie("username", "admin");
response.addCookie(cookie2);
%>
<p>获取名为username的Cookie对象:${cookie.username }</p>
<p>获取名为username的Cookie对象的名称:${cookie.username.name }</p>
<p>获取名为username的Cookie对象的值:${cookie.username.value }</p>
<hr>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null)
for (Cookie c : cookies) {
out.println(c);
out.println(c.getName());
out.println(c.getValue());
out.println("<br>");
}
%>
</body>
</html>
设置Cookie请看:https://www.bithachi.cn/posts/f768f9d3.html
2.2.5 header对象
<%@ 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>header隐式对象的使用</title>
</head>
<body>
<h3>header隐式对象的使用</h3>
<p>获取请求头Host的值:${header.host }</p>
<p>获取请求头的connection属性(是否需要持久连接):${header.connection }</p>
</body>
</html>
2.2…6 initParam对象
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>driverClassName</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
</web-app>
<%@ 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>initParam隐式对象的使用</title>
</head>
<body>
<h3>initParam隐式对象的使用</h3>
<p>driverClassName的值:${initParam.driverClassName }</p>
</body>
</html>
2.3. 定义和使用 EL 函数
EL 自定义函数就是提供一种语法允许在 EL 中调用某个Java类的静态方法。
EL自定义函数的开发与应用包括以下3个步骤:
(1)编写一个Java类,并在该类中编写公用的静态方法,用于实现自定义EL函数的具体功能。
(2)编写标签库描述文件(扩展名为*.tld),对函数进行声明,保存到Web应用的WEB-INF文件夹下。
(3)在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>customEL</short-name>
<uri>http://book.ch5.CustomEL/cFilter</uri>
<function>
<description>HTML过滤</description>
<name>cfilter</name>
<function-class>book.ch5.CustomEL</function-class>
<function-signature>java.lang.String cFilter( java.lang.String )</function-signature>
</function>
</taglib>
package book.ch5;
public final class CustomEL {
public static String cFilter(String message) {
if (message == null) {
return (null);
}
char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("<");
break;
case '>':
result.append(">");
break;
case '&':
result.append("&");
break;
case '"':
result.append(""");
break;
default:
result.append(content[i]);
}
}
return (result.toString());
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="mlab" uri="http://book.ch5.CustomEL/cFilter"%>
<!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>
<h3>白日依山尽,黄河入海流</h3>
${mlab:cfilter("<h3>白日依山尽,黄河入海流</h3>") }
</body>
</html>
3. JSTL 简介
JSP 标准标签库(JSTL)是一个 JSP 标签集合,它封装了 JSP 应用的通用核心功能
。
JSTL 支持通用的、结构化的任务,比如迭代,条件判断,XML 文档操作,国际化标签,SQL 标签。
除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
-
核心标签
-
格式化标签
-
SQL标签
-
XML标签
-
JSTL函数
3.1 核心标签库
JSTL 核心标签库包含 Web 应用中最常使用的标签,是 JSTL 中比较重要的标签库。核心标签库的标签按功能可分为4类:表达式标签、条件标签、迭代标签、URL相关标签。
如表 5-6 所示。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.2 <c:out>输出标签、<c:set>变量设置标签、<c:remove>变量移除标签
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>Hello,JSTL</title>
</head>
<body>
<c:set var="mystr" value="Hello,我们开始学习JSTL!"></c:set>
<c:out value="${mystr}"></c:out>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:remove> 标签</title>
</head>
<body>
<c:set var="user" value="一剑冲天" scope="session" />
session中的user:<c:out value="${user}" />
<br><hr>
<c:remove var="user" scope="session" />
从session中移除user再访问:<c:out value="${user}" />
</body>
</html>
3.3 <c:catch> 捕获异常标签
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:catch> 标签</title>
</head>
<body>
<c:catch var="exception1"><%=169/0%></c:catch>
<c:out value="${exception1}" />
<br>
<c:out value="${exception1.message}" />
</body>
</html>
3.4 <c:if>、 <c:choose>、 <c:when>、 <c:otherwise>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:choose> 标签</title>
</head>
<body>
<c:set var="user1" value="一剑冲天" scope="session" />
<c:if test="${not empty sessionScope.user1}">
您好,${sessionScope.user1}
</c:if>
<c:set var="user" value="admin222" scope="session" />
<c:set var="actor1" value="admin1" scope="session" />
<c:set var="actor2" value="admin2" scope="session" />
<c:choose>
<c:when test="${sessionScope.user eq sessionScope.actor1}">欢迎您,一级管理员!</c:when>
<c:when test="${sessionScope.user eq sessionScope.actor2}">欢迎您,二级管理员!</c:when>
<c:otherwise>对不起,您只是游客,无权访问该资源!</c:otherwise>
</c:choose>
</body>
</html>
3.5 <c:forEach>迭代标签
<c:forEach>迭代标签标签有如下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的信息 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.*" %>
<!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>使用 <c:forEach> 标签</title>
</head>
<body>
<%
List<String> bookList = new ArrayList<String>();
bookList.add("《Android应用开发实践教程》");
bookList.add("《Web应用开发》");
bookList.add("《软件项目管理》");
bookList.add("《iOS程序设计》");
session.setAttribute("bookList", bookList);
%>
<c:forEach items="${sessionScope.bookList}" var="book" varStatus="bookvst">
<p>图书序号:${bookvst.index+1},图书名称:${book}</p>
</c:forEach>
</body>
</html>
3.6 <c:import>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:import> 标签</title>
</head>
<body>
<c:import url="navigation.jsp" />
</body>
</html>
<%--navigation.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>电影天堂</title>
</head>
<body>
<font color="blue"><b>最新影片 | 经典影片 | 国内电影 | 欧美电影 | 欧美电视 | 最新综艺</b></font>
</body>
</html>
3.7 <c:url>、 <c:set>、 <c:remove>
<%-- url_test.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:url> 标签</title>
</head>
<body>
<c:url var="path" value="navigation.jsp" scope="page" />
<a href="${pageScope.path}">电影天堂首页</a>
</body>
</html>
<%-- redirect_test.jsp --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>使用 <c:redirect> 标签</title>
</head>
<body>
<c:redirect url="main.jsp">
<c:param name="user" value="诗仙李白" />
</c:redirect>
</body>
</html>
<%-- main.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>重定向页面并传递参数</title>
</head>
<body>
<p>原来你是${param.user}</p>
</body>
</html>