JSTL : 标签库详解

以下内容仅供学习使用!

JSTL 简介

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个JSP标签集合,封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。
除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

同时使用JSLT标签的目的之一就是不希望在 jsp 页面中出现 java 代码。


JSTL 安装与使用

下载方法 :
使用JSTL可以使用安装下载 jar 包的方式,下载好后,导入项目的WEN-INF的lib目录下即可!
JSTL 标签下载地址
 
也可以使用 Maven jar包管理工具安装使用

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

最后在JSP页面中引入核心标签库的代码:
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


一、JSTL标签库 分类

  • 核心标签 (用得最多)
  • 国际化标签 ( I18N格式化标签 )
  • 数据库标签 ( SQL标签,很少使用 )
  • XML标签
  • JSTL函数 ( EL函数 )

二、核心标签

核心标签库使用说明

JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作。

从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。
    (1)表达式控制标签:out标签、set标签、remove标签、catch标签。
    (2)流程控制标签:if标签、choose标签、when标签、otherwise标签。
    (3)循环标签:forEach标签、forTokens标签。
    (4)URL操作标签:import标签、url标签、redirect标签、param标签。

核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

表达式控制标签

  1. out 标签

功能:主要是用来输出数据对象(字符串、表达式)的内容或结果。

语法:<c:out value=”要显示的数据对象” [escapeXml=”true|false”] [default=”默认值”]/>

属性:

标签描述
value输出的内容
escapeXml是否忽略 XML 转义字符
导default是否使用默认值

栗子:

<%@ page language="java" pageEncoding="UTF-8"%>
<%--引入JSTL核心标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE HTML>
<html>
<head>
   <title>JSTL: --表达式控制标签“out”标签的使用</title>
</head>
 <body>
     <h3><c:out value="下面的代码演示了c:out的使用,以及在不同属性值状态下的结果。"/></h3>
     <hr/>
     <ul>
        <%--(1)直接输出了一个字符串。 --%>
        <li>(1)<c:out value="JSTL的out标签的使用" /></li>
       
        <li>(2)<c:out value="<a href='http://www.cnblogs.com/'>点击链接到博客园</a>" /></li>
        <%--escapeXml="false"表示value值中的html标签不进行转义,而是直接输出 --%>
        <li>(3)<c:out value="<a href='http://www.cnblogs.com/'>点击链接到博客园</a>" escapeXml="false"/></li>
        
        <%--(4)字符串中有转义字符,但在默认情况下没有转换。 --%>
        <li>(4)<c:out value="&lt未使用字符转义&gt" /></li>
         <%--(5)使用了转义字符&lt和&gt分别转换成<>符号。 --%>
        <li>(5)<c:out value="&lt使用字符转义&gt" escapeXml="false"></c:out></li>
       
        <%--(6)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。 --%>
        <li>(6)<c:out value="${null}">使用了默认值</c:out></li>
        <%--(7)未设定默认值,输出结果为空。 --%>
        <li>(7)<c:out value="${null}"></c:out></li>
         
        <%--(8)设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值。 --%>
        <li>(8)<c:out value="${null}" default="默认值"/></li>
        <%--(9)未设定默认值,输出结果为空。 --%>
        <li>(9)<c:out value="${null}"/></li>
   </ul>
 </body>
 </html>
  1. set标签

功能:主要是用来用于保存数据或结果。

语法:<c:set var="<string>" value="<string>" target="<string>" property="<string>" scope="<string>"/>

属性:

标签描述
value要存储的值
target要修改的属性所属的对象
property要修改的属性
var存储信息的变量
scopevar属性的作用域

如果指定了target属性,那么property属性也需要被指定。

<%@ 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:set 标签实例</title>
</head>
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:out value="${salary}"/>
</body>
</html>
  1. remove标签

功能:用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

语法:<c:remove var="<string>" scope="<string>"/>

属性:

标签描述
var要移除的变量名称
scope变量所属的作用域
<%@ 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:remove 标签实例</title>
</head>
<body>
<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>
</body>
</html>
  1. catch标签

功能:主要用来处理产生错误的异常状况,并且将错误信息储存起来。

