写在前面
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标签, 可以完成以下工作:
- 创建一个字符串和一个引用该字符串的有界变量。
- 创建一个引用现存有界对象的有界变量。
- 设置有界对象的属性。
如果用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 <br/> 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函数。