Java Server Pages(JSP)——7. JSTL

写在前面

JSP标准标签库(JavaServer Pages Standard TagLibrary, JSTL) 是一个定制标签库的集合, 用来解决像遍历Map或集合、 条件测试、 XML处理, 甚至数据库访问和数据操作等常见的问题。JSTL 1.2中的标签可以分成5类区域:核心、XML、国际化、数据库、函数。

JSTL的下载

JSTL目前的最新版本是1.2,可以在JCP(www.jcp.org)下载。其中, JSTL API和JSTL实现这两个软件是必需下载的。 JSTL API中包含javax.servlet. jsp.jstl包, 里面包含了JSTL规范中定义的类型。 JSTL实现中包含实现类。 这两个JAR文件都必须复制到应用JSTL的每个应用程序的WEB-INF/lib目录下。

JSPL的使用

在JSP页面中使用JSTL库, 必须通过以下格式使用taglib指令:

<%@ taglib uri="uri" prefix="prefix" %>

例如,要使用Core库,需要在JSP页面开头做处理:

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

前缀prefix可以是任意的,但是需要根据实际情况进行调整,比如开发团队的代码规范等。

JSTL的注意事项

JSTL的标签的属性名称后面的星号(*) 表示该属性是必需的。 加号(+) 表示该属性的rtexprvalue值为True, 这意味着该属性可以赋静态字符串或者动态值(Java表达式、 EL表达式或者通过< jsp:attribute >设置的值) 。 rtexprvalue值为False时, 表示该属性只能赋静态字符串的值。

JSTL标签的body content可以为empty、 JSP或者tagdependent。

Core库

1.out标签
out标签在运算表达式时, 是将结果输出到当前的JspWriter。 out的语法有两种形式, 即有body content和没有body content:

<c:out value="value" [escapeXml="{true|false}"]
    [default="defaultValue"]/>

<c:out value="value" [escapeXml="{true|false}"]>
    default value
</c:out>

escapeXml默认值为true。

out的body content为JSP。

out标签的属性如下:

  • value*+:类型是对象,代表要计算的表达式;
  • escapeXml+:类型是布尔,表示结果中的字符<、 >、 &、 ‘和 “将被转化成相应的实体码, 如<转移成lt;等等;
  • default+:类型是对象,是默认值。

默认情况下, out会将特殊字符<、 >、 ‘、 “和&分别编写成它们相应的字符实体码 & lt;、 & gt;、 & #039;、& #034;和& amp;。

例如, 下列的out标签将输出有界变量X的值:

<c:out value="${x}"/>

这里有一点额外的知识:如果包含一个或多个特殊字符的字符串没有进行XML转义, 它的值就无法在浏览器中正常显示。 此外, 没有通过转义的特殊字符, 会使网站易于遭受交叉网站的脚本攻击。 例如, 别人可以对它post一个能够自动执行的JavaScript函数/表达式。

out中的default属性可以赋一个默认值, 当赋予其value属性的EL表达式返回null时, 就会显示默认值。default属性可以赋动态值, 如果这个动态值返回null,out就会显示一个空的字符串。

例如, 在下面的out标签中, 如果在HttpSession中,没有找到myVar变量, 就会显示应用程序范围的变量myVar值。 如果没有找到, 则输出一个空的字符串:

<c:out value="${sessionScope.myVar}" default="${applicationScope.myVar"/>

2.set标签
利用set标签, 可以完成以下工作:

  1. 创建一个字符串和一个引用该字符串的有界变量。
  2. 创建一个引用现存有界对象的有界变量。
  3. 设置有界对象的属性。

如果用set创建有界变量, 那么, 在该标签出现后的整个JSP页面中都可以使用该变量。

set标签的语法有4种形式:
第一种形式用于创建一个有界变量, 并用value属性在其中定义一个要创建的字符串或者现存有界对象:

<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>

这里的scope 属性指定了有界变量的范围。page为默认值。

