动态网站开发讲课笔记07:EL和JSTL

文章目录

零、本节学习目标

  1. 掌握EL的基本语法
  2. 熟悉EL中常见的隐式对象
  3. 了解JSTL标签库
  4. 熟悉JSTL的下载与使用
  5. 掌握Core标签库中的常用标签

前面我们学习了JSP页面,在JSP开发中,为了获取Servlet域对象中存储的数据,经常需要书写很多Java代码,这样的话会使JSP页面混乱。为了降低JSP页面的复杂度,增强代码的重用性,Sun公司制定了一套标准标签库JSTL,同时为了获取Servlet域对象中存储的数据,JSP2.0规范还提供了EL(表达式语言),大大降低了开发的难度。本节将针对EL以及JSTL标签库进行详细讲解。

一、EL

(一)EL基本语法

  • 目标:掌握EL的基本语法

1、EL的概念

  • EL全称为Expression Language,即表达式语言。它是JSP 2.0引入的一个新内容。EL可以简化JSP开发中的对象引用,从而规范页面代码,增加程序的可读性及可维护性。EL为不熟悉Java语言页面开发的人员提供了一个开发JavaWeb应用的新途径。

2、EL的语法

  • EL的语法非常简单,都是以“${”符号开始,以“}”符号结束的
  • 语法格式:${表达式}
  • ${表达式}”中的表达式必须符合EL语法要求。
  • 由于EL的语法以“${" 开头,如果在JSP网页中要显示“${“字符串,必须在前面加上“\”符号,即“\${”,或者写成“${${}“, 也就是用表达式输出“${” 符号。

3、案例演示

(1)用EL读取保存的信息
  • 创建Java Enterprise项目 - ELJSTLDemo
    在这里插入图片描述
  • 单击【Finish】按钮
    在这里插入图片描述
  • 修改Artifact名称
    在这里插入图片描述
  • 重新部署项目
    在这里插入图片描述
  • 修改首页
    在这里插入图片描述
  • 启动服务器,查看结果
    在这里插入图片描述
  • 创建net.huawei.servlet包,在包里创建ServletDemo01
    在这里插入图片描述
package net.huawei.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 功能:保存request属性,请求转发到指定页面
 * 作者:华卫
 * 日期:2023年04月20日
 */
@WebServlet(name = "ServletDemo01", urlPatterns = "/demo01")
public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 保存request属性
        request.setAttribute("username", "无心剑");
        request.setAttribute("password", "903213");
        // 获取请求转发器,转发到`demo01.jsp`页面
        RequestDispatcher dispatcher = request.getRequestDispatcher("/demo01.jsp");
        // 请求转发
        dispatcher.forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}
  • web目录里创建demo01.jsp页面
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>demo01</title>
    </head>
    <body>
        使用JSP表达式获取属性:<br />
        用户名:<%=request.getAttribute("username")%> <br />
        密码:<%=request.getAttribute("password")%> <br />
        <hr />
        使用EL获取属性:<br />
        用户名:${username} <br />
        密码:${password} <br />
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo01
    在这里插入图片描述
(2)使用Java代码与EL获取信息的对比
  • 由上图中可知,使用EL同样可以成功获取Servlet中存储的数据,但EL明显简化了JSP页面的书写,使程序简洁易维护。另外,当域对象里面的值不存在时,使用EL获取域对象里面的值时返回空字符串;而使用Java方式获取时,如果返回值是null,会报空指针异常,所以在实际开发中推荐使用EL的方式获取域对象中存储的数据。

4、EL基本语法的特点

(1)EL可以与JavaScript语句结合使用。
(2)EL可以自动进行类型转换。如果想通过EL获取两个字符串数值(如number1和number2)的和,可以直接通过“+”符号进行连接(如$ {number1 + number2})。
(3)EL不仅可以访问一般变量,还可以访问JavaBean中的属性、嵌套属性和集合对象。
(4)在EL中,可以执行算术运算、逻辑运算、关系运算和条件运算等。
(5)在EL中,可以获取pageContext对象,进而获取其他内置对象。
(6)在使用EL进行除法运算时,如果除数为0,则返回表示无穷大的Infinity,而不返回错误。
(7)在EL中,可以访问JSP的作用域(pagerequestsessionapplication)。

(二)EL中的标识符

  • 目标:熟悉EL中的标识符

