文章目录
JSTL介绍核心库表达式控制\<c:out>\<c:set>\<c:remove>\<c:catch> 流程控制\<c:if>\<c:choose> 循环标签\<c:forEach> URL标签\<c:import>\<c:url>\<c:param>\<c:redirect> 格式化JSTL函数
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.jarjstl.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=第二个元素),非必要,0end:最后一个元素(0=第一个元素,1=第二个元素),非必要,Last elementstep:每一次迭代的步长,非必要,1var:代表当前条目的变量名称,非必要,无默认值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 1Item 2Item 3Item 4Item 5
googlerunoobtaobao
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-1var:用于存储所引入的文本的变量,非必要,无默认值scope:var属性的作用域,非必要,默认值pagevarReader:可选的用于提供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 pagescope: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>