【Javaweb】JSP标准标签库
JSTL
1.什么是JSTL
JSTL(JavaServer Pages Standard Tag Library)-JSP标准标签库,由SUN公司推出的,由Apache Jakarta 组织负责维护的用于编写和开发JSP页面的一组标准标签。
2.版本
STL的发布包有两个版本:
- Standard-1.0 Taglib
- Standard-1.1 Taglib
3.标签函数库
JSTL所提供的标签函数库主要分为五大类:
- 核心标签库(Core tag library)
- I18N 格式标签库 (I18N-capable formatting tag library)
- SQL标签库(SQL tag library)
- XML 标签库 (XML tag library)
- 函数标签库(Functions tag library)
4.优点
(1)提供一组标准标签
(2)可用于编写各种动态JSP页面
(3)用于访问数据库,有条件地执行代码和支持国有化
JSTL基本概念
标签(Tag)
标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大小写敏感的
标签库(Tag library)
由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库
标签库描述文件(Tag Library Descriptor)
标签库描述文件是一个XML文件,这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件,和web.xml是类似的,一般以.tld作为文件的扩展名
标签处理类(Tag Handel Class)
标签处理类是一个Java类,这个类继承了TagSupport或者扩展了SimpleTag接口,通过这个类可以实现自定义JSP标签的具体功能
在Web应用中使用JSTL
Jar包
- 要在Web应用中使用JSTL,需要用到JSTL的jar包,分别是
jstl.jar和standard.jar - MyEclipse6.5的开发环境中含有JSTL jar包,在创建Web工程时在“
J2EE Specification Level”选项下勾选为“Java EE 5.0”,则JSTL的jar包自动添加到Web应用的lib目录下
核心标签库的使用
标签库内容
核心标签库
- 通用标签
- 条件标签
- 迭代标签
通用标签库
- set
- remove
- out
<!--将level 4这个的值存储到范围为session的userLevel变量之中-->
<c:set var="userLevel" value="level 4" scope="session"/>
<!--将JavaBean的属性值存储至范围为pageScope的cid变量之中-->
<c:set var="cid" value="${acc.accId}"/>
<!--将标签体里面的值存储至范围为sessionScope的users变量之中-->
<c:set var="users" scope="session"> bush, tom, jack
</c:set>
<!--将value的值存储至范围为sessionScope的名为acc的JavaBean实例的accName属性之中-->
<c:set target="${acc}" property="accName" value="猪八戒" scope="session"/>
<!--将标签体里面的值存储至范围为pageScope的名为acc1的JavaBean实例的accName属性之中-->
<c:set target="${acc1}" property="accName">
${acc.accName}
</c:set>
<c:remove var="users"/>
删除后,输出1:<br>userLevel= <c:out value="${pageScope.userLevel}"/><br>
cid= <c:out value="${cid}"/><br>
users= <c:out value="${users}"/><br>
<jsp:useBean id="acc1" class="bean.Account" scope="session"/>
<c:set target="${acc}" property="accName" value="猪八戒"/>
<c:set target="${acc1}" property="accName">
${acc.accName}和猪小戒
</c:set>
输出2:
<br>
acc.accName=<c:out value="${acc.accName}"/> <br>
acc1.accName=<c:out value="${acc1.accName}"/> <br>
</body>
</html>