1、EL中标识符的规范

  • 在EL中,经常需要使用一些符号标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。EL中的标识符可以由任意的大小写字母、数字和下划线组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范。
    (1)不能以数字开头。
    (2)不能是EL中的关键字,如andorgt等。
    (3)不能是EL隐式对象,如pageContext
    (4)不能包含单引号(')、双引号(")、减号(-)和正斜线(/)等特殊字符。

2、EL中标识符的示例

(1)合法标识符
username
username123
user_name
_userName
(2)非法标识符
123username
or
user"name
pageContext

(三)EL中的关键字

  • 目标:熟悉EL中的关键字
  • 关键字就是编程语言里事先定义好并赋予了特殊含义的单词,和其他语言一样,EL中也定义了许多关键字,如falsenot等。
  • EL所有的关键字
1234
andeqgttrue
instanceofornele
falseemptynotlt
genulldivmod

(四)EL中的变量

  • 目标:熟悉EL中的变量

1、基本概念

  • EL中的变量就是一个基本的存储单元,EL中的变量不用事先定义就可以直接使用。EL可以将变量映射到一个对象上。

2、简单示例

${message}
  • 在上述示例中,message就是一个变量,通过表达式${message}就可以访问变量message的值。

(五)EL中的常量

  • 目标:熟悉EL中的常量

1、布尔常量

  • 布尔常量用于区分一个事物的正反两面,它的值只有两个,分别是truefalse

2、整型常量

  • 整型常量与Java中的十进制的整型常量相同,它的取值范围是Java语言中定义的常量·Long.MIN_VALUE·到·Long.MAX_VALUE·之间,即 [ − 2 63 , 2 63 − 1 ] [-2^{63}, 2^{63}-1] [263,2631]之间的整数。

3、浮点型常量

  • 浮点数常量用整数部分加小数部分表示,也可以用指数形式表示,例如,1.2E41.2都是合法的浮点数常量。浮点数常量的取值范围是Java语言中定义的常量Double.MIN_VALUEDouble.MAX_VALUE之间,即 [ 4.9 E − 324 , 1.8 E 308 ] [4.9E-324,1.8E308] [4.9E324,1.8E308]之间的浮点数。

4、字符串常量

  • 字符串常量是用单引号或双引号引起来的一连串字符。由于字符串常量需要用单引号或双引号引起来,所以字符串本身包含的单引号或双引号需要用反斜杠(\)进行转义,即用“\'”表示字面意义上的单引号,用“\"”表示字面意义上的双引号。如果字符串本身包含反斜杠(\),也要进行转义,即用“\\”表示字面意义上的一个反斜杠。
  • 需要注意的是,只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义,例如,'ab\'4c"d5\\e'表示的字符串是ab'4c"d5\e;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义,例如"ab'4c\"d5\\e"表示的字符串是ab'4c"d5\e

5、Null常量

  • Null常量用于表示变量引用的对象为空,它只有一个值,用null表示。

(六)EL访问数据

  • 目标:掌握EL中的点运算符(.)和方括号运算符([ ])的使用

1、EL的点运算符

  • EL中的点运算符,用于访问JSP页面中某些对象的属性,如JavaBean对象中的属性、List集合中的属性、Array数组中的属性等。
  • 用法示例:${student.name}
  • 在上述语法格式中,表达式${student.name}中点运算符的作用就是访问student对象中的name属性。

2、方括号运算符

  • EL中的中括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性,当获取的属性名中包含一些特殊符号,如“-”或“?”等非字母或数字的符号,就只能使用中括号运算符访问该属性。
  • 方括号运算符示例:${user["user-name"]}

3、EL运算法的应用

(1)点运算符和方括号运算符在某种情况下可以互换,如${student.name}等价于${student["name"]}
(2)中括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}用于访问集合或数组中第一个元素。
(3)中括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].age} 可以访问集合或数组中的第一个元素的age属性。

(七)EL中的运算符

  • 目标:掌握EL中的运算符的使用

1、算术运算符

算术运算符说明算术表达式结果
+${10 + 2}12
-${10 - 2}8
*${10 * 2}20
/(或div)${10 / 4}${10 div 2}2.5
%(或mod)取模(取余)${10 % 4}${10 mod 2}2
  • EL中的算术运算符用于对整数和浮点数的值进行算术运算。
  • -”运算符即可以作为减号,也可以作为负号。
  • /”或“div”运算符在进行除法运算时,商为小数。
  • EL的“+”运算符与Java的“+”运算符不同,它不能实现两个字符串之间的连接,如果使用该运算符连接两个不可以转换为数值型的字符串,将抛出异常;如果使用该运算符连接两个可以转换为数值型的字符串,EL会自动将这两个字符串转换为数值型,再进行加法运算。

2、比较运算符

  • EL中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的比较运算符执行的结果都是布尔类型。
比较运算符说明关系表达式结果
==(或eq)等于${10 == 2}${10 eq 2}false
!=(或ne)不等于${10 != 2}${10 ne 2}true
<(或lt)小于${10 < 2}${10 lt 2}false
>(或gt)大于${10 > 2}${10 gt 2}true
<=(或le)小于等于${10 <= 2}${10 le 2}false
>=(或ge)大于等于${10 >= 2}${10 ge 2}true
  • 比较运算符中的“==”是两个等号,千万不可只写一个等号。
  • 为了避免与JSP页面的标签产生冲突,对于后4种比较运算符,EL中通常使用上表中括号内的表示方式,例如,使用“lt”代替“<”运算符,如果运算符后面是数字,在运算符和数字之间至少要有一个空格,例如${1lt 2},但后面如果有其他符号时则可以不加空格,例如${1lt(1+1)}

3、逻辑运算符

  • EL中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。
