JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
这个就有疑问了EL表达式也是封装一些jsp中方法,两者又有什么不同呢?
而两者存在都是了一件事情,那就是让JSP看着更加简洁,以及比使用脚本的时候更加方便,不好的地方自然也是需要在记住一套代码逻辑以及实现方式。
首先说一下JSTL由五个不同功能的标签库组成。
| 功能范围 | URI | 前缀 |
|---|---|---|
核心标签库(重点) | http://java.sun.com/jsp/jstl/core | c |
| 格式化 | http://java.sun.com/jsp/jstl/fmt | fmt |
| 函数 | http://java.sun.com/jsp/jstl/functions | fn |
| 数据库(现在几乎不用) | http://java.sun.com/jsp/jstl/sql | sql |
| XML(现在几乎不用) | http://java.sun.com/jsp/jstl/xml | x |
这个就需要前面聊的JSP中的指令标签的一个:
Taglib指令:JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
在使用过需要引用:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
不过在引用之前,还是需要导入jar包的。
下载官网:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。

现在开始聊一些标签具体用法,然后演示一下:
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
一般把核心标签用的标识符c,所以prefix="c" 如果修改为prefix="g" 那标识符就是g
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
| 标签 | 描述 |
|---|---|
| 用于在JSP中显示数据,就像<%= … > | |
| 用于保存数据 | |
| 用于删除数据 | |
| 用来处理产生错误的异常状况,并且将错误信息储存起来 | |
| 与我们在一般程序中用的if一样 | |
| 本身只当做 | |
| 检索一个绝对或相对 URL,然后将其内容暴露给页面 | |
| 基础迭代标签,接受多种集合类型 | |
| 根据指定的分隔符来分隔内容并迭代输出 | |
| 用来给包含或重定向的页面传递参数 | |
| 重定向至一个新的URL. | |
| 使用可选的查询参数来创造一个URL |
格式如下:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| value | 要存储的值 | 否 | 主体的内容 |
| target | 要修改的属性所属的对象 | 否 | 无 |
| property | 要修改的属性 | 否 | 无 |
| var | 存储信息的变量 | 否 | 无 |
| scope | var属性的作用域 | 否 | 可以写四个域范围,但是默认是Page |
如果指定了target属性,那么property属性也需要被指定。
四个域:
老规矩来例子:
创建一个对象类:
public class Person {
String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
然后再jsp中如下写:
<%-- 可以看出可以其value之可以使用EL表达式--%>
<%--现在修改一下一个对象的名字--%>

格式:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| value | 要输出的内容 | 是 | 无 |
| default | 输出的默认值 | 否 | 主体中的内容 |
| escapeXml | 是否忽略XML特殊字符 | 否 | true |
演示:
格式:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| var | 要移除的变量名称 | 是 | 无 |
| scope | 变量所属的作用域 | 否 | 所有作用域 |
演示:
<%-- 可以看出可以其value之可以使用EL表达式--%>
删除前:
删除后

格式:
...
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| test | 条件 | 是 | 无 |
| var | 用于存储条件结果的变量 | 否,一般也没有人存储这个true或者false | 无 |
| scope | var属性的作用域 | 否 | page |
现在演示:

这三个标签一起说,为什么一起说呢,因为三个一般都是一起出现的,而不是单独出现的。因为使用
还有一个要注意:在标签之内的如果使用注释的话,只能使用jsp注释,而不能使用html标签注释。
switch语句中有case,而
格式如下:
...
...
...
...
...
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| test | 条件 | 是 | 无 |
现在演示一下:
当前关卡boss是:
卧槽手真多,还接一个龙头
卧槽法爷无敌,贴身打
卧槽,如果怕心悸,玩毛老头环啊。

标签封装了Java中的for,while,do-while循环。
相比而言,
格式:
...
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| items | 要被循环的信息 | 是 | 无 |
| begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
| end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
| step | 每一次迭代的步长 | 否 | 1 |
| var | 代表当前条目的变量名称 | 否 | 无 |
| varStatus | 代表循环状态的变量名称 一般的时候也没有人调用这个,其会输出一个对象类。 | 否 | 无 |
演示:
<%
Map map = new HashMap();
map.put("name", "张三");
map.put("age", "20");
pageContext.setAttribute("map",map);
List list=new ArrayList();
Person p1=new Person();
p1.setName("张三");
Person p2=new Person();
p2.setName("李四");
list.add(p1);
list.add(p2);
pageContext.setAttribute("list",list);
%>
简单的循环
输出数字:${i}
取map值循环
map键值对:${entry}
lsit 中员工表
姓名
${person.name}

其实这个和
标签也封装了Java中的for,while,do-while循环。
格式:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| items | 要被循环的信息 | 否 | 无 |
| begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
| end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
| step | 每一次迭代的步长 | 否 | 1 |
| var | 代表当前条目的变量名称 | 否 | 无 |
| varStatus | 代表循环状态的变量名称 | 否 | 无 |
| delims | 分隔符 | 是 | 无 |
可以看出:
而且
<%
Map map = new HashMap();
map.put("name", "张三");
map.put("age", "20");
pageContext.setAttribute("map", map);
List list = new ArrayList();
Person p1 = new Person();
p1.setName("张三");
Person p2 = new Person();
p2.setName("李四");
list.add(p1);
list.add(p2);
pageContext.setAttribute("list", list);
%>
简单的循环
<%-- 依托items如果没有 就等于没有数据--%>
输出数字:${i} ${k}
取map值循环
map键值对:${entry}

看结果发现发现items不会进行循环,还有map只循环了一次返回的是一个map 的tostring方法,也就是运行一次,因为delims无法对这个数据进行分割。
如下测试:
lsit 中员工表
姓名
<%-- 这个地方会报错,因为其返回的不是对象,而是一个字符串--%>
${person.name}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12

不过其也有神奇的操作,感觉有点像是java中的split方法分割字符串之后再进行循环:
输出游戏:${i}
- 1
- 2
- 3
- 4
- 5

标签
标签提供了所有行为标签所具有的功能,同时也允许包含绝对URL。
格式:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
属性 描述 是否必要 默认值 url 待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源 是 无 context 当使用相对路径访问外部context资源时,context指定了这个资源的名字。 否 当前应用程序 charEncoding 所引入的数据的字符编码集 否 ISO-8859-1 var 用于存储所引入的文本的变量 否 无 scope var属性的作用域 否 page varReader 可选的用于提供java.io.Reader对象的变量 否 无
简单演示:
- 1
- 2
- 3
无法截图,一般很多网址都是禁止这种行为的,都会报错302,这个使用还是很少的了解即可。
和 标签
标签将URL格式化为一个字符串,然后存储在一个变量中。
而 标签用于在 标签中指定参数,而且与 URL 编码相关。
所以一般两者搭配使用。
格式:
- 1
- 2
- 3
- 4
- 5
属性 描述 是否必要 默认值 value 基础URL 是 无 context 本地网络应用程序的名称 否 当前应用程序 var 代表URL的变量名 否 Print to page scope var属性的作用域 否 Page
格式:
- 1
属性 描述 是否必要 默认值 name URL中要设置的参数的名称 是 无 value 参数的值 否 Body
演示:
">
测试
- 1
- 2
- 3
- 4
- 5
- 6

说实话还如直接使用a标签,毕竟a标签更加简单。
标签
标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。
格式:
- 1
属性 描述 是否必要 默认值 url 目标URL 是 无 context 紧接着一个本地网络应用程序的名称 否 当前应用程序
演示:
- 1
JSTL函数标签库
引入标签:
<%@ taglib prefix="fn"
uri="http://java.sun.com/jsp/jstl/functions" %>
- 1
- 2
函数 描述 fn:contains() 测试输入的字符串是否包含指定的子串 fn:containsIgnoreCase() 测试输入的字符串是否包含指定的子串,大小写不敏感 fn:endsWith() 测试输入的字符串是否以指定的后缀结尾 fn:escapeXml() 跳过可以作为XML标记的字符 fn:indexOf() 返回指定字符串在输入字符串中出现的位置 fn:join() fn:length()] 返回字符串长度 fn:replace() 将输入字符串中指定的位置替换为指定的字符串然后返回 fn:split() 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 fn:startsWith() 测试输入字符串是否以指定的前缀开始 fn:substring() 返回字符串的子集 fn:substringAfter() 返回字符串在指定子串之后的子集 fn:substringBefore() 返回字符串在指定子串之前的子集 fn:toLowerCase() 将字符串中的字符转为小写 fn:toUpperCase()] 将字符串中的字符转为大写 fn:trim() 移除首尾的空白符
其实看方法的描述,就可以看去很多都是string的处理方法,我不会都演示,而是简单演示一两个,就明白其如何用了。
用方法标签字符串abcdef中含有c
用字符串直接操作字符串abcdef中含有c
${fn:trim("abc ")}
${"abc ".trim()}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11