条件标签
- if
- choose
<c:if>用于进行条件判断,如果它的test属性为true,那么就计算标签体的内容,如果为false,就忽略标签体的内容
<c:choose>标签的作用类似于Java语言的switch语句,它用于执行条件语句块
<c:choose>
<c:when test="${acc.balance < 0}">
<font color="red">开户金额不能是负数!</font>
</c:when>
<c:when test="${ user.age>=0&&acc.balance <10 }">
<font color="red">开户金额至少是10元!</font>
</c:when>
<c:otherwise>
<font color="green">开户金额OK!</font>
</c:otherwise>
</c:choose>
</body>
</html>
<%@ page contentType="text/html; charset=gbk" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<jsp:useBean id="acc" class="bean.Account" scope="session"/>
<c:set value="${param.accId}" target="${acc}" property="accId" />
<c:set value="${param.accPwd}" target="${acc}" property="accPwd" />
<c:set value="${param.balance}" target="${acc}" property="balance" />
<html>
<body>
<c:if test="${acc.accId =='95599' && acc.accPwd==' 888'}" var = "result" scope= "page"/>
<c:if value="${result}">
欢迎你!<c:out value ="acc.accName"/>
</c:if >
<c:if value="${!result}">
你的卡号或密码不正确,请重新输入!
</c:if >
迭代标签
- forEach
- forTokens
<c:forEach>标签的作用是遍历集合中的元素或者是有条件的重复计算标签体的内容
例子:使用迭代标签来遍历隐式对象header和cookie集合中的元素
<%@ page contentType="text/html; charset=gbk"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>显示请求头的内容和Cookie内容</title>
</head>
<body>
读取请求头的信息<br>
<table border="1">
<tr bgcolor="green"><td>请求头</td><td>请求名</td></tr>
<c:forEach items="${header}" var="head" varStatus="status">
<c:if test="${status.count % 2 !=0}">
<tr bgcolor="pink"> <td>${head.key}</td><td>${head.value}</td></tr>
</c:if>
<c:if test="${status.count % 2 ==0}">
<tr bgcolor="white"> <td>${head.key}</td><td>${head.value}</td></tr>
</c:if>
</c:forEach>
</table>
<br>
读取cookie里的信息 <br>
<table border="1" width="300">
<tr bgcolor="green"><td>cookie名</td><td>cookie值</td></tr>
<c:forEach items="${cookie}" var="cook" varStatus="st">
<c:choose>
<c:when test="${st.count % 2 != 0}">
<tr bgcolor="pink"> <td>${cook.key}</td><td>${cook.value}</td></tr>
</c:when>
<c:otherwise>
<tr bgcolor="white"> <td>${cook.key}</td><td>${cook.value}</td></tr>
</c:otherwise>
</c:choose>
</c:forEach>
</table>
</body>
</html>

<c:forEach>标签还有另外的用法就是重复做标签体内指定的事情,相当与for或while循环
例子:根据步长循环输出数
<%@page contentType="text/html; charset=gbk"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head>
<title>循环输出数</title>
</head
<h4>循环输出数,步长为1</h4>
<c:forEach var="i" begin="1" end="10">
<c:out value="${i}"/>
</c:forEach>
<h4>循环输出数,步长为2</h4>
<c:forEach var="i" begin="1" end="10" step="2">
<c:out value="${i}"/>
</c:forEach>
</body>
</html>
…
<c:forEach var="accs" items="${accs}" begin="2" end="8" step="2">
<tr>
<td><c:out value="${accs.accId}"/></td>
<td><c:out value="${accs.accName}"/></td>
<td><c:out value="${accs.accPwd}"/></td>
</tr>
</c:forEach>
…

<c:forTokens>这个标签专门用于处理字符串的迭代,可以指定一个或者多个分隔符
例子:分别使用“|”、“|,”、“_”作为分隔符来分割的字符串是“bule,red,green|yellow|pink,black|white”
<h4>使用"|"作为分割符</h4>
<c:forTokens var="token" items="bule,red,green|yellow|pink,black|white" delims="|">
<c:out value="${token}"/>©
</c:forTokens>
<h4>使用"|,"作为分割符</h4>
<c:forTokens var="token" items="bule,red,green|yellow|pink,black|white" delims="|,">
<c:out value="${token}"/>©
</c:forTokens>
<h4>使用"_"作为分割符</h4>
<c:forTokens var="token" items="bule,red,green|yellow|pink,black|white" delims="_">
<c:out value="${token}"/>©
</c:forTokens>