逻辑运算符说明逻辑表达式结果
&&(and)逻辑与${true && false}${true and false}false
||(or)逻辑或${false || true}${false or true}true
  • 需要注意的是,在使用&&运算符时,如果有一个表达式结果为false,则整个表达式结果必为false;在使用||运算符时,如果有一个表达式的结果为true,则整个表达式结果必为true。

4、empty运算符

  • 在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀(prefix)运算符, 即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。
  • 语法格式:${empty expression}
  • 在上述语法格式中,expression用于指定要判断的变量或对象。
  • 定义两个request范围内的变量user1和user2,分别设置它们的值为null和""
<% request.setAttribute("user1", ""); %>
<% request.setAttribute("user2", null); %>
  • 通过empty运算符判断user1和user2是否为空
${empty user1}		// 返回值为true
${empty user2}		// 返回值为true
  • 由上述代码可知一个变量或对象为null 或空,代表的意义是不同的。null 表示这个变量没有指明任何对象,而空表示这个变量所属的对象内容为空,例如,空字符串、空的数组或者空的List容器。

5、条件运算符

  • EL中条件运算符(?:)用于执行某种条件判断,它类似于Java语言中的if-else语句。
  • 语法格式:${A ? B : C}
  • 在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B,并返回B的值作为整个表达式的结果;如果表达式A的计算结果为false,就执行表达式C,并返回C的值作为整个表达式的结果。例如,表达式${(1 == 2) ? 3 : 4}的结果就是4

6、小括号运算符

  • EL中的小括号用于改变其他运算符的优先级,例如,表达式${a * b + c},正常情况下会先计算a * b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个小括号运算符,将表达式修改为${a * (b + c)},则会先计算bc的和,再将计算的结果与a相乘。

7、运算优先级

  • EL中的运算符都有不同的运算优先级,当EL中包含多种运算符时,它们必须按照各自优先级的大小进行运算。
优先级运算符
1[ ] .
2( )
3-(unary)、not、!、empty
4*、/、div、%、mod
5+、-(binary)
6<、>、<=、>=、lt、gt、le、ge
7==、!=、eq、ne
8&&、and
9||、or
10? :
  • 注意:在应用EL取值时,没有数组的下标越界,没有空指针异常,没有字符串的拼接。

二、EL隐式对象

(一)EL隐式对象概述

  • 为了能够获得Web应用程序中的相关数据,EL提供了11个隐式对象,这些对象类似于JSP的内置对象,可以直接通过对象名进行各种操作。在EL的隐式对象中,除PageContext是JavaBean对象,对应于javax.servlet.jsp.PageContext类型外,其他的隐式对象都对应于java.util.Map类型。这些隐式对象可以分为页面上下文对象访问作用域范围的隐式对象访问环境信息的隐式对象3种。
隐式对象名称描述
pageContext对应于JSP页面中的pageContext对象
pageScope代表page域中用于保存属性的Map对象
requestScope代表request域中用于保存属性的Map对象
sessionScope代表session域中用于保存属性的Map对象
applicationScope代表application域中用于保存属性的Map对象
param表示一个保存了所有请求参数的Map对象
paramValues表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个String类型数组
header表示一个保存了所有http请求头字段的Map对象
headerValues表示一个保存了所有http请求头字段的Map对象,返回String类型数组
cookie用于获取使用者的cookie值,cookie的类型是Map
initParam表示一个保存了所有Web应用初始化参数的Map对象
  • 在上表列举的隐式对象中,pageContext可以获取其他10个隐式对象,pageScope、requestScope、sessionScope、applicationScope是用于获取指定域的隐式对象;param和paramValues是用于获取请求参数的隐式对象,header和headerValues是用于获取HTTP请求消息头的隐式对象;cookie是用于获取Cookie信息的隐式对象;initParam是用于获取Web应用初始化信息的隐式对象。

(二)pageContext对象

  • 目标:熟悉使用pageContext对象获取JSP页面

1、pageContext对象概述

  • 为了获取JSP页面的隐式对象,可以使用EL中的pageContext隐式对象。
  • pageContext隐式对象用法示例代码:${pageContext.response.characterEncoding}
  • 代码功能:pageContext对象用于获取response对象中的characterEncoding属性。

2、pageContext对象案例

  • 在web目录下创建一个demo02.jsp文件,演示pageContext隐式对象的用法
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>demo02 - 演示pageContext对象</title>
    </head>
    <body>
        请求URI为:${pageContext.request.requestURI} <br />
        Content-Type响应头:${pageContext.response.contentType} <br />
        服务器信息:${pageContext.servletContext.serverInfo} <br />
        Servlet注册名:${pageContext.servletConfig.servletName} <br />
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo02.jsp
    在这里插入图片描述
  • 注意:不要将EL中的隐式对象与JSP中的隐式对象混淆,只有pageContext对象是它们所共有的,其他隐式对象则毫不相关。

(三)Web域相关对象

  • 目标:熟悉使用pageContext对象提供的4个用于访问作用域范围的隐式对象

1、Web域相关对象概述

  • 在EL中提供了4 个用于访问作用域范围的隐式对象,即pageScoperequestScopesessionScopeapplicationScope应用这4个隐式对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、Request、session及application)查找相应的标识符。它们与JSP中的pagerequestsessionapplication内置对象类似,只不过这4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息。
  • pageScoperequestScopesessionScopeapplicationScope这4个隐式对象都可以通过setAttribute()方法存储属性,通过getAttribute()方法获取属性。