语法:<c:catch var="<string>"> ... </c:catch>

属性:

标签描述
var用来储存错误信息的变量
<%@ 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:catch 标签实例</title>
</head>
<body>

<c:catch var ="catchException">
   <% int x = 5/0;%>
</c:catch>

<c:if test = "${catchException != null}">
   <p>异常为 : ${catchException} <br />
   发生了异常: ${catchException.message}</p>
</c:if>

</body>
</html>

流程控制标签

  1. if标签

功能:判断表达式的值,如果表达式的值为 true 则执行其主体内容。

语法:<c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if>

属性:

标签描述
test条件
var用于存储条件结果的变量
scopevar属性的作用域
<%@ 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:if 标签实例</title>
</head>
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
   <p>我的工资为: <c:out value="${salary}"/><p>
</c:if>
</body>
</html>
  1. c:choose标签

功能:用于在众多选项中做出选择。

语法:

<c:choose>
    <c:when test="<boolean>">
        ...
    </c:when>
    <c:when test="<boolean>">
        ...
    </c:when>
    ...
    ...
    <c:otherwise>
        ...
    </c:otherwise>
</c:choose>

<c:choose>标签没有属性。
<c:when>标签只有一个属性,在下表中有给出。
<c:otherwise>标签没有属性。

属性:

标签描述
test条件
<%@ 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:choose 标签实例</title>
</head>
<body>
<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 > 1000}">
       不错的薪水,还能生活。
    </c:when>
    <c:otherwise>
        什么都没有。
    </c:otherwise>
</c:choose>
</body>
</html>
  1. when标签

功能:<c:choose>的子标签,用来判断条件是否成立。

  1. otherwise标签

功能:<c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行


循环标签

  1. forEach标签

功能:更加通用的标签,因为它迭代一个集合中的对象。封装了Java中的for,while,do-while循环。

语法:

<c:forEach
    items="<object>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">

    ...

属性:

标签描述
items要被循环的信息
begin开始的元素(0=第一个元素,1=第二个元素)
end最后一个元素(0=第一个元素,1=第二个元素)
step每一次迭代的步长
var代表当前条目的变量名称
varStatus代表循环状态的变量名称
<%@ 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:forEach 标签实例</title>
</head>
<body>
<c:forEach var="i" begin="1" end="5">
   Item <c:out value="${i}"/><p>
</c:forEach>
</body>
</html>
  1. forTokens标签

功能:通过指定分隔符将字符串分隔为一个数组然后迭代它们。

语法:

<c:forTokens
    items="<string>"
    delims="<string>"
    begin="<int>"
    end="<int>"
    step="<int>"
    var="<string>"
    varStatus="<string>">

属性:

标签描述
delims分隔符

<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:

<%@ 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:forTokens 标签实例</title>
</head>
<body>
<c:forTokens items="google,runoob,taobao" delims="," var="name">
   <c:out value="${name}"/><p>
</c:forTokens>
</body>
</html>

URL操作标签

  1. import标签

功能:提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。可以包含一个FTP服务器中不同的网页内容。

语法:

<c:import
   url="<string>"
   var="<string>"
   scope="<string>"
   varReader="<string>"
   context="<string>"
   charEncoding="<string>"/>

属性:

标签描述
url待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源
context当使用相对路径访问外部context资源时,context指定了这个资源的名字。
charEncoding所引入的数据的字符编码集
var用于存储所引入的文本的变量
scopevar属性的作用域
varReader可选的用于提供java.io.Reader对象的变量
<%@ 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:import 标签实例</title>
</head>
<body>
<c:import var="data" url="http://www.runoob.com"/>
<c:out value="${data}"/>
</body>
</html>

以上程序将会打印http://www.runoob.com"页面的源代码

  1. url标签

功能:将URL格式化为一个字符串,然后存储在一个变量中。这个标签在需要的时候会自动重写URL。

只是用于调用response.encodeURL() 方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

语法:

<c:url
  var="<string>"
  scope="<string>"
  value="<string>"
  context="<string>"/>

属性:

标签描述
value基础URL
context本地网络应用程序的名称
var代表URL的变量名
scopevar属性的作用域
<%@ 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:url 标签实例</title>
</head>
<body>
    <h1>&lt;c:url&gt实例 Demo</h1>
    <a href="<c:url value="http://www.runoob.com"/>">
     这个链接通过 &lt;c:url&gt; 标签生成。
    </a>
</body>
</html>
  1. redirect标签

功能:通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。

语法:<c:redirect url="<string>" context="<string>"/>

属性:

标签描述
url目标URL
context接着一个本地网络应用程序的名称

如果你需要向 <c:import> 标签传递参数, 请先用 <c:url> 标签来创建URL地址,如下所示:

<%@ 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:redirect 标签实例</title>
</head>
<body>
<c:redirect url="http://www.runoob.com"/>
</body>
</html>
  1. param标签

功能:用于在 <c:url> 标签中指定参数,而且与 URL 编码相关。

语法:<c:param name="<string>" value="<string>"/>

属性:

标签描述
nameURL中要设置的参数的名称
value参数的值
如果想要向<c:param>标签中传递参数,需要先使用<c:url>标签来创建URL:
<%@ 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:forTokens 标签实例</title>
</head>
<body>
        <h1>&lt;c:param&gt; 实例</h1>
        <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>
</body>
</html>



三、格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

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


  1. formatNumber标签

功能:用于格式化数字,百分比,货币。

语法:

<fmt:formatNumber
  value="<string>"
  type="<string>"
  pattern="<string>"
  currencyCode="<string>"
  currencySymbol="<string>"
  groupingUsed="<string>"
  maxIntegerDigits="<string>"
  minIntegerDigits="<string>"
  maxFractionDigits="<string>"
  minFractionDigits="<string>"
  var="<string>"
  scope="<string>"/>

属性:

标签描述
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型
pattern指定一个自定义的格式化模式用与输出
currencyCode货币码(当type="currency"时)
currencySymbol货币符号 (当 type="currency"时)
groupingUsed是否对数字分组 (TRUE 或 FALSE)
maxIntegerDigits整型数最大的位数
minIntegerDigits整型数最小的位数
maxFractionDigits小数点后最大的位数
minFractionDigits小数点后最小的位数
var存储格式化数字的变量
scopevar属性的作用域
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
  <title>JSTL fmt:formatNumber 标签</title>
</head>
<body>
<h3>数字格式化:</h3>
<c:set var="balance" value="120000.2309" />
<p>格式化数字 (1): <fmt:formatNumber value="${balance}" 
            type="currency"/></p>
<p>格式化数字 (2): <fmt:formatNumber type="number" 
            maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (3): <fmt:formatNumber type="number" 
            maxFractionDigits="3" value="${balance}" /></p>
<p>格式化数字 (4): <fmt:formatNumber type="number" 
            groupingUsed="false" value="${balance}" /></p>
<p>格式化数字 (5): <fmt:formatNumber type="percent" 
            maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (6): <fmt:formatNumber type="percent" 
            minFractionDigits="10" value="${balance}" /></p>
<p>格式化数字 (7): <fmt:formatNumber type="percent" 
            maxIntegerDigits="3" value="${balance}" /></p>
<p>格式化数字 (8): <fmt:formatNumber type="number" 
            pattern="###.###E0" value="${balance}" /></p>
<p>美元 :
<fmt:setLocale value="en_US"/>
<fmt:formatNumber value="${balance}" type="currency"/></p>
</body>
</html>
  1. parseNumber标签

功能:用来解析数字,百分数,货币。

语法:

<fmt:parseNumber
  value="<string>"
  type="<string>"
  pattern="<string>"
  parseLocale="<string>"
  integerOnly="<string>"
  var="<string>"
  scope="<string>"/>

属性:

标签描述
value要解析的数字
typeNUMBER,CURRENCY,或 PERCENT类型
parseLocale解析数字时所用的区域
integerOnly是否只解析整型数(true)或浮点数(false)
pattern自定义解析模式
timeZone要显示的日期的时区
var存储待解析数字的变量
scopevar属性的作用域
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
  <title>JSTL fmt:parseNumber 标签</title>
