当前位置: 首页 > news >正文

【Javaweb】JSP标准标签库

目录
  • JSTL
    • 1.什么是JSTL
    • 2.版本
    • 3.标签函数库
    • 4.优点
  • JSTL基本概念
    • 标签(Tag)
    • 标签库(Tag library)
    • 标签库描述文件(Tag Library Descriptor)
    • 标签处理类(Tag Handel Class)
  • 在Web应用中使用JSTL
    • Jar包
  • 核心标签库的使用
    • 标签库内容
      • 核心标签库
      • 通用标签库
      • 条件标签
      • 迭代标签
  • 国际化标签的使用
    • 概念
    • 支持国际化的Java类
    • JSTL中的国际化常用标签
    • 实例:帐号注册页面的国际化例子
  • 格式化标签的使用
    • 支持格式化的Java类
    • 格式化标签
  • 总结

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包

  1. 要在Web应用中使用JSTL,需要用到JSTL的jar包,分别是jstl.jarstandard.jar
  2. 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>

image.png

条件标签

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

image.png

<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}"/>&nbsp;&nbsp;
</c:forEach>
<h4>循环输出数,步长为2</h4>
<c:forEach var="i" begin="1" end="10" step="2">
  <c:out value="${i}"/>&nbsp;&nbsp;
</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>
…

image.png

<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}"/>&copy;
 </c:forTokens>
<h4>使用"|,"作为分割符</h4>
 <c:forTokens var="token" items="bule,red,green|yellow|pink,black|white" delims="|,">
 <c:out value="${token}"/>&copy;
 </c:forTokens>
 <h4>使用"_"作为分割符</h4>
 <c:forTokens var="token" items="bule,red,green|yellow|pink,black|white" delims="_">
 <c:out value="${token}"/>&copy;
 </c:forTokens>

image.png

国际化标签的使用

概念

国际化的英文是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>

image.png

image.png

格式化标签的使用

支持格式化的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>

image.png

  • <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页面中的各种条件
  • 迭代标签用于遍历某个集合中的元素
  • 国际化标签用来根据客户端的不同语言环境显示不同的页面内容
  • 格式化标签可以格式化数字、时间和货币

相关文章:

  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • React受控组件与非受控组件详解
  • Rust(4): 字符串类型
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • OSG跨平台编译:CMake跨平台安装(Windows、Linux、MacOS环境下安装)
  • OSG学习之一:坐标系
  • 治疗肺炎和脑膜炎的美国生物制药公司【Alopexx】申请纳斯达克IPO
  • Vue基础之事件机制、事件修饰符以及双向数据绑定
  • linux socket:接收时阻塞与非阻塞的设置
  • 9月23日计算机视觉基础学习笔记——经典机器学习
  • leetcode 并查集整理
  • 前端 | 50天50个前端项目把握基础知识 - 持续更新中
  • 【智能优化算法-凌日搜索算法】基于凌日搜索算法求解单目标优化问题附matlab代码
  • C++11重写muduo网络库5——Thread,EventLoopThread,EventLoopThreadPool
  • NISP的渗透测试怎么操作的
  • C++类中的特殊成员函数
  • Docker容器管理
  • ES6语法详解(一)
  • java中具有继承关系的类及其对象初始化顺序
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • ucore操作系统实验笔记 - 重新理解中断
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 如何胜任知名企业的商业数据分析师?
  • 思考 CSS 架构
  • 探索 JS 中的模块化
  • 协程
  • 学习JavaScript数据结构与算法 — 树
  • elasticsearch-head插件安装
  • #git 撤消对文件的更改
  • (2.2w字)前端单元测试之Jest详解篇
  • (第27天)Oracle 数据泵转换分区表
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (简单) HDU 2612 Find a way,BFS。
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Linux整合apache和tomcat构建Web服务器
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net 按比例显示图片的缩略图
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET业务框架的构建
  • .skip() 和 .only() 的使用
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @Import注解详解
  • [ NOI 2001 ] 食物链
  • []Telit UC864E 拨号上网
  • [2010-8-30]
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [C#]winform部署yolov9的onnx模型
  • [C++核心编程](四):类和对象——封装
  • [dts]Device Tree机制