2、Web域相关对象案例

  • 在web目录下创建一个demo03.jsp文件,演示这4个隐式对象如何访问JSP域对象中的属性
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>demo03 - 演示Web域相关对象</title>
    </head>
    <body>
        <% pageContext.setAttribute("userName", "无心剑"); %>
        <% request.setAttribute("bookName", "动态网站开发"); %>
        <% session.setAttribute("userName", "陈燕文"); %>
        <% application.setAttribute("bookName", "大数据实时处理"); %>
        表达式\${pageScope.userName}的值为:${pageScope.userName} <br />
        表达式\${requestScope.bookName}的值为:${requestScope.bookName} <br />
        表达式\${sessionScope.userName}的值为:${sessionScope.userName} <br />
        表达式\${applicationScope.bookName}的值为:${applicationScope.bookName} <br />
        表达式\${userName}的值为:${userName}
    </body>
</html>
  • 在·demo03.jsp文件中,使用pageScoperequestScopesessionScopeapplicationScope这4个隐式对象成功地获取到了相应JSP域对象中的属性值。需要注意的是,使用EL获取某个域对象中的属性时,也可以不使用这些隐式对象指定查找域,而直接引用域中的属性名称,例如,表达式${userName}就是在pagerequestsessionapplication这4个作用域内按顺序依次查找userName属性。
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo03.jsp
    在这里插入图片描述

(四)访问环境信息的隐式对象

  • 目标:熟悉使用param和paramValues两个隐式对象获取客户端传递的请求参数

1、获取客户端传递的请求参数

  • 在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL提供了paramparamValues两个隐式对象,这两个隐式对象专门用于获取客户端访问JSP页面时传递的请求参数。
(1)param对象的语法
  • param对象用于获取请求参数的某个值,它是Map类型,与request.getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。
  • param对象的语法格式:${param.num}
(2)paramValues对象的语法
  • 如果一个请求参数有多个值,可以使用paramValues对象获取请求参数的所有值,该对象返回请求参数所有值组成的数组,如果要获取某个请求参数的第一个值,可以使用代码:${paramValues.nums[0]}

2、案例演示获取客户端传递的请求参数

  • 在web目录下创建一个demo04.jsp文件,演示获取客户端传递的请求参数
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>demo04 - 演示获取客户端传递的请求参数</title>
    </head>
    <body style="text-align: center;">
        <form action="${pageContext.request.contextPath}/demo04.jsp">
            num1:<input type="text" name="num1"><br />
            num2:<input type="text" name="num"><br />
            num3:<input type="text" name="num"><br /> <br />
            <input type="submit" value="提交" />&nbsp;&nbsp;
            <input type="submit" value="重置" /><hr />
            num1: ${param.num1} <br />
            num2: ${paramValues.num[0]} <br />
            num3: ${paramValues.num[1]} <br />
        </form>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo04.jsp
    在这里插入图片描述
  • 在上图的表单中输入三个数字,分别为100、200、300,然后单击提交按钮
    在这里插入图片描述
  • 注意:如果一个请求参数有多个值,那么在使用param获取请求参数时,则返回请求参数的第一个值

(五)Cookie对象

  • 目标:熟悉在JSP开发中获取客户端的Cookie对象

1、Cookie对象概述

  • 在JSP开发中,经常需要获取客户端的Cookie信息,为此,在EL中,提供了Cookie隐式对象,该对象是一个集合了所有Cookie信息的Map集合,Map集合中元素的键为各个Cookie的名称,值则为对应的Cookie对象。
  • cookie对象用法示例
获取cookie对象的信息:${cookie.userName}
获取cookie对象的名称:${cookie.userName.name}
获取cookie对象的值:${cookie.userName.value}

2、Cookie对象案例

  • 在web目录下创建一个demo05.jsp文件,演示如何获取Cookie对象中的信息
    在这里插入图片描述
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo05.jsp,由于是浏览器第一次访问demo05.jsp页面,此时,服务器还没有接收到名为userNameCookie信息,所以,浏览器窗口中不会显示Cookie对象的信息。
    在这里插入图片描述
  • 刷新页面,查看结果
    在这里插入图片描述
  • 由上图可知,浏览器窗口中显示了获取到的Cookie信息,这是因为第一次访问服务器时,服务器会向浏览器回写一个Cookie,此时的Cookie信息是存储在浏览器中的,当刷新浏览器,第二次访问demo05.jsp页面时,由于浏览器中已经存储了名为userName的Cookie信息,浏览器会将此Cookie信息一同发送给服务器,这时使用表达式${cookie.userName.name}${cookie.userName.value}便可以获取Cookie的名称和值。

(六)initParam对象

  • 目标:熟悉使用initParam对象获取Web应用初始化参数的值

1、initParam对象概述

  • EL的initParam隐式对象用于获取Web应用初始化参数的值。
  • 使用initParam对象获取参数author的代码:${initParam.author}