</head>
<body>
<h3>数字解析:</h3>
<c:set var="balance" value="1250003.350" />

<fmt:parseNumber var="i" type="number" value="${balance}" />
<p>数字解析 (1) : <c:out value="${i}" /></p>
<fmt:parseNumber var="i" integerOnly="true" 
                       type="number" value="${balance}" />
<p>数字解析 (2) : <c:out value="${i}" /></p>

</body>
</html>
  1. formatDate标签

功能:用于使用不同的方式格式化日期。

语法:

<fmt:formatDate
  value="<string>"
  type="<string>"
  dateStyle="<string>"
  timeStyle="<string>"
  pattern="<string>"
  timeZone="<string>"
  var="<string>"
  scope="<string>"/>

属性:

标签描述
value要显示的日期
typeDATE, TIME, 或 BOTH
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULT
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULT
timeZoneFULL, LONG, MEDIUM, SHORT, 或 DEFAULT
pattern显示日期的时区
var存储格式化数字的变量
scopevar属性的作用域
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
  <title>JSTL fmt:dateNumber 标签</title>
</head>
<body>
<h3>日期格式化:</h3>
<c:set var="now" value="<%=new java.util.Date()%>" />

<p>日期格式化 (1): <fmt:formatDate type="time" 
            value="${now}" /></p>
<p>日期格式化 (2): <fmt:formatDate type="date" 
            value="${now}" /></p>
<p>日期格式化 (3): <fmt:formatDate type="both" 
            value="${now}" /></p>
<p>日期格式化 (4): <fmt:formatDate type="both" 
            dateStyle="short" timeStyle="short" 
            value="${now}" /></p>
<p>日期格式化 (5): <fmt:formatDate type="both" 
            dateStyle="medium" timeStyle="medium" 
            value="${now}" /></p>
<p>日期格式化 (6): <fmt:formatDate type="both" 
            dateStyle="long" timeStyle="long" 
            value="${now}" /></p>
<p>日期格式化 (7): <fmt:formatDate pattern="yyyy-MM-dd" 
            value="${now}" /></p>

</body>
</html>
  1. parseDate标签

功能:用于解析日期。

语法:

<fmt:parseDate
   value="<string>"
   type="<string>"
   dateStyle="<string>"
   timeStyle="<string>"
   pattern="<string>"
   timeZone="<string>"
   parseLocale="<string>"
   var="<string>"
   scope="<string>"/>
  scope="<string>"/>

属性:

标签描述
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型
pattern指定一个自定义的格式化模式用与输出
currencyCode货币码(当type="currency"时)
currencySymbol货币符号 (当 type="currency"时)
groupingUsed是否对数字分组 (TRUE 或 FALSE)
maxIntegerDigits整型数最大的位数
minIntegerDigits整型数最小的位数
maxFractionDigits小数点后最大的位数
minFractionDigits小数点后最小的位数
var存储格式化数字的变量
scopevar属性的作用域
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<html>
<head>
  <title>JSTL fmt:parseDate 标签</title>
</head>
<body>
<h3>日期解析:</h3>
<c:set var="now" value="20-10-2015" />

<fmt:parseDate value="${now}" var="parsedEmpDate" 
                              pattern="dd-MM-yyyy" />
<p>解析后的日期为: <c:out value="${parsedEmpDate}" /></p>

</body>
</html>
  1. bundle标签

功能:将指定的资源束对出现在<fmt:bundle>标签中的<fmt:message>标签可用。这可以使您省去为每个<fmt:message>标签指定资源束的很多步骤。

语法:<fmt:bundle baseName="<string>" prefix="<string>"/>

下面的两个<fmt:bundle>块将产生同样的输出:

<fmt:bundle basename="com.runoob.Example">
    <fmt:message key="count.one"/>
</fmt:bundle>

<fmt:bundle basename="com.runoob.Example" prefix="count.">
    <fmt:message key="title"/>
</fmt:bundle>

属性:

标签描述
basename指定被载入的资源束的基础名称
prefix指定<fmt:message>标签key属性的前缀