国际化标签的使用
概念
国际化的英文是Internationalization,在第一字母I和最后一个字母N之间共有18个字母,所以简称I18N
国际化是指在软件的设计阶段,就应该使软件具有支持多种语言和国家或地区的功能
一个软件支持国际化,应该具备这些特征:
当软件需要支持新的语言时,不需要修改其代码
文本、消息和图片从源程序中提取出来,存储在外部
软件应该根据用户的语言和地理位置,对与特定文化相关的数据,如日期、时间和货币,进行格式化
支持非标准的字符集
Web应用程序中的国际化是指Web服务器可以根据不同的客户端的当地的语言环境来显示与语言环境匹配的页面内容和对数字、货币等进行格式化,符合当地用户的文化习惯
我们通过更改IE浏览器的语言设置来修改客户端的语言环境
支持国际化的Java类
//返回客户浏览器的首选的语言环境
Locale local = request.getLocale();
//返回支持多语言环境Enumeration对象,按优先级降序排列的Locale对象集合
Enumeration enum = request.getLocales();
- Web应用程序的国际化依赖于两个特定的Java类,分别是java.util.Locale类和java.util.
ResourceBundle类 - Locale类的实例表示了特定的地理、政治和文化地区
- Locale对象本身并不执行和国际化想关的格式化或解析工作,它仅仅负责向本地敏感的类提供本地化信息
- ResourceBundle类称为资源包,它包含特定于语言环境的对象
- 当程序需要一个特定于语言环境的资源时(如String),程序可以从适合当前用户语言环境的资源包中加载它
- Java虚拟机在启动时会自动查询本地的操作系统,为运行环境设置默认的Locale
- Web容器在其本地环境中通常会使用默认的Locale,对于特定的客户端,Web容器会从HTTP请求头中获取Locale信息
- 在Web应用中,用户不需要创建Locale对象实例,Web容器会负责创建Locale实例
JSTL中的国际化常用标签
<fmt:setLocale>
用于重新指定客户端的语言环境
<fmt:setLocale value="zh_tw"/> 表示设置客户端的本地环境为繁体中文
<fmt:bundle>
<fmt:bundle>标签用来创建I18N的本地化上下文,并将资源包加载在其中,资源包的名称由<fmt:bundle>标签中的basename属性指定
<fmt:bundle basename="basename">
标签体内容
</fmt:bundle>
<fmt:setBoundle>
用来创建I18N的本地化上下文,并将资源包存储在某个作用域范围中
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:message>
用来给出资源包的输出值
<fmt:setBundle basename="applicationMessage" var="applicationBundle"/>
<fmt:bundle basename="applicationAllMessage">
<fmt:message key="userName" /> <br>
<fmt:message key="passWord" bundle="${applicationBundle}" />
</fmt:bundle>
实例:帐号注册页面的国际化例子
message_en.properties和message_zh_CN.properties资源文件
page_title0=\u94F6\u884C\u5E10\u53F7\u6CE8\u518C\u9875\u9762
page_mes1=\u8BF7\u8F93\u5165\u4F60\u7684\u4E2A\u4EBA\u4FE1\u606F
page_mes2=\u5E10\u53F7\uFF1A
page_mes3=\u540D\u5B57\uFF1A
page_mes4=\u5BC6\u7801\uFF1A
page_mes5=\u5F00\u6237\u91D1\u989D\uFF1A
page_action1=\u6CE8\u518C
<head><fmt:setBundle basename="message"/>
<title><fmt:message key="page_title0" /></title>
</head> <body>
<form action="showinfo.jsp" method="post">
<fmt:message key="page_mes1"/> <br>
<fmt:message key="page_mes2"/><input type="text" name="accId"><br>
<fmt:message key="page_mes3"/><input type="text" name="accName"><br>
<fmt:message key="page_mes4"/><input type="password" name="accPwd"><br>
<fmt:message key="page_mes5"/><input type="text" name="balance"><br>
<input type="submit" value='<fmt:message key="page_action1"/>'>
</form> </body>