2、initParam对象案例

  • web.xml里设置Web应用初始化参数
    在这里插入图片描述
<?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>author</param-name>
        <param-value>无心剑</param-value>
    </context-param>
</web-app>
  • 在web目录下创建一个demo06.jsp文件,演示通过initParam对象获取Web应用初始化参数
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>demo06 - 演示通过initParam对象获取Web应用初始化参数</title>
    </head>
    <body>
        Web应用初始化参数author的值:${initParam.author}
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo06.jsp
    在这里插入图片描述

三、JSTL

(一)什么是JSTL

  • 目标:了解JSTL是什么,能够知道JSTL用于做什么

1、JSTL概述

  • 从JSP 1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。为此,许多Web应用厂商都制定了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库(JavaServer Pages Standard Tag Library),简称JSTL

2、JSTL的标签库

  • 虽然JSTL叫做标准标签库,但实际上它是由5个功能不同的标签库组成。这5个标签库分别是核心标签库、国际化/格式化标签库、SQL标签库、XML标签库和函数标签库。在使用这些标签库之前,必须在JSP页面的顶部使用<%@ taglib%>指令定义引用的标签库和访问前缀。
(1)核心标签库
  • 指令格式:<%@ taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>
  • 核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签。例如,用于输出文本内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签等。
(2)格式标签库
  • 指令格式:<%@ taglib prefix "fmt" url="http://java.sun.com/jsp/jstl/fmt"%>
  • 国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。
(3)SQL标签库
  • 指令格式:<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>
  • SQL标签库,它包含了用于访问数据库和操作数据库的标签。例如,获取数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为显示层,一般不会在JSP页面中直接操作数据库,所以,JSTL中提供的这套标签库不经常使用
(4)XML标签库
  • 指令格式:<%@ taglib prefx="xml" url="http://java.sun.com/jsp/jstl/xml" %>
  • XML文档的标签库,它包含对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容,以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便。
(5)函数标签库
  • 指令格式:<%@ taglib prefix= "fn" url="http://java.sun.com/jsp/jstl/functions"%>
  • 函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度等。

(二)JSTL的下载与使用

  • 目标:熟悉JSTL的下载和使用

1、JSTL的下载

  • 从Apache的网站下载JSTLJARjakarta-taglibs-standard-1.1.2.zip,将下载好的JSTL安装包进行解压,此时,在lib目录下可以看到两个JAR文件,分别为jstl.jarstandard.jar。其中,jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于实现JSTL.class文件以及JSTL5个标签库描述符文件(TLD)。

2、导入JSTL包

  • WEB-INF里创建lib目录,将jstl.jarstandard.jar这两个文件复制到lib目录
    在这里插入图片描述
  • jstl.jarstandard.jar作为库添加到项目
    在这里插入图片描述
    在这里插入图片描述
  • 单击【OK】按钮
    在这里插入图片描述

3、案例演示标签库

  • 在web目录里创建demo07.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
    <head>
        <title>demo07 - 演示标签库</title>
    </head>
    <body>
        <h1 style="color: red; text-align: center">
            <c:out value="欢迎访问泸州职业技术学院~"/>
        </h1>
        <jsp:useBean id="now" class="java.util.Date" />
        <h3 style="text-align: center">
            <fmt:formatDate value="${now}" pattern="yyyy年MM月dd日 HH:mm:ss" />
        </h3>
    </body>
</html>
  • taglib指令的uri属性用于指定引入标签库描述符文件的URIprefix属性用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo07.jsp
    在这里插入图片描述

四、JSTL中的Core标签库

(一)表达式标签

  • 目标:掌握JSTL核心标签库中的<c:out><c:remove>标签

1、<c:out>标签

(1)<c:out>标签概述
  • 在JSP页面中,最常见的操作就是向页面输出一段文本信息,为此,Core标签库提供了<c:out>标签,该标签可以将一段文本内容或表达式的结果输出到客户端。如果<c:out>标签输出的文本内容中包含需要进行转义的特殊字符,例如><&'" 等,<c:out>标签会默认对它们进行HTML编码转换后再输出。
(2)<c:out>标签两种语法格式
  • 语法1:没有标签体的情况
<c:out value="value" [default="defaultValue"][escapeXml="{true|false}"]/>
  • 语法2:有标签体的情况
<c:out value="value" [escapeXml="{true|false}"]>
    defaultValue 
</c:out>
  • <c:out>标签的语法格式中,没有标签体的情况,需要使用default属性指定默认值,有标签体的情况,在标签体中指定输出的默认值。
属性作用
value用于指定输出的文本内容
default用于指定当value属性为null时所输出的默认值,该属性是可选的(中括号中的属性都是可选的)
escapeXml用于指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出,默认值为true
  • 注意:只有当value属性值为null时,<c:out>标签才会输出默认值,如果没有指定默认值,则默认输出空字符串。