定义一个默认的资源束:

package com.runoob;

import java.util.ListResourceBundle;

public class Example_En extends ListResourceBundle {
  public Object[][] getContents() {
    return contents;
  }
  static final Object[][] contents = {
  {"count.one", "One"},
  {"count.two", "Two"},
  {"count.three", "Three"},
  };
}

编译以上文件为 Example.class,然后放在Web应用程序的CLASSPATH能找到的地方。现在可以使用JSTL来显示这三个数字了,就像这样:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>JSTL fmt:bundle 标签</title>
</head>
<body>

<fmt:bundle basename="com.runoob.Example" prefix="count.">
   <fmt:message key="one"/><br/>
   <fmt:message key="two"/><br/>
   <fmt:message key="three"/><br/>
</fmt:bundle>

</body>
</html>



四、SQL标签

提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>


  1. setDataSource标签

功能:用来配置数据源或者将数据源信息存储在某作用域的变量中,用来作为其它JSTL数据库操作的数据源。

语法:

<sql:setDataSource
  var="<string>"
  scope="<string>"
  dataSource="<string>"
  driver="<string>"
  url="<string>"
  user="<string>"
  password="<string>"/>

属性:

标签描述
driver要注册的JDBC驱动
url数据库连接的JDBC URL
user数据库用户名
password数据库密码
dataSource数据源
var代表数据库的变量
scopevar属性的作用域

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<html>
<head>
<title>JSTL sql:setDataSource Tag</title>
</head>
<body>
 
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost/TEST"
     user="user_id"  password="mypassword"/>

<sql:query dataSource="${snapshot}" sql="..." var="result" />
 
</body>
</html>
  1. query标签

功能:用于运行SQL SELECT语句,还有就是将结果存储在作用域变量中。

语法:

<sql:query
  var="<string>"
  scope="<string>"
  sql="<string>"
  dataSource="<string>"
  startRow="<string>"
  maxRows="<string>"/>

属性:

标签描述
sql需要执行的SQL命令(返回一个ResultSet对象)
dataSource所使用的数据库连接(覆盖默认值)
maxRows存储在变量中的最大结果数
startRow开始记录的结果的行数
var代表数据库的变量
scopevar属性的作用域

栗子

create table Employees
    (
     id int not null,
     age int not null,
     first varchar (255),
     last varchar (255)
    );
INSERT INTO Employees VALUES (100, 18, 'Zara', 'Ali');
INSERT INTO Employees VALUES (102, 30, 'Zaid', 'Khan');
INSERT INTO Employees VALUES (103, 28, 'Sumit', 'Mittal');
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

<html>
<head>
<title>JSTL sql:query Tag</title>
</head>
<body>
 
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost/TEST"
     user="root"  password="pass123"/>

<sql:query dataSource="${snapshot}" var="result">
SELECT * from Employees;
</sql:query>
 
<table border="1" width="100%">
<tr>
<th>Emp ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Age</th>
</tr>
<c:forEach var="row" items="${result.rows}">
<tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.first}"/></td>
<td><c:out value="${row.last}"/></td>
<td><c:out value="${row.age}"/></td>
</tr>
</c:forEach>
</table>

</body>
</html>
  1. update标签

功能:用来执行一个没有返回值的SQL语句,比如SQL INSERT,UPDATE,DELETE语句。

语法:<sql:update var="<string>" scope="<string>" sql="<string>" dataSource="<string>"/>

属性:

标签描述
sql需要执行的SQL命令(不返回ResultSet对象)
dataSource所使用的数据库连接(覆盖默认值)
var用来存储所影响行数的变量
scopevar属性的作用域

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%@ page import="javax.servlet.http.*,javax.servlet.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

<html>
<head>
<title>JSTL sql:update 标签</title>
</head>
<body>
 
<sql:setDataSource var="snapshot" driver="com.mysql.jdbc.Driver"
     url="jdbc:mysql://localhost/TEST"
     user="root"  password="pass123"/>

<sql:update dataSource="${snapshot}" var="count">
   INSERT INTO Employees VALUES (104, 2, 'Nuha', 'Ali');