格式化标签
其实一般很少再页面进行格式调试,其在传输的时候格式就会被定义好,不然有点废web服务器。
引入标签:
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt" %>
- 1
- 2
标签 描述 解析一个代表着数字,货币或百分比的字符串 解析一个代表着数字,货币或百分比的字符串 使用指定的风格或模式格式化日期和时间 解析一个代表着日期或时间的字符串 绑定资源 指定地区 绑定资源 指定时区 指定时区 显示资源配置文件信息 设置request的字符编码
SQL标签
引入:
<%@ taglib prefix="sql"
uri="http://java.sun.com/jsp/jstl/sql" %>
- 1
- 2
说实话现在谁会将sql写在页面,如果这样的话,还有什么安全所在?所以其很少有人原因。
标签 描述 指定数据源 运行SQL查询语句 运行SQL更新语句 将SQL语句中的参数设为指定值 将SQL语句中的日期参数设为指定的java.util.Date 对象值 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行
XML 标签
xml标签其实在很少用的原因,是现在更多的交互使用的是json。无论是js内置支持json还有编程语言几乎都支持json。所以现在很少在jsp中使用xml。
引入标签:
<%@ taglib prefix="x"
uri="http://java.sun.com/jsp/jstl/xml" %>
- 1
- 2
当然还需与导入jar才行,不然无法使用,不过这个现在几乎不用了解即可。
标签 描述 与<%= … >,类似,不过只用于XPath表达式 解析 XML 数据 设置XPath表达式 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 迭代XML文档中的节点 和的父标签 的子标签,用来进行条件判断 的子标签,当判断为false时被执行 将XSL转换应用在XML文档中 与共同使用,用于设置XSL样式表
所以可以看出了解JSTL标签的话,主要使用的是核心标签库的标签,其它四个了解即可。
-
相关阅读:
C语言——计算1!+2!+3!+......+10!
设计模式-工厂方法模式
spring-boot-configuration-processor介绍
中通IM测试实践
Java关于接口
app逆向(8)|app的加固+脱壳和frida+rpc介绍
如何使用飞书快捷指令无感记账,ios版
嵌入式Linux驱动开发笔记(未完待续。。。)
Arduino 学习笔记_4 模拟输入和输出
SQL Server数据库体系结构中一些常见知识点整理
-
原文地址:https://blog.csdn.net/u011863822/article/details/126268867