(3)<c:out>标签案例
案例1、演示default属性
  • 在web目录里创建demo08.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo08 - 演示default属性</title>
    </head>
    <body>
        <%--第1个out标签 --%>
        userName属性的值:
        <c:out value="${param.username}" default="用户名未知"/> <br />
        <%--第2个out标签 --%>
        userName属性的值:
        <c:out value="${param.username}">
            用户名未知
        </c:out>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo08.jsp
    在这里插入图片描述

  • 浏览器窗口输出了两个默认值均为用户名未知,这是通过使用<c:out>标签的default属性以及标签体两种方式来设置的默认值,这两种方式实现的效果相同。由于在客户端访问demo08.jsp页面时,并没有传递username参数,所以表达式${param.username}的值为null<c:out>标签就会输出默认值。

  • 如果不想让<c:out>标签输出默认值,可以在客户端访问demo08.jsp页面时传递一个参数,在浏览器地址栏中输入http://localhost:8080/ELJSTLDemo/demo08.jsp?username=无心剑,查看浏览器窗口中显示的结果
    在这里插入图片描述

  • 浏览器窗口中输出了无心剑,这是因为在客户端访问demo08.jsp页面时传递了一个username参数,该参数的值为无心剑,因此,表达式${param.username}就会获取到这个参数值,并将其输出到JSP页面中。

案例2、演示escapeXML属性
  • <c:out>标签有一个重要的属性escapeXml,该属性可以将特殊的字符进行HTML编码转换后再输出。通过一个案例演示如何使用escapeXml属性将特殊字符进行转换。
  • 在web目录里创建demo09.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo09 - 演示escapeXml属性</title>
    </head>
    <body>
        <c:out value="${param.username}" escapeXml="false">
            <meta http-equiv="refresh" content="0;url=http://www.lzy.edu.cn" />
        </c:out>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo09.jsp
    在这里插入图片描述
  • 浏览器窗口中显示的是https://www.lzy.edu.cn/网站的信息,这是因为在<c:out>标签中将escapeXml的属性值设置为false,因此,<c:out>标签不会对特殊字符进行HTML转换,<meta>标签便可以发挥作用,在访问demo08.jsp页面时就会跳转到https://www.lzy.edu.cn/网站。
  • 如果想对页面中输出的特殊字符进行转义,可以将escapeXml属性的值设置为true
    在这里插入图片描述
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo09.jsp
    在这里插入图片描述
  • 将文件demo09.jsp<c:out>标签的escapeXml属性值设置为true后,在JSP页面中输入的<meta>标签便会进行HTML编码转换,最终以字符串的形式输出了。注意:如果在<c:out>标签中不设置escapeXml属性,则该属性的默认值为true

2、<c:remove>标签

(1)<c:remove>标签概述
  • <c:remove>标签用于移除指定的JSP范围内的变量
(2)<c:remove>标签语法格式
  • <c:remove var="name" [scope=”范围”]/>
(3)<c:remove>标签参数含义
参数含义
var用于指定要移除的变量名。
scope用于指定变量的有效范围,可选值有pagerequestsessionapplication,默认值为page。如果在该标签中没有指定变量的有效范围,那么将分别在pagerequestsessionapplication的范围内查找要移除的变量并移除。例如,在一个页面中,存在不同范围的两个同名变量,当不指定范围时移除该变量,这两个范围内的变量都将被移除。因此,在移除变量时,最好指定变量的有效范围。
(4)<c:remove>标签案例
  • 在web目录里创建demo10.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo10 - 演示移除标签</title>
    </head>
    <body>
        <%
            pageContext.setAttribute("username", "无心剑");
            session.setAttribute("username", "陈燕文");
        %>
        <c:remove var="username" scope="page"/>
        用户名:<c:out value="${username}"/>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo10.jsp
    在这里插入图片描述
  • 先定义了page域和session域的username,然后移除了page域的username,剩下一个session域的username,其值为陈燕文,所以用输出标签输出username时,浏览器窗口显示的是陈燕文

(二)流程控制标签

  • 目标:掌握JSTL核心标签库中的<c:if><c:choose><c:when><c:otherwise>标签实现程序的流程控制

  • 流程控制在程序中会根据不同的条件执行不同的代码产生不同的运行结果,使用流程控制可以处理程序中的逻辑问题。在JSTL中包含<c:if><c:choose> 等流程控制标签可以实现程序的流程控制。

1、<c:if>标签

(1)<c:if>标签概述
  • 在程序开发中,经常需要使用if语句进行条件判断,如果要在JSP页面中进行条件判断,就需要使用Core标签库提供的<c:if>标签,该标签专门用于完成JSP页面中的条件判断。
(2 )<c:if>标签语法格式
  • 语法1:没有标签体的情况
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>
  • 语法2:有标签体的情况,在标签体中指定要输出的内容
<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
	body content
</c:if>
(3)<c:if>标签三个属性
属性作用
test用于设置逻辑表达式
var用于指定逻辑表达式中变量的名字
scope用于指定var变量的作用范围,默认值为page
(4)<c:if>标签案例
  • 在web目录里创建demo11.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo11 - 演示单分支标签</title>
    </head>
    <body>
        <c:set value="1" var="visitCount" />
        <c:if test="${visitCount==1}">
            <h3 style="text-align: center">你第一次访问~欢迎访问泸职院~</h3>
        </c:if>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo11.jsp
    在这里插入图片描述

