JSTL
问题
使用Servlet进行请求处理
- 使用JSP将请求处理的结果展示在jsp页面
- 使用EL表达式获取并输出域对象中数据
- 但是如果要循环输出一个list集合的数据,得在jsp页面使用<%%>java小脚本的形式 写java代码来完成!比较麻烦!
解决
- 使用JSTL标签来完成,例如:循环、判断等情况的与数据输出
- JSTL的作用:替换在Jsp中声明的Java逻辑代码(el表达式只是取出域对象中数据,而jstl是对数据进行各种处理,所以jstl是辅助el的)
介绍
- JSTL标签库是第三方发明的自定义的标签,每个标签都有自己特定的含义,表示一个具体的java逻辑。
- 要在JSP中 使用JSTL 必须使用taglib标签 引入第三方的标签库资源。
- 标签库的内容有:
-
核心标签库
-
SQL标签库
-
函数标签库
-
XML标签库
-
格式化标签库
核心标签库:
Oracle Java Technologies | OracleOracle Java Technologies | Oraclehttp://java.sun.com/jsp/jstl/core Oracle Java Technologies | Oracle
- 包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
格式化标签库:
Oracle Java Technologies | OracleOracle Java Technologies | Oraclehttp://java.sun.com/jsp/jstl/fmt Oracle Java Technologies | Oracle
- Oracle Java Technologies | Oracle用来格式化显示数据,比如:对不同区域的日期格式化等。 Oracle Java Technologies | Oracle
JSTL的使用
使用步骤:
-
在项目中导入JSTL的jar包
-
在jsp页面中通过taglib指令引入jstl标签库
-
使用jstl标签完成开发
- 为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令标签:
<%@taglib uri="" prefix="" %>
- uri:要使用的jstl库的地址
- prefix:用来自定义标签的前缀,通过前缀去操作库中的标签。(类似于SQL语句中 表的别名)
- 例如:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- 前缀可以是任意内容
- 建议使用:使用核心库,前缀一般使用c;使用格式化库,前缀一般是fmt。
- 对应jar包
- 从Apache的标准标签库中下载的二进包
- 官方下载地址:Index of /dist/jakarta/taglibs/standard/binaries
- 下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到项目的指定目录下。
条件动作标签
- 条件动作指令用于处理 页面的输出结果 依赖于某些输入值的情况
- 在 Java 中:利用 if、 if…else 和 switch 语句来进行处理
- 在 JSTL 中:也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。
if 标签
- if 标签:先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容
- 测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用 Boolean 对象。
- 可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。
语法格式
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
属性
- if 标签有如下属性:
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
test | 条件 | 是 | 无 |
var | 用于存储条件结果的变量(限域变量名) | 否 | 无 |
scope | var属性的作用域 可取值:page|request|session|application | 否 | page |
示例
<%--
Created by IntelliJ IDEA.
User: gym
Date: 2024/7/19
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>条件动作标签</title>
</head>
<body>
<%---------------------if条件标签------------------%>
<%
// 在request作用域中存储数据:
request.setAttribute("score",95);
%>
<%--如果成绩在60分以上 则及格:--%>
<c:if test="${score >= 60}">
及格!
</c:if>
<c:if test="${score < 60}">
不及格!
</c:if>
<%--var scope属性:
var:接收test表达式的结果(true或者false)
scope:代表var变量的作用域
--%>
<c:if test="${score >= 60}" var="flag" scope="request">
<%--
也可以实现服务器的跳转:类似请求转发
<jsp:forward page="index.jsp"></jsp:forward>
--%>
</c:if>
</body>
</html>
- 注: JSTL中没有else标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
choose、when 和 otherwise 标签
- choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似,用于在多选项中做选择。
- switch语句中有case,而choose标签中对应有when
- switch语句中有default,而choose标签中有otherwise。
- 语法格式
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
属性
-
choose标签没有属性。
-
when标签只有一个test属性。
-
otherwise标签没有属性。
示例
<%-------------choose、when 和 otherwise 标签-------------%>
<c:choose>
<c:when test="${score>=85}">
A
</c:when>
<c:when test="${score<85&&score>=70}">
B
</c:when>
<c:when test="${score<75&&score>=60}">
C
</c:when>
<c:otherwise>
D
</c:otherwise>
</c:choose>
注意点
-
choose标签和otherwise标签没有属性,而when标签必须设置test属性
-
choose标签中必须有至少一个when标签,可以没有otherwise标签
-
otherwise标签必须放在最后一个when标签之后
-
choose标签中只能有when标签和otherwise标签,when标签和otherwise标签可以嵌套其他标签
-
otherwise标签在所有的when标签不执行的情况下才会执行
- 注意:如果不想每次改动jsp都要重启服务器或者重新部署,可以配置以下内容:
- 这个配置只对jsp生效,如果更改servlet还是需要重启的
迭代标签
- forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。
- 可以迭代的对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现
- 以及对象或者基本类型的数组。
- 还可以迭代 java.util.Iterator 和 java.util.Enumeration
- 不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者 Enumeration 都不能重置(reset)。
forEach标签
语法格式
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
</c:forEach>
属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
items | 要被循环的数据 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
示例
1.遍历主体内容多次
<c:forEach var="限域变量名" begin="开始数" end="结束数" step="迭代数" >
</c:forEach>
相当于java的for循环:
for(int i = 0; i < 10; i++) {}
如下:
<%--
Created by IntelliJ IDEA.
User: gym
Date: 2024/7/19
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>foreach迭代标签</title>
</head>
<body>
<%--输出0-10--%>
<c:forEach var="i" begin="0" end="10">
${i}
</c:forEach>
<hr>
<%--输出0-10偶数--%>
<c:forEach var="i" begin="0" end="10" step="2">
${i}
</c:forEach>
</body>
</html>
2.循环
<c:forEach items="被循环的集合" var="限域变量名">
</c:forEach>
相当于java的foreach循环:
for(String str : list) {
}
如下:
<%----------------类似于增强for循环----------------%>
<%
//储存字符串
request.setAttribute("str1","java,html,js,jsp");
request.setAttribute("str2","java#html#js#jsp");
%>
<%--遍历字符串(拼接的符号是逗号):--%>
<c:forEach items="${str1}" var="i">
${i}--->
</c:forEach>
<hr>
<%--遍历字符串(拼接的符号是#):delims表示分隔符号:--%>
<c:forTokens items="${str2}" delims="#" var="i">
${i}--->
</c:forTokens>
<%
//存储数组
String[] str3 = {"java","css","servlet"};
request.setAttribute("str3",str3);
%>
<%--对数组进行遍历:--%>
<c:forEach items="${str3}" var="i">
${i}--->
</c:forEach>
<hr>
<%
//存储list
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<%--对List集合进行遍历:--%>
<c:forEach items="${list}" var="i">
${i}--->
</c:forEach>
<hr>
<%
//存储map
Map map = new HashMap<>();
map.put("a","1111");
map.put("b","2222");
map.put("c","3333");
request.setAttribute("map",map);
%>
<%--对Map集合进行遍历:--%>
<c:forEach items="${map}" var="i">
${i}--->${i.key}--->${i.value}
</c:forEach>
格式化动作标签
- JSTL 提供了格式化和解析数字和日期的标签,如:formatNumber、formatDate、parseNumber及parseDate。
formatNumber标签
- formatNumber标签用于格式化数字,百分比,货币。
- 该标签用指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
语法格式
<fmt:formatNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的数字 | 是 | 无 |
type | NUMBER,CURRENCY,或 PERCENT类型 | 否 | Number |
var | 存储格式化数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
- 注意:
-
如果设置了var属性,则格式化后的结果不会输出,需要通过el表达式获取var对应的限域变量名
-
默认的类型(type)的取值为number。可取值:number数值型、percent百分比类型、currency货币型
示例
<%--
Created by IntelliJ IDEA.
User: gym
Date: 2024/7/19
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>格式化动作标签</title>
</head>
<body>
<%--
value:要处理的数据
type:数据要处理为哪种类型
var:数据用var里面指定的变量做接收
如果设置了var属性 则格式化后的结果不会输出 要通过el表达式获取var对应的限域变量名
如果没有设置var属性 可以自动输出结果
scope:变量作用域:4个作用域
--%>
<%--用EL表达式获取--%>
<fmt:formatNumber value="10" type="number" var="num"/>${num}<br>
<%--数值--%>
<fmt:formatNumber value="10" type="number"/><br>
<%--百分比--%>
<fmt:formatNumber value="10" type="percent"/><br>
<%--货币¥--%>
<fmt:formatNumber value="10" type="currency"/><br>
<%--设置时区--%>
<fmt:setLocale value="en_US"/>
<%--US货币$--%>
<fmt:formatNumber value="10" type="currency"/>
</body>
</html>
结果:
formatDate标签
- formatDate标签用于使用不同的方式格式化日期。(将Date型数据转换成指定格式的字符串类型。)
语法格式
<fmt:formatDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
timeZone="<string>"
var="<string>"
scope="<string>"/>
属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
timeZone | 显示日期的时区 | 否 | 默认时区 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
标签格式模式
代码 | 描述 | 实例 |
---|---|---|
y | 不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 | 2002 |
M | 月份数字。一位数的月份没有前导零。 | April & 04 |
d | 月中的某一天。一位数的日期没有前导零。 | 20 |
h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
m | 分钟。一位数的分钟数没有前导零。 | 45 |
s | 秒。一位数的秒数没有前导零。 | 52 |
示例
<%----------------------formatDate-------------------%>
<%
// 在作用域中存储日期:
request.setAttribute("date",new Date());
%>
<%--将日期从作用域中取出:--%>
${date}<br>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/><br>
<fmt:formatDate value="${date}" pattern="yyyy年MM月dd日"/>
parseNumber标签
- parseNumber标签用来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分比类型的字符串转换成数值型)
语法格式
<fmt:parseNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要解析的数字 | 否 | Body |
type | NUMBER,,CURRENCY,或 PERCENT | 否 | number |
var | 存储待解析数字的变量 | 否 | Print to page |
scope | var属性的作用域 | 否 | page |
示例
<%----------------------parseNumber-------------------%>
<fmt:parseNumber value="100"/> <br>
<fmt:parseNumber value="100" type="number"/> <br>
<fmt:parseNumber value="100%" type="percent"/> <br>
<fmt:parseNumber value="$10.00" type="currency"/> <br>
parseDate标签
- parseDate标签用于解析日期。(将指定格式的字符串转换成Date类型。)
语法格式
<fmt:parseDate
value="<string>"
type="<string>"
dateStyle="<string>"
timeStyle="<string>"
pattern="<string>"
var="<string>"
scope="<string>"/>
属性
属性 | 描述 | 是否必要 | 默认值 |
---|---|---|---|
value | 要显示的日期 | 是 | 无 |
type | DATE, TIME, 或 BOTH | 否 | date |
dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
pattern | 自定义格式模式 | 否 | 无 |
var | 存储格式化日期的变量名 | 否 | 显示在页面 |
scope | 存储格式化日志变量的范围 | 否 | 页面 |
示例
<%----------------------parseDate-------------------%>
<fmt:parseDate value="2003/10/18" pattern="yyyy/MM/dd" />
结果:
- 总结:
- formatNumber:将数值 转换为 指定格式的字符串
- formatDate:将Date数据转换为 指定格式的字符串
- parseNumber:将不同类型的字符串 转换为 数值类型
- parseDate:将不同类型的字符串 转换为 Date类型