</sql:update>

<sql:query dataSource="${snapshot}" var="result">
   SELECT * from Employees;
</sql:query>
 
<table border="1" width="100%">
<tr>
<th>Emp ID</th>
<th>First Name</th>
<th>Last Name</th>
<th>Age</th>
</tr>
<c:forEach var="row" items="${result.rows}">
<tr>
<td><c:out value="${row.id}"/></td>
<td><c:out value="${row.first}"/></td>
<td><c:out value="${row.last}"/></td>
<td><c:out value="${row.age}"/></td>
</tr>
</c:forEach>
</table>

</body>
</html>



五、XML标签

提供了创建和操作XML文档的标签。引用XML标签库的语法如下:

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

  1. out标签

功能:显示XPath表达式的结果,与<%= %>功能相似。

语法:<x:out select="<string>" escapeXml="<true|false>"/>

属性:

标签描述
select需要计算的XPath表达式,通常使用XPath 变量
escapeXml是否忽略XML 特殊字符
栗子
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

<html>
<head>
  <title>JSTL x:out 标签</title>
</head>
<body>
<h3>Books Info:</h3>

<c:set var="xmltext">
  <books>
    <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
    </book>
    <book>
      <name>Great Mistry</name>
      <author>NUHA</author>
      <price>2000</price>
    </book>
  </books>
</c:set>

<x:parse xml="${xmltext}" var="output"/>
<b>The title of the first book is</b>: 
<x:out select="$output/books/book[1]/name" />
<br>
<b>The price of the second book</b>: 
<x:out select="$output/books/book[2]/price" />
</body>
</html>
  1. parse标签

功能:用来解析属性中或标签主体中的XML数据。

语法:

<x:parse
  var="<string>"
  varDom="<string>"
  scope="<string>"
  scopeDom="<string>"
  doc="<string>"
  systemId="<string>"
  filter="<string>"/>

属性:

标签描述
var包含已解析XML数据的变量
xml需要解析的文档的文本内容(String或Reader)
systemId系统标识符URI,用来解析文档
filter应用于源文档的过滤器
doc需要解析的XML文档
scopevar属性的作用域
varDom包含已解析XML数据的变量
scopeDomvarDom属性的作用域
栗子
books.xml文件代码如下:
<books>
<book>
  <name>Padam History</name>
  <author>ZARA</author>
  <price>100</price>
</book>
<book>
  <name>Great Mistry</name>
  <author>NUHA</author>
  <price>2000</price>
</book>
</books>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

<html>
<head>
  <title>JSTL x:parse 标签</title>
</head>
<body>
<h3>Books Info:</h3>
<c:import var="bookInfo" url="http://localhost:8080/books.xml"/>

<x:parse xml="${bookInfo}" var="output"/>
<b>The title of the first book is</b>: 
<x:out select="$output/books/book[1]/name" />
<br>
<b>The price of the second book</b>: 
<x:out select="$output/books/book[2]/price" />

</body>
</html>
  1. set标签

功能:用于为XPath表达式的值设置一个变量。

语法:<x:set var="<string>" select="<string>" scope="<string>"/>

属性:

标签描述
var代表XPath表达式值得变量
select需要计算的XPath表达式
scopevar属性的作用域
栗子
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

<html>
<head>
  <title>JSTL x:set 标签</title>
</head>
<body>
<h3>Books Info:</h3>

<c:set var="xmltext">
  <books>
    <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
    </book>
    <book>
      <name>Great Mistry</name>
      <author>NUHA</author>
      <price>2000</price>
    </book>
  </books>
</c:set>

<x:parse xml="${xmltext}" var="output"/>
<x:set var="fragment" select="$output//book"/>
<b>The price of the second book</b>: 
<c:out value="${fragment}" />
</body>
</html>
  1. transform标签

功能:用于在XML文档中应用XSL。

语法:

<x:transform
   var="<string>"
   scope="<string>"
   result="<string>"
   doc="<string>"
   docSystemId="<string>"
   xslt="<string>"
   xsltSystemId="<string>"/>

属性:

