当前位置:首页 » 《随便一记》 » 正文

【Java Web】JSTL及其核心库介绍 JSTL函数

28 人参与  2024年12月07日 16:00  分类 : 《随便一记》  评论

点击全文阅读


文章目录

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>&lt;c:out&gt; 实例</h1>        <c:out value="&lt要显示的数据对象(未使用转义字符)&gt" escapeXml="true" default="默认值"></c:out><br/>        <c:out value="&lt要显示的数据对象(使用转义字符)&gt" escapeXml="false" default="默认值"></c:out><br/>        <c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out><br/>    </body></html>

运行结果

<c:out> 实例&lt要显示的数据对象(未使用转义字符)&gt<要显示的数据对象(使用转义字符)>使用的表达式结果为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"/>">    这个链接通过 &lt;c:url&gt; 标签生成。</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}"/>">    使用 &lt;c:param&gt; 为指定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(日期和时间)。默认值为 bothdateStyle:可选。当 typedateboth 时使用。指定日期样式的长度。取值可以是 defaultshortmediumlongfulltimeStyle:可选。当 typetimeboth 时使用。指定时间样式的长度。取值与 dateStyle 相同。timezone:可选。指定时区。例如 "GMT+8"var:可选。如果设置了此参数,格式化后的结果将存储在该变量中,而不是直接输出到页面上。scope:可选。与 var 一起使用,指定变量的作用域。取值可以是 pagerequestsessionapplication

示例

基本用法

<fmt:formatDate value="${currentDate}" pattern="yyyy-MM-dd HH:mm:ss" />

使用 dateStyletimeStyle

<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>

在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/197661.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1