本文主要是介绍动态网站开发讲课笔记07:EL和JSTL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 零、本节学习目标
- 一、EL
- (一)EL基本语法
- 1、EL的概念
- 2、EL的语法
- 3、案例演示
- (1)用EL读取保存的信息
- (2)使用Java代码与EL获取信息的对比
- 4、EL基本语法的特点
- (二)EL中的标识符
- 1、EL中标识符的规范
- 2、EL中标识符的示例
- (1)合法标识符
- (2)非法标识符
- (三)EL中的关键字
- (四)EL中的变量
- 1、基本概念
- 2、简单示例
- (五)EL中的常量
- 1、布尔常量
- 2、整型常量
- 3、浮点型常量
- 4、字符串常量
- 5、Null常量
- (六)EL访问数据
- 1、EL的点运算符
- 2、方括号运算符
- 3、EL运算法的应用
- (七)EL中的运算符
- 1、算术运算符
- 2、比较运算符
- 3、逻辑运算符
- 4、empty运算符
- 5、条件运算符
- 6、小括号运算符
- 7、运算优先级
- 二、EL隐式对象
- (一)EL隐式对象概述
- (二)pageContext对象
- 1、pageContext对象概述
- 2、pageContext对象案例
- (三)Web域相关对象
- 1、Web域相关对象概述
- 2、Web域相关对象案例
- (四)访问环境信息的隐式对象
- 1、获取客户端传递的请求参数
- (1)param对象的语法
- (2)paramValues对象的语法
- 2、案例演示获取客户端传递的请求参数
- (五)Cookie对象
- 1、Cookie对象概述
- 2、Cookie对象案例
- (六)initParam对象
- 1、initParam对象概述
- 2、initParam对象案例
- 三、JSTL
- (一)什么是JSTL
- 1、JSTL概述
- 2、JSTL的标签库
- (1)核心标签库
- (2)格式标签库
- (3)SQL标签库
- (4)XML标签库
- (5)函数标签库
- (二)JSTL的下载与使用
- 1、JSTL的下载
- 2、导入JSTL包
- 3、案例演示标签库
- 四、JSTL中的Core标签库
- (一)表达式标签
- 1、<c:out>标签
- (1)<c:out>标签概述
- (2)<c:out>标签两种语法格式
- (3)<c:out>标签案例
- 案例1、演示default属性
- 案例2、演示escapeXML属性
- 2、<c:remove>标签
- (1)<c:remove>标签概述
- (2)<c:remove>标签语法格式
- (3)<c:remove>标签参数含义
- (4)<c:remove>标签案例
- (二)流程控制标签
- 1、<c:if>标签
- (1)<c:if>标签概述
- (2 )<c:if>标签语法格式
- (3)<c:if>标签三个属性
- (4)<c:if>标签案例
- 2、<c:choose>、<c:when>和<c:otherwise>标签
- (1)三个标签概述
- (2)<c:choose>标签
- (3)<c:when>标签
- (4)<c:otherwise>标签
- (5)三个标签案例
- (三)循环标签
- 1、<c:forEach>标签概述
- 2、<c:forEach>标签语法格式
- 3、<c:forEach>标签属性
- 4、<c:forEach>标签案例
- (四)URL相关标签
- 1、URL相关标签概述
- 2、<c:param>标签
- (1)<c:param>标签概述
- (2)<c:param>标签语法格式
- (3)<c:param>标签属性
- 3、<c:url>标签
- (1)<c:url>标签概述
- (2)<c:url>标签语法格式
- (3)<c:url>标签属性
- 4、URL相关标签案例
- 五、本节小结
- 六、课后作业
- 任务:根据参数请求显示不同的页面
零、本节学习目标
- 掌握EL的基本语法
- 熟悉EL中常见的隐式对象
- 了解JSTL标签库
- 熟悉JSTL的下载与使用
- 掌握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的作用域(page
、request
、 session
与 application
)。
(二)EL中的标识符
- 目标:熟悉EL中的标识符
1、EL中标识符的规范
- 在EL中,经常需要使用一些符号标记一些名称,如变量名、自定义函数名等,这些符号被称为标识符。EL中的标识符可以由任意的大小写字母、数字和下划线组成,为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范。
(1)不能以数字开头。
(2)不能是EL中的关键字,如and
、or
、gt
等。
(3)不能是EL隐式对象,如pageContext
。
(4)不能包含单引号('
)、双引号("
)、减号(-
)和正斜线(/
)等特殊字符。
2、EL中标识符的示例
(1)合法标识符
username
username123
user_name
_userName
(2)非法标识符
123username
or
user"name
pageContext
(三)EL中的关键字
- 目标:熟悉EL中的关键字
- 关键字就是编程语言里事先定义好并赋予了特殊含义的单词,和其他语言一样,EL中也定义了许多关键字,如
false
、not
等。 - EL所有的关键字
1 | 2 | 3 | 4 |
---|---|---|---|
and | eq | gt | true |
instanceof | or | ne | le |
false | empty | not | lt |
ge | null | div | mod |
(四)EL中的变量
- 目标:熟悉EL中的变量
1、基本概念
- EL中的变量就是一个基本的存储单元,EL中的变量不用事先定义就可以直接使用。EL可以将变量映射到一个对象上。
2、简单示例
${message}
- 在上述示例中,
message
就是一个变量,通过表达式${message}
就可以访问变量message
的值。
(五)EL中的常量
- 目标:熟悉EL中的常量
1、布尔常量
- 布尔常量用于区分一个事物的正反两面,它的值只有两个,分别是
true
和false
。
2、整型常量
- 整型常量与Java中的十进制的整型常量相同,它的取值范围是Java语言中定义的常量·Long.MIN_VALUE·到·Long.MAX_VALUE·之间,即 [ − 2 63 , 2 63 − 1 ] [-2^{63}, 2^{63}-1] [−263,263−1]之间的整数。
3、浮点型常量
- 浮点数常量用整数部分加小数部分表示,也可以用指数形式表示,例如,
1.2E4
和1.2
都是合法的浮点数常量。浮点数常量的取值范围是Java语言中定义的常量Double.MIN_VALUE
到Double.MAX_VALUE
之间,即 [ 4.9 E − 324 , 1.8 E 308 ] [4.9E-324,1.8E308] [4.9E−324,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)}
,则会先计算b
与c
的和,再将计算的结果与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
个用于访问作用域范围的隐式对象,即pageScope
、requestScope
、sessionScope
和applicationScope
。应用这4个隐式对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、Request、session及application)查找相应的标识符。它们与JSP中的page
、request
、session
及application
内置对象类似,只不过这4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息。 pageScope
、requestScope
、sessionScope
和applicationScope
这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
文件中,使用pageScope
、requestScope
、sessionScope
和applicationScope
这4个隐式对象成功地获取到了相应JSP域对象中的属性值。需要注意的是,使用EL获取某个域对象中的属性时,也可以不使用这些隐式对象指定查找域,而直接引用域中的属性名称,例如,表达式${userName}
就是在page
、request
、session
、application
这4个作用域内按顺序依次查找userName
属性。 - 启动服务器,访问
http://localhost:8080/ELJSTLDemo/demo03.jsp
(四)访问环境信息的隐式对象
- 目标:熟悉使用param和paramValues两个隐式对象获取客户端传递的请求参数
1、获取客户端传递的请求参数
- 在JSP页面中,经常需要获取客户端传递的请求参数,为此,EL提供了
param
和paramValues
两个隐式对象,这两个隐式对象专门用于获取客户端访问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="提交" /> <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页面,此时,服务器还没有接收到名为userName
的Cookie
信息,所以,浏览器窗口中不会显示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/javaeehttp://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的网站下载
JSTL
的JAR
包jakarta-taglibs-standard-1.1.2.zip
,将下载好的JSTL安装包进行解压,此时,在lib
目录下可以看到两个JAR
文件,分别为jstl.jar
和standard.jar
。其中,jstl.jar
文件包含JSTL规范中定义的接口和相关类,standard.jar
文件包含用于实现JSTL
的.class
文件以及JSTL
中5
个标签库描述符文件(TLD
)。
2、导入JSTL包
- 在
WEB-INF
里创建lib
目录,将jstl.jar
和standard.jar
这两个文件复制到lib
目录
- 将
jstl.jar
和standard.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
属性用于指定引入标签库描述符文件的URI
,prefix
属性用于指定引入标签库描述符文件的前缀
,在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 | 用于指定变量的有效范围,可选值有page 、request 、session 和application ,默认值为page 。如果在该标签中没有指定变量的有效范围,那么将分别在page 、request 、 session 和application 的范围内查找要移除的变量并移除。例如,在一个页面中,存在不同范围的两个同名变量,当不指定范围时移除该变量,这两个范围内的变量都将被移除。因此,在移除变量时,最好指定变量的有效范围。 |
(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>
标签,该标签专门用于迭代集合对象中的元素,如Set
、List
、Map
、数组
等,并且能重复执行标签体中的内容。
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} </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} </c:forEach></body>
</html>
- 启动服务器,访问
http://localhost:8080/ELJSTLDemo/demo13.jsp
- 在部分情况下,需要指定
<c:forEach>
标签循环的次数、起始索引和结束索引,在JSTL的Core标签库中,<c:forEach>
标签的begin
、end
和step
属性分别用于指定循环的起始索引、结束索引和步长。使用这些属性可以迭代集合对象中某一范围内的元素。 - 在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} </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
- 演示不同参数请求显示不同页面
这篇关于动态网站开发讲课笔记07:EL和JSTL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!