EL_JSTL

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[]访[]访Mapkey{map[ “key”]}。

2.1 EL 的运算符和优先级

image-20201108190545194

image-20201108190552757

image-20201108190558314

image-20201108190613695

image-20201108190631460

image-20201108190636818

image-20201108190640343

2.2 EL 隐式对象

EL为了能够获得Web 应用程序中的相关数据,EL 提供了11个隐式对象,类似于JSP的内置对象

在EL的隐式对象中,除 PageContextJavaBean对象,对应于javax.servlet.jsp.PageContext类型外,其他的隐式对象都对应于java.util.Map类型。

这些隐式对象可分为页面上下文对象、访问作用域范围的隐式对象和访问环境信息的隐式对象 3 种。如表 5-5 所示。

image-20201108203735125

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>

image-20201108201600835

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>

image-20201108202139352

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]}&nbsp;${paramValues.hobby[1]}&nbsp;${paramValues.hobby[2]}</p>
</body>
</html>

image-20201108202347320

image-20201108202648939

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

image-20201108203041348

image-20201108202927192

image-20201108203207829

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>

image-20201108203339081

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>

image-20201108205006614

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("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '"':
                    result.append("&quot;");
                    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>

image-20201108210630803

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" %>

image-20201108211418888

更多用法:https://www.runoob.com/jsp/jsp-jstl.html

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>

image-20201108223655828

<%@ 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>使用 &lt;c:remove&gt; 标签</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>

image-20201108223821153

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>使用 &lt;c:catch&gt; 标签</title>
</head>
<body>
	<c:catch var="exception1"><%=169/0%></c:catch>
	<c:out value="${exception1}" />
	<br>
	<c:out value="${exception1.message}" />
</body>
</html>

image-20201108224113127

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>使用 &lt;c:choose&gt; 标签</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>

image-20201108224601966

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>使用 &lt;c:forEach&gt; 标签</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>

image-20201108224912996

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>使用 &lt;c:import&gt; 标签</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>

image-20201108225136503

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>使用 &lt;c:url&gt; 标签</title>
</head>
<body>
	<c:url var="path" value="navigation.jsp" scope="page" />
	<a href="${pageScope.path}">电影天堂首页</a>
</body>
</html>

image-20201108225450128

<%-- 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>使用 &lt;c:redirect&gt; 标签</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>

image-20201108225751618

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值