格式化标签的使用
支持格式化的Java类
- Web应用程序的格式化标签依赖于三个特定的Java类,分别是java.util.TimeZone类、java.text.
DateFormat类和java.text.NumberFormat - TimeZone类的实例包含了一个与格林威治标准时间(GMT)相比较得出的以微秒为单位的时区偏移量,它还可以用来处理夏令时
- 在Java中,使用时区ID来表示一个时区,美国太平洋时区的时区ID 是"America/Los_Angeles"
- DateFormat类是用来格式化日期/时间的抽象类,它以与语言无关的方式格式化并解析日期或时间
- 使用DateFormat提供的类方法,可以获得基于默认或给定语言环境和多种格式化风格的默认日期/时间Formatter,用来格式化Date对象
- DateFormat可帮助进行格式化并解析任何语言环境的日期
- 在实际的应用中,我们一般使用的比较多的是DateFormat类的子类SimpleDateFormat,因为它能够很方便的使用自定义日期和时间的模式来格式化Date对象
- NumberFormat类是所有数值格式的抽象基类,该类提供格式化和解析数值的接口。NumberFormat类可用于格式化和解析任何语言环境的数值
格式化标签
<fmt:timeZone>
<fmt:formatDate>
<fmt:formatNumber>
<fmt:setTimeZone>
<fmt:parseDate>
<fmt:parseNumber>
<fmt:setTimeZone>这个标签都用于设定页面时间的时区
<fmt:timeZone>这个标签用于在标签体内使用value指定的时区
<fmt:formatDate>标签用于格式化日期
<body><fmt:setLocale value=" en_US "/>
<fmt:timeZone value="GMT-8">
<jsp:useBean id="now" class="java.util.Date" scope="page" />
<fmt:formatDate value="${now}" type="date" /><br>
<fmt:formatDate value="${now}" type="time" /><br>
<fmt:formatDate value="${now}" type="both" /><br>
<fmt:formatDate value="${now}" type="date" timeStyle="default" /><br>
<fmt:formatDate value="${now}" type="date" dateStyle="full" /><br>
<fmt:formatDate value="${now}" type="time" timeStyle="default" /><br>
<fmt:formatDate value="${now}" type="time" timeStyle="short" /><br>
<fmt:formatDate value="${now}" type="time" timeStyle="medium" /><br>
<fmt:formatDate value="${now}" type="time" timeStyle="long" /><br>
<fmt:formatDate value="${now}" type="time" timeStyle="full" /><br>
<fmt:formatDate value=“${now}” type=“both” pattern="EEEE, MMMM d, yyyy HH:mm:ss Z" /><br>
<fmt:formatDate value="${now}" type="both"
pattern="d MMM yy, h:m:s a zzzz" /><br>
</fmt:timeZone></body>