2、<c:choose>、<c:when>和<c:otherwise>标签

(1)三个标签概述
  • 在程序开发中不仅需要使用if条件语句,还经常会使用if-else语句,为了在JSP页面中也可以完成同样的功能,Core标签库提供了<c:choose>标签,该标签用于指定多个条件选择的组合边界,它必须与<c:when><c:otherwise>标签一起使用。
(2)<c:choose>标签
  • <c:choose>标签没有属性,在它的标签体中只能嵌套一个或多个<c:when>标签,零个或一个<c:otherwise>标签,并且同一个<c:choose>标签中所有的<c:when>子标签必须出现在<c:otherwise>子标签之前。
  • 语法格式
<c:choose>
	Body content(<when> and <otherwise> subtags) 
</c:choose>
(3)<c:when>标签
  • <c:when>标签只有一个test属性,该属性的值为布尔类型。test属性支持动态值,其值可以是一个条件表达式,如果条件表达式的值为true,就执行这个<c:when>标签体的内容
  • 语法格式
<c:when test="testCondition">
	Body content
</c:when>
(4)<c:otherwise>标签
  • <c:otherwise>标签没有属性,它必须作为<c:choose>标签最后分支出现,当所有的<c:when>标签的test条件都不成立时,才执行和输出<c:otherwise>标签体的内容
  • 语法格式
<c:otherwise>
	conditional block
</c:otherwise>
(5)三个标签案例
  • 在web目录里创建demo12.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo12 - 演示多分支标签</title>
    </head>
    <body>
        <c:choose>
            <c:when test="${empty param.username}">
                未知用户~
            </c:when>
            <c:when test="${param.username=='无心剑'}">
                ${param.username}是教师~
            </c:when>
            <c:otherwise>
                ${param.username}是学生~
            </c:otherwise>
        </c:choose>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo12.jsp
    在这里插入图片描述
  • 当使用http://localhost:8080/ELJSTLDemo/demo12.jsp地址直接访问demo12.jsp页面时,浏览器中显示的信息为未知用户~,这是因为在访问demo12.jsp页面时并没有在URL地址中传递参数,<c:when test="${empty param.username}">标签中test属性的值为true,便会输出<c:when>标签体中的内容。
  • 访问http://localhost:8080/ELJSTLDemo/demo12.jsp?username=无心剑
    在这里插入图片描述
  • 浏览器中显示的信息为无心剑是教师~,这是因为在访问demo12.jsp页面时传递了一个参数,当执行<c:when test="${empty param.username}">标签时,test属性的值为false,不会输出标签体中的内容。然后执行<c:when test="${param.username=='无心剑' }">标签,当执行到该标签时,会判断test属性值是否为true,由于在URL地址中传递了参数username=无心剑,所以test属性值为true,就会输出该标签体中的内容无心剑是教师~
  • 访问http://localhost:8080/ELJSTLDemo/demo12.jsp?username=陈燕文
    在这里插入图片描述
  • 浏览器中显示的信息为陈燕文是学生~,这是因为在访问demo12.jsp页面时传递了一个参数,当执行<c:when test="${empty param.username}">标签时,test属性的值为false,不会输出标签体中的内容。然后执行<c:when test="${param.username=='无心剑' }">标签,当执行到该标签时,会判断test属性值是否为false,不会输出标签体中的内容。于是输出<c:otherwise>标签体中的内容陈燕文是学生~

(三)循环标签

  • 目标:掌握JSTL核心标签库中循环标签<c:forEach>

1、<c:forEach>标签概述

  • 在JSP页面中,经常需要对集合对象进行循环迭代操作,为此,Core标签库提供了一个<c:forEach>标签,该标签专门用于迭代集合对象中的元素,如SetListMap数组等,并且能重复执行标签体中的内容。

2、<c:forEach>标签语法格式

  • 语法1:迭代包含多个对象的集合
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
[begin="begin"] [end="end"] [step="step"]>
	body content
</c:forEach>
  • 语法2:迭代指定范围内的集合
<c:forEach [var="varName"] [varStatus="varStatusName"]
begin="begin" end="end" [step="step"]>
	body content
</c:forEach>

3、<c:forEach>标签属性

属性作用
var用于将当前迭代到的元素保存到page域中的名称。
items用于指定将要迭代的集合对象。
varStatus用于指定将当前迭代状态信息的对象保存到page域中的名称。
begin用于指定从集合中第几个元素开始进行迭代,begin的索引值从0开始, 如果没有指定items属性,就从begin指定的值开始迭代,直到迭代结束为止。
step用于指定迭代的步长,即迭代因子的增量。
  • <c:forEach>标签的varStatus属性用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的变量,这个变量包含了从集合中取出元素的状态信息。使用<c:forEach>标签的varStatus属性可以获取以下信息。
参数含义
count表示元素在集合中的序号,从1开始计数
index表示当前元素在集合中的索引,从0开始计数
first表示当前是否为集合中的第一个元素
last表示当前是否为集合中的最后一个元素

