文章目录
JSTL介绍
JSTL(JavaServer Pages Standard Tag Library)是 Apache 提供的一个用于 Java Web 开发的标准标签库,它依赖于表达式语言(EL),旨在简化 JSP 的开发过程。
JSTL由以下五个功能标签库组成:
核心标签库 (Core Tags): 提供了最常用的标签,如条件判断、迭代、URL操作等。
<c:if>
: 用于条件判断。<c:choose>
,<c:when>
,<c:otherwise>
: 提供多分支选择结构<c:forEach>
和<c:forTokens>
: 用于循环遍历集合或数组<c:set>
和<c:remove>
: 用于设置或移除变量(或对象属性的值)<c:url>
和<c:redirect>
: 用于构建URL和重定向<c:out/>
: 输出文本内容到out对象,常用于显示特殊字符,显示默认值<c:param/>
: 在url后附加参数<c:import/>
: 在页面中嵌入另一个资源内容
格式化标签库 (Formatting Tags): 用来格式化日期、数字和文本
<fmt:formatDate>
: 格式化日期。<fmt:formatNumber>
: 格式化数字。<fmt:message>
: 国际化支持,显示本地化的消息。
函数标签库 (Functions Tags): 自JSTL 1.2起引入,提供了一些有用的EL函数。
SQL标签库 (SQL Tags): 用于执行数据库查询和更新操作。不过在实际项目中,直接在JSP页面上进行数据库操作通常不被推荐,因为这会违反MVC设计模式,不利于应用的可维护性。
XML标签库 (XML Tags): 用来处理XML数据,包括解析XML文档和转换XML数据。
在 lib 文件夹下添加 jar 包
standard.jar
jstl.jar
在 JSP 页面中添加 taglib 指令
<!-- 核心标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 国际化/格式化标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!-- 函数标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<!-- 数据库标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<!-- XML标签库 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
核心库
从功能上可以分为4类:
按照功能划分 | 包含的标签 |
---|---|
表达式控制标签 | out set remove catch |
流程控制标签 | if choose when otherwise |
循环标签 | forEach forTokens |
URL标签 | import url redirect |
表达式控制
<c:out>
<c:out> 标签用来显示一个表达式的结果,与 <%= %> 作用相似,它们的区别就是 <c:out> 标签可以直接通过"."操作符来访问属性。举例来说,如果想要访问 customer.address.street
,只需要这样写:<c:out value="customer.address.street">
。<c:out> 标签会自动忽略 XML 标记字符,所以它们不会被当做标签来处理。
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
- value:要输出的内容,必要,无默认值
- default:输出的默认值,非必要,默认值为主体中的内容
- escapeXml:是否忽略XML特殊字符,非必要,默认值为true
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>c:out 标签实例</title>
</head>
<body>
<h1><c:out> 实例</h1>
<c:out value="<要显示的数据对象(未使用转义字符)>" escapeXml="true" default="默认值"></c:out><br/>
<c:out value="<要显示的数据对象(使用转义字符)>" escapeXml="false" default="默认值"></c:out><br/>
<c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>
</body>
</html>
运行结果
<c:out> 实例
<要显示的数据对象(未使用转义字符)>
<要显示的数据对象(使用转义字符)>
使用的表达式结果为null,则输出该默认值
<c:set>
<c:set> 标签用于设置变量值和对象属性。<c:set> 标签就是 <jsp:setProperty> 行为标签的孪生兄弟。这个标签会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
- value:要存储的值,非必要,默认值为主体的内容
- target:要修改的属性所属的对象,非必要,无默认值
- property:要修改的属性,非必要,无默认值(如果指定了target属性,property属性也需要被指定)
- var:存储信息的变量,非必要,无默认值
- scope:var属性的作用域,非必要,默认值为Page
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:out value="${salary}"/>
运行结果
4000
<c:remove>
<c:remove> 标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
<c:remove var="<string>" scope="<string>"/>
- var:要移除的变量名称,必要,无默认值
- scope:变量所属的作用域,非必要,默认值为所有作用域
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>salary 变量值: <c:out value="${salary}"/></p>
<c:remove var="salary"/>
<p>删除 salary 变量后的值: <c:out value="${salary}"/></p>
运行结果
salary 变量值: 4000
删除 salary 变量后的值:
<c:catch>
<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。
<c:catch var="<string>">
...
</c:catch>
- var:用来储存错误信息的变量,非必要,默认值为None
<c:catch var ="catchException">
<% int x = 5/0;%>
</c:catch>
<c:if test = "${catchException != null}">
<p>异常为 : ${catchException} <br />
发生了异常: ${catchException.message}</p>
</c:if>
运行结果
异常为 : java.lang.ArithmeticException: / by zero
发生了异常: / by zero
流程控制
<c:if>
<c:if> 标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
- test:条件,必要,无默认值
- var:用于存储条件结果的变量,非必要,无默认值
- scope:var属性的作用域,非必要,默认值为 page
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
<p>我的工资为: <c:out value="${salary}"/><p>
</c:if>
运行结果
我的工资为: 4000
<c:choose>
<c:choose> 标签与 Java switch 语句的功能一样,用于在众多选项中做出选择。
switch 语句中 case 对应 <c:choose> 标签中 <c:when>;switch 语句中 default 对应 <c:choose>标签中 <c:otherwise>
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
- <c:when> 标签属性 test 为条件,必要,无默认值
- <c:choose>、<c:otherwise> 标片均无属性
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>你的工资为 : <c:out value="${salary}"/></p>
<c:choose>
<c:when test="${salary <= 0}">
太惨了。
</c:when>
<c:when test="${salary > 3000}">
不错的薪水,还能生活。
</c:when>
<c:otherwise>
什么都没有。
</c:otherwise>
</c:choose>
运行结果
你的工资为 : 4000
不错的薪水,还能生活。
循环标签
<c:forEach>
<c:forEach>、<c:forTokens> 标签封装了 Java 中的 for,while,do-while 循环。相比而言,<c:forEach> 标签是更加通用的标签,因为它迭代一个集合中的对象。<c:forTokens> 标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
<c:forTokens ...delims="<string>"...>
- items:要被循环的信息,非必要,无默认值
- begin:开始的元素(0=第一个元素,1=第二个元素),非必要,0
- end:最后一个元素(0=第一个元素,1=第二个元素),非必要,Last element
- step:每一次迭代的步长,非必要,1
- var:代表当前条目的变量名称,非必要,无默认值
- varStatus:代表循环状态的变量名称,非必要,无默认值
<c:forTokens> 标签与 <c:forEach> 标签有相似的属性,不过 <c:forTokens> 还有另一个属性
- delims:分隔符,必要,无默认值
<c:forEach var="i" begin="1" end="5">
Item <c:out value="${i}"/><p>
</c:forEach>
<c:forTokens items="google,runoob,taobao" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>
运行结果
Item 1
Item 2
Item 3
Item 4
Item 5
google
runoob
taobao
URL标签
<c:import>
<c:import> 标签提供了所有 <jsp:include> 行为标签所具有的功能,同时也允许包含绝对 URL。举例来说,使用 <c:import> 标签可以包含一个 FTP 服务器中不同的网页内容。
<c:import
url="<string>"
var="<string>"
scope="<string>"
varReader="<string>"
context="<string>"
charEncoding="<string>"/>
- url:待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源,必要,无默认值
- context:当使用相对路径访问外部context资源时,context指定了这个资源的名字,非必要,当前应用程序
- charEncoding:所引入的数据的字符编码集,非必要,默认值ISO-8859-1
- var:用于存储所引入的文本的变量,非必要,无默认值
- scope:var属性的作用域,非必要,默认值page
- varReader:可选的用于提供java.io.Reader对象的变量,非必要,无默认值
<c:import var="data" url="http://www.runoob.com"/>
<c:out value="${data}"/>
以上程序将会打印 http://www.runoob.com 页面的源代码
<c:url>
<c:url> 标签将 URL 格式化为一个字符串,然后存储在一个变量中,在需要的时候会自动重写 URL。
var 属性用于存储格式化后的 URL。<c:url> 标签只是用于调用 response.encodeURL() 方法的一种可选的方法。它真正的优势在于提供了合适的 URL 编码,包括 <c:param> 中指定的参数。
<c:url
var="<string>"
scope="<string>"
value="<string>"
context="<string>"/>
- value:基础URL,必要,无默认值
- context:本地网络应用程序的名称,非必要,默认值为当前应用程序
- var:代表URL的变量名,非必要,默认值为Print to page
- scope:var属性的作用域,非必要,默认值为Page
<a href="<c:url value="http://www.runoob.com"/>">
这个链接通过 <c:url> 标签生成。
</a>
<a href="http://www.runoob.com">
这个链接通过 <c:url> 标签生成。
</a>
<c:param>
<c:param> 标签用于在 <c:url> 标签中指定参数,而且与 URL 编码相关。
<c:param name="<string>" value="<string>"/>
- name:UR L中要设置的参数的名称,必要,无默认值
- value:参数的值,非必要,默认值为 Body
如果想要向 <c:param> 标签中传递参数,需要先使用 <c:url> 标签来创建 URL
<c:url var="myURL" value="main.jsp">
<c:param name="name" value="Runoob"/>
<c:param name="url" value="www.runoob.com"/>
</c:url>
<a href="/<c:out value="${myURL}"/>">
使用 <c:param> 为指定URL发送两个参数。
</a>
<a href="/main.jsp?name=Runoob&url=www.runoob.com">
使用 <c:param> 为指定URL发送两个参数。
</a>
<c:redirect>
<c:redirect> 标签通过自动重写 URL 来将浏览器重定向至一个新的 URL,它提供内容相关的 URL,并且支持 <c:param>标签。
<c:redirect url="<string>" context="<string>"/>
- url:目标URL,必要,无默认值
- context:紧接着一个本地网络应用程序的名称,非必要,默认值当前应用程序
<c:redirect url="http://www.runoob.com"/>
浏览器打开以上页面将跳转至 http://www.runoob.com
格式化
<fmt:formatDate> 使用指定的风格或模式格式化日期和时间
<fmt:formatDate value="日期对象" pattern="日期格式模式" [type="date/time/both"] [dateStyle="default/short/medium/long/full"] [timeStyle="default/short/medium/long/full"] [timezone="时区"] [var="变量名"] [scope="page/request/session/application"] />
参数说明
- value:必需。要格式化的日期对象。通常是一个
java.util.Date
对象或其子类实例。 - pattern:可选。自定义日期/时间格式。例如
"yyyy-MM-dd HH:mm:ss"
表示年-月-日 时:分:秒。 - type:可选。指定要显示的日期或时间类型。取值可以是
date
(仅日期)、time
(仅时间)或both
(日期和时间)。默认值为both
。 - dateStyle:可选。当
type
为date
或both
时使用。指定日期样式的长度。取值可以是default
、short
、medium
、long
、full
。 - timeStyle:可选。当
type
为time
或both
时使用。指定时间样式的长度。取值与dateStyle
相同。 - timezone:可选。指定时区。例如
"GMT+8"
。 - var:可选。如果设置了此参数,格式化后的结果将存储在该变量中,而不是直接输出到页面上。
- scope:可选。与
var
一起使用,指定变量的作用域。取值可以是page
、request
、session
、application
。
示例
-
基本用法:
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd HH:mm:ss" />
-
使用
dateStyle
和timeStyle
:<fmt:formatDate value="${currentDate}" type="both" dateStyle="long" timeStyle="short" />
-
设置时区:
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd HH:mm:ss" timezone="GMT+8" />
-
存储在变量中:
<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd HH:mm:ss" var="formattedDate" /> <p>Formatted Date: ${formattedDate}</p>
JSTL函数
函数 | 描述 | 语法 |
---|---|---|
fn:index0f() | 返回指定字符串在输入字符串中出现的位置 | ${fn:indexOf(<原始字符串>,<子字符串>)} |
fn:join() | 将数组中的元素合成一个字符串然后输出 | ${fn:join([数组],<分隔符>)} |
fn:length() | 返回字符串长度 | ${fn:length(string)} |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 | ${fn:replace(<原始字符串>,<被替换的字符串>,<要替换的字>)} |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 | ${fn:split(<带分隔符的字符串>,<分隔符>)} |
fn:substring() | 返回字符串的子集 | ${fn:substring(<string>,<beginIndex>,<endIndex>)} |
fn:trim() | 移除首位的空白符 | ${fn:trim(<string>)} |
升级示例4-2
<table>
<tr>
<th>序号</th>
<th>ID</th>
<th>编码</th>
<th>名称</th>
<th>详细描述</th>
<th>创建时间</th>
</tr>
<c:forEach var="smbmsProvider" varStatus="a" items="${providerList}">
<tr>
<td>${a.index + 1}</td>
<td>${smbmsProvider.id}</td>
<td>${smbmsProvider.proCode}</td>
<td>${smbmsProvider.proName}</td>
<td class="description" title="${smbmsProvider.proDesc}">
<c:choose>
<c:when test="${fn:length(smbmsProvider.proDesc) > 15}">
${fn:substring(smbmsProvider.proDesc, 0, 15)}...
</c:when>
<c:otherwise>
${smbmsProvider.proDesc}
</c:otherwise>
</c:choose>
</td>
<td>
<fmt:formatDate value="${smbmsProvider.creationDate}" pattern="yyyy-MM-dd HH:mm:ss" />
</td>
</tr>
</c:forEach>
</table>
标签:Web,Java,URL,标签,JSTL,var,默认值,fn,非必要
From: https://blog.csdn.net/m0_66584716/article/details/143716862