- <fmt:parseDate>标签用于解析一个日期,并将结果作为
java.lang.Date类型的实例返回。<fmt:parseDate>标签和<fmt:formatDate>标签的作用正好相反 - <fmt:formatNumber>标签用来格式化数字,实际上是对应
java.util.NumberFormat 类
<fmt:formatNumber value="12" type="currency" pattern=".00元"/>
将显示 12.00元
<fmt:formatNumber value="12" type="currency" pattern=".0#元"/>
将显示 12.0元
<fmt:formatNumber value="1234567890" type="currency"/>
将显示 ¥1,234,567,890.00 (当前Web服务器的语言环境设定为zh_CN)
<fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/>
将显示 123,456.79
<fmt:formatNumber value="12" type="percent" />
将显示 1,200%
<fmt:parseNumber> 标签用于解析一个数字,并将结果作为 java.lang.Number 类的实例返回。<fmt:parseNumber>标签和<fmt:formatNumber>标签的作用正好相反
总结
- 通用标签用于在JSP页面里面创建、删除和显示中的变量值
- 条件标签用于支持JSP页面中的各种条件
- 迭代标签用于遍历某个集合中的元素
- 国际化标签用来根据客户端的不同语言环境显示不同的页面内容
- 格式化标签可以格式化数字、时间和货币
【Javaweb】JSP标准标签库的更多相关文章
- JavaWeb:JSP标准标签库
JavaWeb:JSP标准标签库 说明 什么是JSTL? JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制的标签库的集合,用来解决像遍 ...
- JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...
- JSP 标准标签库(JSTL)之最常用的JSTL标签总结
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-t ...
- jsp标准标签库
抄袭自:http://www.cnblogs.com/hongten/archive/2011/05/14/2046005.html JSP标准标签库 Pass by xkk ,and aut ...
- JSTL的全称:JSP Standard Tag Library, jsp 标准标签库
JSTL的全称:JSP Standard Tag Library, jsp 标准标签库 JSTL的作用 提供给Java web开发人员一个标准通过的标签函数库和EL来取代传统直接在页面上嵌入j ...
- JSTL(JSP Standard Tag Library ,JSP标准标签库)
JSTL标签之核心标签 JSTL(JSP Standard Tag Library ,JSP标准标签库)是一个实现 Web应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管 ...
- JSP标准标签库(JSTL)--JSTL简介与安装
对于MVC设计模式来讲,我们一直强调,在一个JSP钟scriptlet代码越少越好,但是只靠以前的概念很难实现,因为标签的开发特别麻烦,所以为了简化标签,也为了让标签更具备一些通用性,所以一般在开发中 ...
- JSP 标准标签库JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. 除了这些,它还提供 ...
- JSP标准标签库:JSTL
JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能. jstl出现的目的同el一样也是要代替jsp页面中的脚本代码. ...
- JSTL(JSP标准标签库)
JSP标准标签库(JavaServer Pages Tag Library, JSTL)是一个定制JSP标签库的集合,封装了JSP应用的通用核心功能.用来解决像遍历Map或集合.条件测试.XML处理, ...
随机推荐
- 【ZZ】Linux 安装 edge 浏览器
For Debain/Ubuntu/Deepin etc.## Setupcurl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...
- 七张图看懂 Linux profiling 机制
1 图 1 Linux profiling 手段一览 软件埋点: 手动埋点:主动调用 trace 函数来实现埋点. Android systrace 即是这样一个例子,如图 2 和 图 3 所示 自动 ...
- DBA面试资源合集(含Oracle、MySQL、Redis等)-墨天轮
如今正值金九银十招聘季,众多企业开放大批岗位等待新力量的注入,各位DBA们,你们是否正在激情备战中? 作为企业数据化进程中十分重要的一环,DBA的职责越来越重要,作为高薪资岗位之一,应聘DBA的竞争也 ...
- Android复习(二)应用资源——>字体
字体资源定义了可在应用中使用的自定义字体.字体可以是单独的字体文件或字体文件的集合,称为字体系列,并在 XML 中定义. 另请参阅如何定义 XML 中的字体,或改用可下载字体. 捆绑式字体 您可以将字 ...
- .NET使用Graphql的演示
Graphql是什么?先来一段AI给的回答: GraphQL是一种为API设计的查询语言,与REST相比,它提供了更高效.强大和灵活的方法来与数据交互.GraphQL由Facebook于2012年开发 ...
- 云原生周刊 | 使用 ChatGPT 协助解决 Prometheus 告警
开源项目推荐 kubernetes-chatgpt-bot 这是一个适用于 Slack 的 ChatGPT 机器人,只要有监控告警发送到 Slack 频道中,你就可以通过机器人向 ChatGPT 咨询 ...
- SpringBoot之后端图形验证码实现
此验证码的实现没有用到太多的插件,话不多说直接上代码,大家拿过去就可以用. 1.验证码类 package com.youyou.login.util.validatecode; import lomb ...
- 洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
题目大意 小A和小B,要进行 \(N\) 次猜拳,每次按照一定周期出拳,胜负情况如下: 求出小A和小B分别赢了几次. 思路 枚举 \(N\) 次猜拳,每次比较 \(a[powera]\) 与 \(b[ ...
- Nuxt.js 应用中的 imports:extend 事件钩子详解
title: Nuxt.js 应用中的 imports:extend 事件钩子详解 date: 2024/10/28 updated: 2024/10/28 author: cmdragon exce ...
- 遗传算法+强化学习—TPG—Emergent Tangled Graph Representations for Atari Game Playing Agents_2
最近在看进化算法在强化学习(RL)领域的一些应用,有些论文中将使用进化算法解决强化学习问题的算法归为非强化学习算法,然而又有些论文把使用进化算法解决强化学习问题的算法归为强化学习算法,不过更多的论文是 ...