4、<c:forEach>标签案例

  • 在web目录里创建demo13.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<html>
    <head>
        <title>demo13 - 演示循环标签</title>
    </head>
    <body>
        <%
            String[] fruits = {"苹果", "橘子", "葡萄", "香蕉"};
        %>
        String数组中的元素:
        <c:forEach var="name" items="<%=fruits%>">
            ${name} &nbsp;&nbsp;
        </c:forEach>
        <br />

        <%
            Map userMap = new HashMap();
            userMap.put("01", "北京");
            userMap.put("02", "上海");
            userMap.put("03", "广州");
        %>
        HashMap集合中的元素:
        <c:forEach var="entry" items="<%=userMap%>">
            ${entry.key} : ${entry.value} &nbsp;&nbsp;
        </c:forEach>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo13.jsp
    在这里插入图片描述
  • 在部分情况下,需要指定<c:forEach>标签循环的次数、起始索引和结束索引,在JSTL的Core标签库中,<c:forEach>标签的beginendstep属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以迭代集合对象中某一范围内的元素。
  • 在web目录里创建demo14.jsp
    在这里插入图片描述
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo14 - 演示循环标签</title>
    </head>
    <body>
        colorsList集合(指定迭代范围和步长):
        <%
            List colorsList=new ArrayList();
            colorsList.add("red");
            colorsList.add("yellow");
            colorsList.add("blue");
            colorsList.add("green");
            colorsList.add("black");
        %>
        <c:forEach var="color" items="<%=colorsList%>"
                   begin="1" end="3" step="2">
            ${color}&nbsp;
        </c:forEach>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo14.jsp
    在这里插入图片描述

(四)URL相关标签

  • 目标:熟悉JSTL核心标签库中的URL相关标签

1、URL相关标签概述

  • 在开发一个Web应用程序时,通常会在JSP页面中完成URL的重写以及重定向等特殊功能,为了完成这些功能,Core标签库也提供了相应标签,这些标签包括<c:param><c:redirect><c:url>。其中<c:param>标签用于获取URL地址中的附加参数,<c:url>标签用于按特定的规则重新构造URL,<c:redirect>标签负责重定向。

2、<c:param>标签

(1)<c:param>标签概述
  • <c:param>标签通常嵌套在<c:url>标签内使用。
(2)<c:param>标签语法格式
  • 语法1:使用value属性指定参数的值
<c:param name="name" value="value">
  • 语法2:在标签体中指定参数的值
<c:param name="name">
	parameter value
</c:param>
(3)<c:param>标签属性
属性作用
name用于指定参数的名称
value用于指定参数的值,当使用<c:param>标签为一个URL地址附加参数时,它会自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%e4%b8%ad%e5%9b%bd”后再附加到URL地址后面,这也是使用<c:param>标签的最大好处。

3、<c:url>标签

(1)<c:url>标签概述
  • <c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。这个标签在需要的时候会自动重写URL。
(2)<c:url>标签语法格式
  • 语法1:没有标签实体的情况
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
  • 语法2:有标签实体的情况,在标签体中指定构造URL参数
<c:url value="value" [context="context"] [var="varName"] [scope="{page|request|session|application}"]>
	<c:param>标签
</c:url>
(3)<c:url>标签属性
属性作用
value用于指定构造的URL
context用于指定导入同一个服务器下其他Web应用的名称
var用于指定将构造的URL地址保存到域对象的属性名称
scope用于将构造好的URL保存到域对象中

4、URL相关标签案例

  • 在web目录里创建demo15.jsp
    在这里插入图片描述
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>demo15 - 演示URL相关标签</title>
    </head>
    <body>
        使用绝对路径构造URL:
        <c:url var="myURL" value="http://localhost:8080/ELJSTLDemo/demo08.jsp">
            <c:param name="username" value="陈燕文" />
        </c:url>
        <a href="${myURL}">demo08.jsp</a><br />
        使用相对路径构造URL:
        <c:url var="myURL" value="demo08.jsp?username=无心剑" />
        <a href="${myURL}">demo08.jsp</a>
    </body>
</html>
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo15.jsp
    在这里插入图片描述

  • 由上图可知,在浏览器窗口中已经显示了demo15.jsp页面的内容,此时查看该页面的源代码,可以看到如下信息
    在这里插入图片描述

  • 单击第一个超链接
    在这里插入图片描述

  • 返回上一个页面
    在这里插入图片描述

  • 单击第二个超链接
    在这里插入图片描述

五、本节小结

  • 本节主要讲解了EL的基本语法、EL常见隐式对象、JSTL的下载和使用以及JSTL常见标签库等知识,通过本节的学习,读者能够了解什么是EL和JSTL,可以熟练掌握EL的基本语法的格式、EL的常见隐式对象以及JSTL中的常见Core标签库等知识点。

六、课后作业

任务:根据参数请求显示不同的页面

  • 页面参数?action=XXX
  • 在web目录里创建demo16.jsp
    在这里插入图片描述
  • 启动服务器,访问http://localhost:8080/ELJSTLDemo/demo16.jsp
    在这里插入图片描述
  • 演示不同参数请求显示不同页面
    在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

howard2005

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值