例如:下面的set标签创建了字符串“The wisestfool”, 并将它赋给新创建的页面范围变量foo,这里scope属性没有声明,取默认值为page:

<c:set var="foo" value="The wisest fool"/>

又如:下面的set 标签则创建了一个名为job的有界变量,它引用请求范围的对象position。 变量job 的范围为page:

<c:set var="job" value="${requestScope.position}" scope="page"/>

第二种形式与第一种形式相似, 只是要创建的字符串或者要引用的有界对象是作为body content赋值的,第二种形式允许在body content中有JSP代码。:

<c:set var="varName" [scope="{page|request|session|application}"]>
    body content
</c:set>

第三种形式是设置有界对象的属性值。 target属性定义有界对象, 以及有界对象的property属性。 对该属性的赋值是通过value属性进行的:

<c:set target="target" property="propertyName" value="value"/>

例如, 下面的set 标签是将字符串“Tokyo”赋予有界对象address的city属性:

<c:set target="${address}" property="city" value="Tokyo"/>

注意, 必须在target属性中用一个EL表达式来引用这个有界对象。

第四种形式与第三种形式相似, 只是赋值是作为body content完成的:

<c:set target="target" property="propertyName">
    body content
</c:set>

例如, 下面的set标签是将字符串“Beijing”赋予有界对象address的city属性:

<c:set target="${address}" property="city">Beijing</c:set>

set标签的属性 如下所示:

  • value+:类型为对象;要创建的字符串, 或者要引用的有界对象, 或者新的属性值
  • var:类型为字符串;要创建的有界变量
  • scope:类型为字符串;新创建的有界变量的范围
  • target+:类型为对象;其属性要被赋新值的有界对象; 这必须是一个JavaBeans实例或者java.util.Map对象
  • property+:类型为字符串;要被赋新值的属性名称

3.remove标签
remove标签用于删除有界变量, 其语法如下:

<c:remove var="varName" [scope="{page|request|session|application}"]/>

注意, 有界变量引用的对象不能删除。 因此, 如果另一个有界对象也引用了同一个对象, 仍然可以通过另一个有界变量访问该对象。

remove标签的属性 如下所示:

  • var:类型为字符串;要删除的有界变量的名称
  • scope:类型为字符串;要删除的有界变量的范围

例如:删除了页面范围的变量job:

<c:remove var="job" scope="page"/>

条件行为

条件行为用于处理页面输出取决于特定输入值的情况, 这在Java中是利用if、 if…else和switch声明解决的。

JSTL中执行条件行为的有4个标签, 即if、choose、 when和otherwise标签。

1.if标签

if标签是对某一个条件进行测试, 假如结果为True, 就处理它的body content。 测试结果保存在Boolean对象中, 并创建有界变量来引用这个Boolean对象。 利用var属性和scope属性分别定义有界变量的名称和范围。

if的语法有两种形式。

第一种形式没有body content:

<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>

第二种形式中使用了一个body content:

<c:if test="testCondition [var="varName"] [scope="{page|request|session|application}"]>
    body content
</c:if>

body content是JSP, 当测试条件的结果为True时,就会得到处理。

if标签的属性 如下所示:

  • test+:类型为布尔;决定是否处理任何现有body content的测试条件
  • var:类型为字符串;引用测试条件值的有界变量名称; var的类型为Boolean
  • scope:类型为字符串;var定义的有界变量的范围

例如, 如果找到请求参数user且值为ken, 并且找到请求参数password且值为blackcomb, 以下if标签将显示“You logged in successfully(您已经成功登录) ”:

<c:if test="${param.user=='ken' && param.password=='blackcomb'}">
    You logged in successfully.
</c:if>

为了模拟else, 下面使用了两个if标签, 并使用了相反的条件。 例如, 如果user和password参数的值为ken和blackcomb, 以下代码片断将显示“You logged insuccessfully(您已经成功登录)”, 否则, 将显示“Login failed(登录失败) ”:

<c:if test="${param.user=='ken' && param.password=='blackcomb'}">
    You logged in successfully.
</c:if>

<c:if test="${!(param.user=='ken' && param.password=='blackcomb')}">
    Login failed.
</c:if>

下面的if标签是测试user和password参数值是否分别为ken和blackcomb, 并将结果保存在页面范围的变量loggedIn中。 之后, 利用一个EL表达式, 如果loggedIn变量值为True, 则显示“You logged in successfully(您已经成功登录) ”; 如果loggedIn变量值为False, 则显示“Login failed(登录失败) ”:

<c:if var="loggedIn" test="${param.user=='ken' && param.password=='blackcomb'}"/>
...
${(loggedIn)? "You logged in successfully" : "Login failed"}

2.choose、when和otherwise标签

choose和when标签的作用与Java中的关键字switch和case类似。 也就是说, 它们是为相互排斥的条件执行提供上下文的。 choose标签中必须嵌有一个或者多个when标签, 并且每个when标签都表示一种可以计算和处理的情况。 otherwise标签则用于默认的条件块, 假如没有任何一个when标签的测试条件结果为True, 它就会得到处理。 假如是这种情况, otherwise就必须放在最后一个when后。

choose和otherwise标签没有属性。 when标签必须带有定义测试条件的test属性, 用来决定是否应该处理body content。

举个例子, 以下代码是测试参数status的值。 如果status的值为full, 将显示“You are a full member(您是正式会员) ”。 如果这个值为student, 则显示“You are a student member(您是学生会员) ”。 如果status参数不存在, 或者它的值既不是full, 也不是student, 那么这段代码将不显示任何内容:

<c:choose>
    <c:when test="${param.status=='full'}">
        You are a full member
    </c:when>
    <c:when test="${param.status=='student'}">
        You are a student member
    </c:when>
</c:choose>

下面的例子与前面的例子相似, 但它是利用otherwise标签, 如果status参数不存在, 或者它的值不是full或者student, 则将显示“Please register(请注册) ”:

<c:choose>
    <c:when test="${param.status=='full'}">
        You are a full member
    </c:when>

    <c:when test="${param.status=='student'}">
        You are a student member
    </c:when>

    <c:otherwise>
        Please register
    </c:otherwise>
</c:choose>

遍历行为

1.forEach标签
forEach标签会无数次地反复遍历body content或者对象集合。 可以被遍历的对象包括java.util.Collection和java.util.Map的所有实现, 以及对象数组或者主类型。也可以遍历java.util.Iterator和java.util.Enumeration, 但不应该在多个行为中使用Iterator或者Enumeration, 因为无法重置Iterator或者Enumeration。

forEach标签的语法有两种形式。

第一种形式是固定次数地重复body content:

<c:forEach [var="varName"] begin="begin" end="end" step="step">
    body content
</c:forEach>

第二种形式用于遍历对象集合:

<c:forEach items="collection" [var="varName"] [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
    body content
</c:forEach>

body content是JSP。 forEach标签的属性 如下所示:

  • var:类型是字符串,用于引用遍历的当前项目的有界变量名称;
  • items+:类型是支持的任意类型,遍历的对象集合;
  • varStatus:类型是字符串,保存遍历状态的有界变量名称。 类型值为javax.servlet.jsp.jstl.core.LoopTagStatus;
  • begin+ 类型是整数,如果指定items, 遍历将从指定索引处的项目开始, 例如, 集合中第一个项目的索引为0。 如果没有指定items, 遍历将从设定的索引值开始。 如果指定, begin的值必须大于或者等于0;
  • end+:类型是整数;如果指定items, 遍历将在(含) 指定索引处的项目结束。 如果没有指定items, 遍历将在索引到达指定值时结束;
  • step+:类型是整数;遍历将只处理间隔指定step的项目, 从第一个项目开始。 在这种情况下, step的值必须大于或者等1

例如, 下列的forEach标签将显示“1, 2, 3, 4,5”。

<c:forEach var="x" begin="1" end="5">
    <c:out value="${x}"/>,
</c:forEach>

又如,下面的forEach标签将遍历有界变量address的phones属性:

<c:forEach var="phone" items="${address.phones}">
    ${phone}"<br/>
</c:forEach>

对于每一次遍历, forEach标签都将创建一个有界变量, 变量名称通过var属性定义。 在本例中, 有界变量命名为phone。 forEach标签中的EL表达式用于显示phone的值。 这个有界变量只存在于开始和关闭的forEach标签之间, 一到关闭的forEach标签前, 它就会被删除。

forEach标签有一个类型为javax.servlet.jsp.jstl.core.LoopTagStatus的变量varStatus。 LoopTagStatus接口带有count属性, 它返回当前遍历的“次数”。 第一次遍历时, status.count值为1; 第二次遍历时, status.count值为2, 依次类推。 通过测试status.count%2的余数, 可以知道该标签正在处理的是偶数编号的元素, 还是奇数编号的元素。

利用forEach还可以遍历Map。 要分别利用key和value属性引用一个Map key和一个Map值。 遍历Map的伪代码如下:

<c:forEach var="mapItem" items="map">
    ${mapItem.key} : ${mapItem.value}
</c:forEach>

2.forTokens标签
forTokens标签用于遍历以特定分隔符隔开的令牌, 其语法如下:

<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"] [varStatus="varStatusName"][begin="begin"] [end="end"] [step="step"]>
    body content
</c:forTokens>

body content是JSP。forTokens标签的属性如下所示:

  • var 字符串 引用遍历的当前项目的有界变量名称
  • items+ 支持的任意类型 要遍历的token字符串
  • varStatus 字符串 保存遍历状态的有界变量名称。 类型值为javax.servlet.jsp.jstl.core.LoopTagStatus
  • begin+ 整数 遍历的起始索引, 此处索引是从0开始的。 如有指定, begin的值必须大于或者等于0
  • end+ 整数 遍历的终止索引, 此处索引是从0开始的
  • step+ 整数 遍历将只处理间隔指定step的token, 从第一个token开始。 如有指定, step的值必须大于或者等于1
  • delims+ 字符串 一组分隔符
<c:forTokens var="item" items="Argentina,Brazil,Chile" delims=",">
    <c:out value="${item}"/><br/>
</c:forTokens>

格式化行为

JSTL提供了格式化和解析数字与日期的标签, 它们是formatNumber、 formatDate、 timeZone、setTimeZone、 parseNumber和parseDate。

1.formatNumber标签

formatNumber用于格式化数字。 这个标签使你可以根据需要, 利用它的各种属性来获得自己想要的格式。formatNumber的语法有两种形式。

第一种形式没有body content

<fmt:formatNumber value="numericValue"
        [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [currencyCode="currencyCode"]
        [currencySymbol="currencySymbol"]
        [groupingUsed="{true|false}"]
        [maxIntegerDigits="maxIntegerDigits"]
        [minIntegerDigits="minIntegerDigits"]
        [maxFractionDigits="maxFractionDigits"]
        [minFractionDigits="minFractionDigits"]
        [var="varName"]
        [scope="{page|request|session|application}"]
/>

第二种形式有body content

<fmt:formatNumber [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [currencyCode="currencyCode"][currencySymbol="currencySymbol"]
        [groupingUsed="{true|false}"]
        [maxIntegerDigits="maxIntegerDigits"]
        [minIntegerDigits="minIntegerDigits"]
        [maxFractionDigits="maxFractionDigits"]
        [minFractionDigits="minFractionDigits"]
        [var="varName"]
        [scope="{page|request|session|application}"]>
    numeric value to be formatted
</fmt:formatNumber>

body content是JSP。 formatNumber标签的属性 如下所示:

  • value+ 字符串或数字 要格式化的数字化值
  • type+ 字符串 说明该值是要被格式化成数字、 货币, 还是百分比。 这个属性值有number、 currency、 percent
  • pattern+ 字符串 定制格式化样式
  • currencyCode+ 字符串 ISO 4217码,
  • CurrencySymbol+ 字符串 货币符号
  • groupingUsed+ 布尔 说明输出结果中是否包含组分隔符
  • maxIntegerDigits+ 整数 规定输出结果的整数部分最多几位数字minIntegerDigits+ 整数 规定输出结果的整数部分最少几数字
  • maxFractionDigits+ 整数 规定输出结果的小数部分最多几位数字
  • minFractionDigits+ 整数 规定输出结果的小数部分最少几位数字
  • var 字符串 将输出结果存为字符串的有界变量名称
  • scope 字符串 var的范围。 如果有scope属性, 则必须指定var属性

2.formatDate标签
formatDate标签用于格式化日期, 其语法如下:

<fmt:formatDate value="date"
        [type="{time|date|both}"]
        [dateStyle="{default|short|medium|long|full}"]
        [timeStyle="{default|short|medium|long|full}"]
        [pattern="customPattern"]
        [timeZone="timeZone"]
        [var="varName"]
        [scope="{page|request|session|application}"]
/>

body content为JSP。 formatDate标签的属性 如下所示:

  • value+ java.util.Date 要格式化的日期和/或时间
  • type+ 字符串 说明要格式化的是时间、 日期, 还是时间与日期元件
  • dataStyle+ 字符串 预定义日期的格式化样式, 遵循java.text.DateFormat中定义的语义
  • timeStyle+ 字符串 预定义时间的格式化样式, 遵循java.text.DateFormat中定义的语义pattern+ 字符串 定制格式化样式
  • timezone+ 字符串或java.util.TimeZone 定义用于显示时间的时区
  • var 字符串 将输出结果存为字符串的有界变量名称
  • scope 字符串 var的范围

下列代码利用formatDate标签格式化有界变量now。引用的java.util.Date对象:

Default: <fmt:formatDate value="${now}"/>
Short: <fmt:formatDate value="${now}" dateStyle="short"/>
Medium: <fmt:formatDate value="${now}" dateStyle="medium"/>
Long: <fmt:formatDate value="${now}" dateStyle="long"/>
Full: <fmt:formatDate value="${now}" dateStyle="full"/>

下面的formatDate标签用于格式化时间:

Default: <fmt:formatDate type="time" value="${now}"/>
Short: <fmt:formatDate type="time" value="${now}" timeStyle="short"/>
Medium: <fmt:formatDate type="time" value="${now}" timeStyle="medium"/>
Long: <fmt:formatDate type="time" value="${now}" timeStyle="long"/>
Full: <fmt:formatDate type="time" value="${now}" timeStyle="full"/>

下面的formatDate标签用于格式化日期和时间:

Default: <fmt:formatDate type="both" value="${now}"/>
Short date short time: <fmt:formatDate type="both"value="${now}" dateStyle="short" timeStyle="short"/>
Long date long time format: <fmt:formatDate type="both" value="${now}" dateStyle="long" timeStyle="long"/>

下面的formatDate标签用于格式化带时区的时间:

Time zone CT: <fmt:formatDate type="time" value="${now}" timeZone="CT"/><br/>
Time zone HST: <fmt:formatDate type="time" value="${now}" timeZone="HST"/><br/>

下面的formatDate标签利用定制模式格式化日期和时间:

<fmt:formatDate type="both" value="${now}" pattern="dd.MM.yy"/>
<fmt:formatDate type="both" value="${now}" pattern="dd.MM.yyyy"/>

3.timeZone标签
timeZone标签用于定义时区, 使其body content中的时间信息按指定时区进行格式化或者解析。 其语法如下:

<fmt:timeZone value="timeZone">
    body content
</fmt:timeZone>

body content是JSP。 属性值可以是类型为String或者java.util.TimeZone的动态值。如果value属性为null或者empty, 则使用GMT时区。

4.setTimeZone标签
setTimeZone标签用于将指定时区保存在一个有界变量或者时间配置变量中。 setTimeZone的语法如下:

<fmt:setTimeZone value="timeZone" [var="varName"] [scope="{page|request|session|application}"]/>

5.parseNumber标签
parseNumber标签用于将以字符串表示的数字、 货币或者百分比解析成数字, 其语法有两种形式。

第一种形式没有body content

<fmt:parseNumber value="numericValue"
        [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [parseLocale="parseLocale"]
        [integerOnly="{true|false}"]
        [var="varName"]
        [scope="{page|request|session|application}"]
/>

第二种形式有 body content,body content是JSP:

<fmt:parseNumber [type="{number|currency|percent}"]
        [pattern="customPattern"]
        [parseLocale="parseLocale"]
        [integerOnly="{true|false}"]
        [var="varName"]
        [scope="{page|request|session|application}"]>
    numeric value to be parsed
</fmt:parseNumber>

例如:下面的parseNumber标签用于解析有界变量quantity引用的值, 并将结果保存在有界变量formattedNumber中:

<fmt:parseNumber var="formattedNumber" type="number" value="${quantity}"/>

6.parseDate标签
parseDate标签以区分地域的格式解析以字符串表示的日期和时间, 其语法有两种形式。

第一种形式没有body content:

<fmt:parseDate value="dateString"
        [type="{time|date|both}"]
        [dateStyle="{default|short|medium|long|full}"]
        [timeStyle="{default|short|medium|long|full}"]
        [pattern="customPattern"]
        [timeZone="timeZone"]
        [parseLocale="parseLocale"]
        [var="varName"]
        [scope="{page|request|session|application}"]
/>

第二种形式有body content,body content是JSP:

<fmt:parseDate [type="{time|date|both}"]
        [dateStyle="{default|short|medium|long|full}"]
        [timeStyle="{default|short|medium|long|full}"]
        [pattern="customPattern"]
        [timeZone="timeZone"]
        [parseLocale="parseLocale"]
        [var="varName"]
        [scope="{page|request|session|application}"]>
    date value to be parsed
</fmt:parseDate>

函数

除了定制行为外, JSTL 1.1和JSTL 1.2还定义了一套可以在EL表达式中使用的标准函数。 这些函数都集中放在function标签库中。 为了使用这些函数, 必须在JSP的最前面使用以下taglib指令:

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

调用函数时, 要以下列格式使用一个EL:

${fn:functionName}

1.contains函数
contains函数用于测试一个字符串中是否包含指定的子字符串。 如果字符串中包含该子字符串, 则返回值为True, 否则, 返回False。 其语法如下:

contains(string, substring)

例如, 下面这两个EL表达式都将返回True:

<c:set var="myString" value="Hello World"/>
${fn:contains(myString, "Hello")}
${fn:contains("Stella Cadente", "Cadente")}

2.containsIgnoreCase函数
containsIgnoreCase函数与contains函数相似, 但测试是区分大小写的, 其语法如下:

containsIgnoreCase(string, substring)

例如, 下列的EL表达式将返回True:

${fn:containsIgnoreCase("Stella Cadente", "CADENTE")}

3.endsWith函数
endsWith函数用于测试一个字符串是否以指定的后缀结尾, 其返回值是一个Boolean, 语法如下:

endsWith(string, suffix)

例如, 下列的EL表达式将返回True。

${fn:endsWith("Hello World", "World")}

4.escapeXml函数
escapeXml函数用于给String编码。 这种转换与out标签将其escapeXml属性设为True一样。 escapeXml的语法如下:

escapeXml(string)

例如, 下列的EL表达式将返回True。

${fn:escapeXml("Use <br/> to change lines")}

将被渲染成:

Use &lt;br/&gt; to change lines

5.indexOf函数
indexOf函数返回指定子字符串在某个字符串中第一次出现时的索引。 如果没有找到指定的子字符串, 则返回−1。 其语法如下:

indexOf(string, substring)

例如, 下列的EL表达式将返回7:

${fn:indexOf("Stella Cadente", "Cadente")}

6.join函数
join函数将一个String数组中的所有元素都合并成一个字符串, 并用指定的分隔符分开, 其语法如下:

join(array, separator)

如果这个数组为null, 就会返回一个空字符串。例如, 如果myArray是一个String数组, 它带有两个元素“my”和“world”, 那么, 下列EL表达式:

${fn:join(myArray,",")}

将返回“my, world”。

7.length函数

length函数用于返回集合中的项目数, 或者字符串中的字符数, 其语法如下:

length{input}

下列的EL表达式将返回14:

${fn:length("Stella Cadente", "Cadente")}

8.replace函数

replace函数将字符串中出现的所有beforeString用afterString替换, 并返回结果, 其语法如下:

replace(string, beforeSubstring, afterSubstring)

例如, 下列的EL表达式将返回“StElla CadEntE”:

${fn:replace("Stella Cadente", "e", "E")}

9.split函数
split函数用于将一个字符串分离成一个子字符串数组。 它的作用与join相反。 例如, 下列代码是分离字符串“my, world”, 并将结果保存在有界变量split中。 随后, 利用forEach标签将split格式化成一个HTML表:

<c:set var="split" value='${fn:split("my,world",",")}'/>
<table>
    <c:forEach var="substring" items="${split}">
        <tr><td>${substring}</td></tr>
    </c:forEach>
</table

结果为:

<table>
    <tr><td>my</td></tr>
    <tr><td>world</td></tr>
</table>

10.startsWith函数

startsWith函数用于测试一个字符串是否以指定的前缀开头, 其语法如下:

startsWith(string, prefix)

例如, 下列的EL表达式将返回True:

${fn:startsWith("Stella Cadente", "St")}

11.substring函数
substring函数用于返回一个从指定基于0的起始索引(含) 到指定基于0的终止索引的子字符串, 其语法如下:

substring(string, beginIndex, endIndex)

下列的EL表达式将返回“Stel”:

${fn:substring("Stella Cadente", 0, 4)}

12.substringAfter函数
substringAfter函数用于返回指定子字符串第一次出现后的字符串部分, 其语法如下:

substringAfter(string, substring)

例如, 下列的EL表达式将返回“lla Cadente”:

${fn:substringAfter("Stella Cadente", "e")}

13.substringBefore函数
substringBefore函数用于返回指定子字符串第一次出现前的字符串部分, 其语法如下:

substringBefore(string, substring)

例如, 下列的EL表达式将返回“St”:

${fn:substringBefore("Stella Cadente", "e")}

14.toLowerCase函数
toLowerCase函数将一个字符串转换成它的小写版本, 其语法如下:

toLowerCase(string)

例如, 下列的EL表达式将返回“stella cadente”:

${fn:toLowerCase("Stella Cadente")}

15.toUpperCase函数
toUpperCase函数将一个字符串转换成它的大写版本, 其语法如下:

toUpperCase(string)

例如, 下列的EL表达式将返回“STELLA CADENTE”:

${fn:toUpperCase("Stella Cadente")}

16.trim函数
trim函数用于删除一个字符串开头和结尾的空白,其语法如下:

trim(string)

例如, 下列的EL表达式将返回“Stella Cadente”:

${fn:trim(" Stella Cadente ")}

写在后面

JSTL可以完成一般的任务(如遍历、 集合和条件) 、 处理XML文档、 格式化文本、 访问数据库以及操作数据, 等等。这篇博客介绍了比较重要的一些标签, 如操作有界对象的标签(out、 set、 remove) 、 执行条件测试的标签(if、choose、 when、 otherwise) 、 遍历集合或token的标签(forEach、 forTokens) 、 解析和格式化日期与数字的标签(parseNumber、 formatNumber、parseDate、 formatDate等) , 以及可以在EL表达式中使用的JSTL 1.2函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值