标签描述
doc源XML文档
docSystemId源XML文档的URI
xsltXSLT 样式表
xsltSystemId源XSLT文档的URI
result接收转换结果的对象
var代表被转换的XML文档的变量
scopevar属性的作用域
栗子
style.xsl 文件
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=
"http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="html" indent="yes"/>

<xsl:template match="/">
  <html>
  <body>
   <xsl:apply-templates/>
  </body>
  </html>
</xsl:template>

<xsl:template match="books">
  <table border="1" width="100%">
    <xsl:for-each select="book">
      <tr>
        <td>
          <i><xsl:value-of select="name"/></i>
        </td>
        <td>
          <xsl:value-of select="author"/>
        </td>
        <td>
          <xsl:value-of select="price"/>
        </td>
      </tr>
    </xsl:for-each>
  </table>
</xsl:template>

main.jsp 文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

<html>
<head>
  <title>JSTL x:transform 标签</title>
</head>
<body>
<h3>Books Info:</h3>
<c:set var="xmltext">
  <books>
    <book>
      <name>Padam History</name>
      <author>ZARA</author>
      <price>100</price>
    </book>
    <book>
      <name>Great Mistry</name>
      <author>NUHA</author>
      <price>2000</price>
    </book>
  </books>
</c:set>

<c:import url="http://localhost:8080/style.xsl" var="xslt"/>
<x:transform xml="${xmltext}" xslt="${xslt}"/>

</body>
</html>



六、JSTL函数

一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:

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

  1. contains()函数

功能:用于确定一个字符串是否包含指定的子串。

语法:

<c:if test="${fn:contains(<原始字符串>, <要查找的子字符串>)}">
...
</c:if>

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="theString" value="I am from runoob"/>

<c:if test="${fn:contains(theString, 'runoob')}">
   <p>找到 runoob<p>
</c:if>

<c:if test="${fn:contains(theString, 'RUNOOB')}">
   <p>找到 RUNOOB<p>
</c:if>

</body>
</html>
  1. containsIgnoreCase()函数

功能:用于确定一个字符串是否包含指定的子串,忽略大小写。

语法:

<c:if test="${fn:containsIgnoreCase(<原始字符串>, <要查找的子字符串>)}">
...
</c:if>

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="theString" value="I am from runoob"/>

<c:if test="${fn:containsIgnoreCase(theString, 'runoob')}">
   <p>找到 runoob<p>
</c:if>

<c:if test="${fn:containsIgnoreCase(theString, 'RUNOOB')}">
     <p>找到 RUNOOB<p>
</c:if>

</body>
</html>
  1. endsWith()函数

功能:用于确定一个字符串是否以指定后缀结尾。

语法:

<c:if test="${fn:endsWith(<原始字符串>, <要查找的子字符串>)}">
...
</c:if>

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="theString" value="I am from runoob 123"/>

<c:if test="${fn:endsWith(theString, '123')}">
   <p>字符串以 123 结尾<p>
</c:if>

<c:if test="${fn:endsWith(theString, 'unoob')}">
   <p>字符串以 runoob 结尾<p>
</c:if>

</body>
</html>
  1. escapeXml()函数

功能:忽略用于XML标记的字符。

