zoukankan      html  css  js  c++  java
  • JSP标准标签库(JSTL)个人使用指南

    前排提示,本篇仅涉及 JSTL 的配置和简要介绍 JSTL 的 Core 和 Functions 标签库中几个常用的标签。更加详细的内容,博主会贴相应超链接。

    注意:本教程使用的 JSTL 1.2,如果你使用的是 JSTL 1.1 或之前的版本,需要导入 jstl.jar 和 standard.jar 两个包。可点击 http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 链接下载 JSTL 1.1 及之前的版本。


    JSTL 规范由 Sun 公司制定,由 Apache 的 Jakarta 小组负责实现。JSTL 由 5 个不同功能的标签库组成,包括 Core、I18N、XML、SQL 以及 Functions;

    配置 JSTL

    注意:JSTL 现在已经是 Java EE5 的一个组成部分,如果采用支持 Java EE5 或以上版本的集成开发环境开发 Web 应用程序,就不需要再配置 JSTL 了。

    Update:2021/12/05

    Maven Web 项目下JSTL 使用分为如下步骤:

    • POM.xml 下导入坐标

      <dependency>
          <groupId>jstl</groupId>
          <artifactId>jstl</artifactId>
          <version>1.2</version>
      </dependency>
      <dependency>
          <groupId>taglibs</groupId>
          <artifactId>standard</artifactId>
          <version>1.1.2</version>
      </dependency>
      
    • 在JSP页面上引入JSTL标签库

      <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
      
    • 使用标签

    JSTL的下载

    使用 JSTL 需要引入 JSTL 的 JAR 包和标签库描述符文件(扩展名为 .tld),标签库描述符文件内包含标签库中所有标签的定义、标签名、功能类及各种属性。

    下载完毕以后可以根据使用的软件进行配置。

    Eclipse 平台

    如果你再用的是 Eclipse 平台,则需要配置 JSTL。配置 JSTL 的步骤如下:

    1)复制 JSTL 的标准实现

    在 Tomcat 的 \webapps\examples\WEB-INF\lib 目录下找到 taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.ja r文件,然后复制到 Web 工程的 WEB-INF\lib 目录下。

    2)使用 taglib 标记定义前缀与 uri 引用

    如果使用 Core 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

    如果使用 Functions 标签库,首先需要在 JSP 页面中使用 taglib 标记定义前缀与 uri 引用,代码如下:

    <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
    

    IDEA 平台

    1)复制 JSTL 的标准实现

    在 Tomcat 的 \webapps\examples\WEB-INF\lib 目录下找到 taglibs-standard-impl-1.2.5.jartaglibs-standard-spec-1.2.5.ja r文件,然后复制到 Web 工程的 WEB-INF\lib 目录下。

    2) 拷贝 tlb 文件

    把压缩包解压后得将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。

    接下来我们在 web.xml 文件中添加以下配置:可以根据需求增删

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4" 
        xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
        <jsp-config>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/fmt</taglib-uri>
        <taglib-location>/WEB-INF/fmt.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/fmt-rt</taglib-uri>
        <taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
        <taglib-location>/WEB-INF/c.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/core-rt</taglib-uri>
        <taglib-location>/WEB-INF/c-rt.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/sql</taglib-uri>
        <taglib-location>/WEB-INF/sql.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/sql-rt</taglib-uri>
        <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/x</taglib-uri>
        <taglib-location>/WEB-INF/x.tld</taglib-location>
        </taglib>
        <taglib>
        <taglib-uri>http://java.sun.com/jsp/jstl/x-rt</taglib-uri>
        <taglib-location>/WEB-INF/x-rt.tld</taglib-location>
        </taglib>
        </jsp-config>
    </web-app>
    

    使用任何库,你必须在每个 JSP 文件中的头部包含<taglib> 标签。

    核心标签

    JSTL 核心(core)标签是最常用的 JSTL 标签,导入核心标签库的语法如下:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    标签 说明
    <c:out> 将表达式的结果输出到页面中,类似于 <%= ...%>
    <c:set> 在指定范围内设置变量或属性值
    <c:if> 类似于 Java if 语句,用于条件判断
    <c:choose> 类似于 Java switch 关键字,为 <c:when>和<c:otherwise> 的父标签
    <c:when> <c:choose> 的子标签,用来判断条件是否成立
    <c:otherwise> <c:choose> 的子标签,当所有的 <c:when> 标签判断为 false 时被执行
    <c:forEach> 类似于 Java for,用于迭代集合中的信息
    <c:forTokens> 类似于 Java split,用于分隔字符串
    <c:remove> 用于删除数据
    <c:catch> 用于捕获异常
    <c:import> 用来导入静态或动态文件
    <c:param> 用来传入参数
    <c:redirect> 用于将当前页面重定向至另一个 URL
    <c:url> 用于将 URL 格式化为一个字符串

    格式化标签

    JSTL 格式化(fmt)标签可以通过很简单的方式转换数字、日期,导入格式化标签库的语法如下。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
    
    标签 说明
    <fmt:requestEncoding> 设置请求数据的字符编码
    <fmt:setLocale> 用于设置用户本地化环境
    <fmt:bundle> 绑定资源
    <fmt:message> 用来从指定的资源文件中调用信息
    <fmt:setBundle> 绑定资源
    <fmt:formatNumber> 用于格式化数字、百分比和货币
    <fmt:parseNumber> 用于解析数字、货币和百分比
    <fmt:formatDate> 用于使用不同的方式格式化日期
    <fmt:parseDate> 用于把字符串类型的日期转换成日期数据类型
    <fmt:timeZone> 用于指定时区
    <fmt:setTimeZone> 用于设定默认时区

    SQL标签

    JSTL SQL 标签提供了许多操作数据库(MySQL、Oracle、SQL Server 等)的标签。虽然在大型的网站中不建议使用这种标签库,但在小型网站中经常会用到。导入 SQL 标签库的语法如下。

    <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
    
    标签 说明
    <sql:setDataSource> 用来在 JSP 页面中配置数据源
    <sql:query> 查询数据库中的数据
    <sql:update> 更新数据库中的数据
    <sql:dateParam> 提供日期和时间的动态值
    <sql:transaction> 事务管理
    <sql:param> 设置 SQL 语句中的动态值

    函数标签

    JSTL 函数(fn)标签大部分是通用的字符串处理函数,导入函数标签库的语法如下:

    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
    
    标签 说明
    fn:contains() 用于判断一个字符串是否包含指定的字符串,区分大小写
    fn:containsIgnoreCase() 用于判断一个字符串是否包含指定的字符串,不区分大小写
    fn:endsWith() 用于判断一个字符串是否以指定的后缀结尾
    fn:escapeXml() 用于转义 HTML/XML 中的字符
    fn:indexOf() 用于返回字符串在指定字符串中的开始位置
    fn:join() 用来将数组中的所有元素利用指定的分隔符来连接成一个字符串
    fn:length() 用于返回指定字符串的长度
    fn:split() 用于将字符串用指定的分隔符分隔为一个子串数组
    fn:startsWith() 用于判断一个字符串是否以指定的前缀开头
    fn:substring() 用来返回指定字符串的子字符串
    fn:substringAfter() 用来返回字符串中指定子字符串后面的部分
    fn:substringBefore() 用来返回字符串中指定子字符串前面的部分
    fn:toLowerCase() 用来将指定字符串中的所有字符转为小写
    fn:toUpperCase() 将指定字符串中的所有字符转为大写
    fn:trim() 用来删除指定字符串两端的空格

    自定义标签

    自定义标签就是用户(开发者)自己定义的标签。自定义标签可以让 JSP 页面中不含有 Java 代码,只含有 HTML 代码和部分标签,就能实现业务逻辑的调用。

    自定义标签的优点如下:

    • 减少 JSP 页面对脚本的需求和依赖性
    • 将 JSP 页面和业务逻辑分开,增加了程序的可维护性
    • 可重复调用相同的业务逻辑,增加了程序的可重用性

    使用自定义标签步骤如下:

    1. 自定义标签实现类
    2. 编写 tld 标签库描述文件
    3. 在 JSP 页面中使用自定义标签

    自定义标签的语法

    使用 taglib 指令指定 tld 文件的路径。

    <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
    

    其中:prefix 指定自定义标签的前缀,uri 指定 tld 文件的路径。

    使用自定义标签有以下 2 种格式:

    <prefix:tagname attr1=value1....attrn=valuen />
    

    <prefix:tagname attr1=value1....attrn=valuen > 
        标签体
    </prefix:tagname>  
    

    其中:prefix 表示自定义标签的前缀,tagname 表示自定义标签的名称,attr 表示自定义标签的属性,value 表示自定义标签的属性值。

    简单示例

    下面创建一个简单的自定义标签 <ex:Hello>。

    1. 创建处理标签的Java类

    创建处理标签的 HelloTag 类,代码如下:

    public class HelloTag extends SimpleTagSupport {
        public void doTag() throws JspException, IOException {
            JspWriter out = getJspContext().getOut();
            out.println("Hello Tag!!!");
        }
    }
    

    以上代码重写了doTag() 方法,getJspContext() 方法用来获取 JspContext 对象,并将 out.println 中的内容传递给 JspWriter 对象。

    注意:SimpleTagSupport 实现了 SimpleTag 接口,该接口是 JSP 2.X 标签库新增的自定义标签接口类。该接口极其简单,提供了 doTag() 方法去处理自定义标签中的逻辑以及标签体。相对来说,JSP 1.X 比较复杂,处理标签的 Java 类需要继承 TagSupport 类,重写 doStartTag()、doAfterBody()、doEndTag() 等方法。

    2. 创建tld标签库描述文件

    tld 文件采用 XML 文件格式进行描述,后缀名为 .tld,用来将写好的类映射成 JSP 标签。tld 文件保存在 WEB-INF 目录下,为了管理方便,可以在目录下创建 tlds 文件夹。

    custom.tld 代码如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib
            PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
            "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
    <taglib>
        <!-- 标签库版本号 -->
        <tlib-version>1.0</tlib-version>
        <!-- JSP版本号 -->
        <jsp-version>2.0</jsp-version>
        <!-- 当前标签库的前缀 -->
        <short-name>Example TLD</short-name>
        <tag>
            <!-- 自定义标签的名称,在页面中通过它来使用标签 -->
            <name>Hello</name>
            <!-- 自定义标签的实现类路径 -->
            <tag-class>com.riotian.tag.HelloTag</tag-class>
            <!-- 正文内容正文内容,没有则用 empty 表示 -->
            <body-content>empty</body-content>
            <!-- 自定义标签的功能描述 -->
            <description>输出内容</description>
        </tag>
    </taglib>
    

    tld 文件中只能有一对 taglib 标签,taglib 标签下可以有多个 tag 标签,每个 tag 标签代表一个自定义标签。

    文章后面会对 tld 文件中的各个标签进行说明。

    3. 使用自定义标签

    使用自定义标签和使用 JSTL 标签是一样的, JSP 文件中使用 Hello 标签代码如下。

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Tag.jsp</title>
        </head>
        <body>
        <ex:Hello/>
        </body>
    </html>
    </html>
    

    运行结果如下:

    tld标签库描述文件

    tld 文件中常用的标签有 taglib、tag、attribute 和 variable。下面以 custom.tld 文件为例介绍其含义。

    1. <taglib>标签

    <taglib> 标签用来设置整个标签库信息,其说明如下表所示。

    属 性 说 明
    tlib-version 标签库版本号
    jsp-version JSP版本号
    short-name 当前标签库的前缀
    uri 页面引用的自定义标签的 uri 地址
    name 自定义标签名称
    tag-class 自定义标签实现类路径
    description 自定义标签的功能描述
    attribute 自定义标签的指定属性,可以有多个

    2. <tag>标签

    <tag> 标签用来定义标签具体的内容,其说明如下表所示。

    属 性 说 明
    name 自定义标签名称
    tag-class 自定义标签实现类
    body-content 有 3 个值:empty(表示没有标签体)、JSP(表示标签体可以加入 JSP 程序代码)、tagdependent(表示标签体中的内容由标签自己处理)
    description 自定义标签的功能描述
    attribute 自定义标签功能的指定属性,可以有多个
    variable 自定义标签的变量属性

    3. <attribute>标签

    <attribute> 标签用来定义 <tag> 标签中的属性,其说明如下表所示。

    属 性 说 明
    name 属性名称
    description 属性描述
    required 指定属性是否是必须的,默认值:false
    rtexprvalue 属性值是否支持 JSP 表达式
    type 定义该属性的 Java 类型,默认值:String
    fragment 如果声明了该属性,属性值将被视为一个 JspFragment

    使用 <attribute> 的属性时要注意元素顺序。

    4. <variable> 标签

    <variable> 标签用来定义 <tag> 标签中的变量属性,其说明如下表所示。

    属 性 说 明
    declare 变量声明
    description 变量描述
    name-from-attribute 指定的属性名称,其值为变量,在调用 JSP 页面时可以使用的名字
    name-given 变量名(标签使用时的变量名)
    scope 变量的作用范围,有 3 个值:NESTED 开始和结束标签之间、AT_BEGIN 从开始标签到页面结束、AT_END 从结束标签之后到页面结束
    variable-class 变量的 Java 类型,默认值:String

    自定义标签属性

    在自定义标签中设置属性,自定义标签类中必须有相应的 setter 方法。为 bc:Hello 标签添加 message 属性,HelloTag 类代码如下:

    public class HelloTag extends SimpleTagSupport {
          private String message;
    
          public void setMessage(String message) {
            this.message = message;
          }
    
          StringWriter sw = new StringWriter();
    
          public void doTag() throws JspException, IOException {
            if (message != null) {
                // 从属性中使用 message
                JspWriter out = getJspContext().getOut();
                out.println(message);
            } else{
                // 从内容中使用 message
                getJspBody().invoke(sw);
                getJspContext().getOut().println(sw.toString());
            }
          }
    }
    

    下面使用 <attribute> 标签为 <ex:Hello> 标签添加 message 属性:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib
            PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
            "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
    <taglib>
        <!-- 标签库版本号 -->
        <tlib-version>1.0</tlib-version>
        <!-- JSP版本号 -->
        <jsp-version>2.0</jsp-version>
        <!-- 当前标签库的前缀 -->
        <short-name>Example TLD</short-name>
        <tag>
            <!-- 自定义标签的名称,在页面中通过它来使用标签 -->
            <name>Hello</name>
            <!-- 自定义标签的实现类路径 -->
            <tag-class>com.riotian.tag.HelloTag</tag-class>
            <!-- 正文内容正文内容,没有则用 empty 表示 -->
            <body-content>tagdependent</body-content>
            <!-- 自定义标签的功能描述 -->
            <attribute>
                <name>message</name>
            </attribute>
        </tag>
    </taglib>
    

    这时就可以在 JSP 页面中使用 message 属性了,如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
             pageEncoding="UTF-8" %>
    <%@ taglib prefix="ex" uri="../WEB-INF/custom.tld" %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>Tag.jsp</title>
        </head>
        <body>
        <ex:Hello message="Welcome to RioTian'blog..."/>
        </body>
    </html>
    </html>
    

    自定义标签的标签体

    可以像 JSTL 标签库一样在标签中包含消息内容,如在 Hello 标签中包含内容,JSP 使用格式如下:

    <ex:Hello>
        Demo Demo Hello JSP Tap....
    </ex:Hello>
    

    修改 HelloTag 类,如下:

    public class HelloTag extends SimpleTagSupport {
      	StringWriter sw = new StringWriter();
    
        @Override
        public void doTag() throws JspException, IOException {
            getJspBody().invoke(sw);
            getJspContext().getOut().println(sw.toString());
            //super.doTag();
        }
    }
    

    修改 custom.tld 文件,如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE taglib
            PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
            "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
    <taglib>
        <!-- 标签库版本号 -->
        <tlib-version>1.0</tlib-version>
        <!-- JSP版本号 -->
        <jsp-version>2.0</jsp-version>
        <!-- 当前标签库的前缀 -->
        <short-name>Example TLD</short-name>
        <tag>
            <!-- 自定义标签的名称,在页面中通过它来使用标签 -->
            <name>Hello</name>
            <!-- 自定义标签的实现类路径 -->
            <tag-class>com.riotian.tag.HelloTag</tag-class>
            <!-- 正文内容正文内容,没有则用 empty 表示 -->
            <body-content>tagdependent</body-content>
        </tag>
    </taglib>
    

    运行结果如图所示。

    The desire of his soul is the prophecy of his fate
    你灵魂的欲望,是你命运的先知。

  • 相关阅读:
    ServletConfig类
    坑爹的去哪儿网订酒店经历
    python + opencv + pycharm +语音生成
    最近看到的工作要求
    pip in windows
    路由器外接硬盘做nas可行吗?
    阅读201706
    scrum学习
    学习concurrency programming进展
    Reactor/Proactor的比较 (ZZ)
  • 原文地址:https://www.cnblogs.com/RioTian/p/15608708.html
Copyright © 2011-2022 走看看