语法:${fn:escapeXml(<要转义标记的文本>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>Using JSTL Functions</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="This <abc>is second String.</abc>"/>

<p>使用 escapeXml() 函数:</p>
<p>string (1) : ${fn:escapeXml(string1)}</p>
<p>string (2) : ${fn:escapeXml(string2)}</p>

<p>不使用 escapeXml() 函数:</p>
<p>string (1) : ${string1}</p>
<p>string (2) : ${string2}</p>

</body>
</html>
  1. indexOf()函数

功能:返回一个字符串中指定子串的位置。

语法:${fn:indexOf(<原始字符串>,<子字符串>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>Using JSTL Functions</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="This <abc>is second String.</abc>"/>

<p>Index (1) : ${fn:indexOf(string1, "first")}</p>
<p>Index (2) : ${fn:indexOf(string2, "second")}</p>

</body>
</html>
  1. join()函数

功能:将一个数组中的所有元素使用指定的分隔符来连接成一个字符串。

语法:${fn:join([数组], <分隔符>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="www runoob com"/>
<c:set var="string2" value="${fn:split(string1, ' ')}" />
<c:set var="string3" value="${fn:join(string2, '-')}" />

<p>字符串为 : ${string3}</p>

</body>
</html>
  1. length()函数

功能:返回字符串长度或集合中元素的数量。

语法:${fn:length(collection | string)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="This is second String." />

<p>字符串长度 (1) : ${fn:length(string1)}</p>
<p>字符串长度 (2) : ${fn:length(string2)}</p>

</body>
</html>
  1. replace()函数

功能:将字符串中所有指定的子串用另外的字符串替换。

语法:${fn:replace(<原始字符串>, <被替换的字符串>, <要替换的字符串>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="I am from google"/>
<c:set var="string2" value="${fn:replace(string1, 
                                'google', 'runoob')}" />

<p>替换后的字符串 : ${string2}</p>

</body>
</html>
  1. split()函数

功能:将一个字符串用指定的分隔符分裂为一个子串数组。

语法:${fn:split(<待分隔的字符串>, <分隔符>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="www runoob com"/>
<c:set var="string2" value="${fn:split(string1, ' ')}" />
<c:set var="string3" value="${fn:join(string2, '-')}" />

<p>string3 字符串 : ${string3}</p>

<c:set var="string4" value="${fn:split(string3, '-')}" />
<c:set var="string5" value="${fn:join(string4, ' ')}" />

<p>string5 字符串: ${string5}</p>

</body>
</html>
  1. startsWith()函数

功能:用于确定一个字符串是否以指定的前缀开始。

语法:

<c:if test="${fn:startsWith(<原始字符串>, <搜索的前缀>)}">
            ...
</c:if>

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string" value="Runoob: I am from Runoob."/>
<c:if test="${fn:startsWith(string, 'Google')}">
   <p>字符串以 Google 开头</p>
</c:if>
<br />
<c:if test="${fn:startsWith(string, 'Runoob')}">
   <p>字符串以 Runoob 开头</p>
</c:if>

</body>
</html>
  1. substring()函数

功能:返回字符串中指定开始和结束索引的子串。

语法:${fn:substring(<string>, <beginIndex>, <endIndex>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="${fn:substring(string1, 5, 15)}" />

<p>生成的子字符串为 : ${string2}</p>

</body>
</html>
  1. substringAfter()函数

功能:返回字符串中指定子串后面的部分。

语法:${fn:substringAfter(<string>, <substring>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="${fn:substringAfter(string1, 'is')}" />

<p>生成的子字符串 : ${string2}</p>

</body>
</html>
  1. substringBefore()函数

功能:返回一个字符串中指定子串前面的部分。

语法:${fn:substringBefore(<string>, <substring>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="This is first String."/>
<c:set var="string2" value="${fn:substringBefore(string1, 
                                            'first')}" />
<p>生成的子字符串 : ${string2}</p>

</body>
</html>
  1. toLowerCase()函数

功能:将字符串中的所有字符转为小写。

语法:${fn.toLowerCase(<string>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="I am from RUNOOB"/>
<c:set var="string2" value="${fn:toLowerCase(string1)}" />

<p>字符串为 : ${string2}</p>

</body>
</html>
  1. toUpperCase()函数

功能:将一个字符串中的所有字符转为大写。

语法:${fn:toUpperCase(<string>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="I am from runoob"/>
<c:set var="string2" value="${fn:toUpperCase(string1)}" />

<p>字符串为 : ${string2}</p>

</body>
</html>
  1. trim()函数

功能:将字符串两端的空白符移除。

语法:${fn:trim(<string>)}

栗子

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>使用 JSTL 函数</title>
</head>
<body>

<c:set var="string1" value="I am from runoob         "/>
<p>string1 长度 : ${fn:length(string1)}</p>

<c:set var="string2" value="${fn:trim(string1)}" />
<p>string2 长度 : ${fn:length(string2)}</p>
<p>字符串为 : ${string2}</p>

</body>
</html>
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZC~Reunion

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值