JSTL(JSP Standard Tag Library)下载地址:https://jstl.java.net/。
JSTL包含:
1.JSTL API
2.JSTL Implementation
JSP页面中使用JSTL,使用taglib指令引入:
1 | <%@ taglib rui="uri" prefix="prefix"%> |
通用动作指令
引入:
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
out标签
标记<c:out>具有以下属性:
| 属性 | 描述 |
| value*+ | 要运算的表达式 |
| default | 默认值 |
| escapeXml | True,如果标签转义特殊XML字符 |
*表示属性是必需的,+号表示可以为表达式。
默认情况下,excapeXml属性为true,意味着会将<,>,’,”和&转换为<,>,'和&。
set标签
<c:set>标记具有以下属性:
| 属性 | 描述 |
|---|---|
| value+ | 要创建的字符串,或要引用的限域对象,或新的属性值 |
| target+ | 其属性应该被修改的限域对象目标 |
| property+ | 要修改的属性名称 |
| var | 限域变量 |
| scope | 范围,默认为page |
如,创建一个page范围的foo变量,并赋值:
1 | <c:set var="foo" value="The wisest fool"/> |
创建一个限域变量job,值为request范围的对象position,限域变量的范围为page:
1 | <c:set var="job" value="${requestScope.position}" socpe="page"/> |
设置address对象的city属性为fuzhou:
1 | <c:set target="${address}" property="city" value="fuzhzou"/> |
也可以这样写:
1 | <c:set target="${address}" property="city"> |
remove标签
<c:remove>标签具有以下属性:
| 属性 | 描述 | 默认值 |
|---|---|---|
| var | 要删除的变量名 | None |
| scope | 删除变量的作用域 | 所有作用域 |
如删除作用域为page的job限域变量:
1 | <c:remove var="job" scope="page"/> |
条件式动作指令
引入:
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
if标签
<c:if>标签具有以下属性:
| 属性 | 描述 | 默认 |
|---|---|---|
| test*+ | 条件计算 | None |
| var | 变量名称来存储条件的结果,Boolean类型 | None |
| scope | var变量的作用域 | page |
如:
1 | <c:set var="salary" scope="session" value="${2000*2}"/> |
模拟if…else:
1 | <c:if test="${param.user=='mrbird' && password=='mrbird'}"> |
choose,when和otherwise
该标签类似于Java中的switch和case关键字类似,使用方法如下:
1 | <c:choose> |
iterator动作指令
forEach标签
<c:forEach>标记具有以下属性:
| 属性 | 描述 | 默认 |
|---|---|---|
| items+ | 要迭代的对象集合 | None |
| begin+ | 开始索引 | 0 |
| end+ | 结束索引 | Last element |
| step+ | 迭代步长 | 1 |
| var | 当前迭代内容的限域变量名 | None |
| varStatus | 保存迭代状态的限域变量名 | None |
其中,varStatus包含一些属性:
1.current当前这次迭代的(集合中的)项
2.index当前这次迭代从 0 开始的迭代索引
3.count当前这次迭代从 1 开始的迭代计数
4.first用来表明当前这轮迭代是否为第一次迭代的标志
5.last用来表明当前这轮迭代是否为最后一次迭代的标志
如循环输出books集合,并控制单双行表格样式:
1 | <table> |
简单的forEach标签示例:
1 | <c:forEach var="x" begin="1" end="5"> |
页面输出1,2,3,4,5。
forTokens标签
forTokens标签使用的比较少,常用的例子:
1 | <c:forTokens items="Zara,nuha,roshy" delims="," var="name"> |
这将产生以下输出结果:
1 | Zara |
格式化动作指令
引入:
1 | <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> |
formatNumber标签
<fmt:formatNumber>标签用于格式化数字,百分比和货币。<fmt:formatNumber>标签有如下属性:
| 属性 | 描述 | 默认值 |
|---|---|---|
| value*+ | 要显示的数字 | 无 |
| type+ | NUMBER,CURRENCY,或 PERCENT类型 | Number |
| pattern+ | 指定一个自定义的格式化模式用于输出 | 无 |
| currencyCode+ | 货币码(当type=”currency”时) | 取决于默认区域 |
| currencySymbol+ | 货币符号 (当 type=”currency”时) | 取决于默认区域 |
| groupingUsed+ | 是否对数字分组 (TRUE 或 FALSE) | true |
| maxIntegerDigits+ | 整型数最大的位数 | 无 |
| minIntegerDigits+ | 整型数最小的位数 | 无 |
| maxFractionDigits+ | 小数点后最大的位数 | 无 |
| minFractionDigits+ | 小数点后最小的位数 | 无 |
| var | 存储格式化数字的变量 | Print to page |
| scope | var属性的作用域 | page |
pattern属性包含的字符:
| 符号 | 描述 |
|---|---|
| 0 | 代表一位数字 |
| E | 使用指数格式 |
| # | 代表一位数字,若没有则显示0 |
| . | 小数点 |
| , | 数字分组分隔符 |
| ; | 分隔格式 |
| - | 使用默认负数前缀 |
| % | 百分数 |
| ? | 千分数 |
| ¤ | 货币符号,使用实际的货币符号代替 |
| X | 指定可以作为前缀或后缀的字符 |
| ‘ | 在前缀或后缀中引用特殊字符 |
例子:
1 | <c:set var="balance" value="120000.2309" /> |
结果:
1 | 数字格式化: |
formatDate标签
<fmt:formatDate>标签用于使用不同的方式格式化日期。
<fmt:formatDate>标签有如下属性:
| 属性 | 描述 | 是否必要 | 默认值 |
|---|---|---|---|
| value | 要显示的日期 | 是 | 无 |
| type | DATE, TIME, 或 BOTH | 否 | date |
| dateStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
| timeStyle | FULL, LONG, MEDIUM, SHORT, 或 DEFAULT | 否 | default |
| pattern | 自定义格式模式 | 否 | 无 |
| timeZone | 显示日期的时区 | 否 | 默认时区 |
| var | 存储格式化日期的变量名 | 否 | 显示在页面 |
| scope | 存储格式化日志变量的范围 | 否 | 页面 |
<fmt:formatDate> 标签格式模式:
| 代码 | 描述 | 实例 |
|---|---|---|
| G | 时代标志 | AD |
| y | 不包含纪元的年份。如果不包含纪元的年份小于 10, 则显示不具有前导零的年份。 | 2002 |
| M | 月份数字。一位数的月份没有前导零。 | April & 04 |
| d | 月中的某一天。一位数的日期没有前导零。 | 20 |
| h | 12 小时制的小时。一位数的小时数没有前导零。 | 12 |
| H | 24 小时制的小时。一位数的小时数没有前导零。 | 0 |
| m | 分钟。一位数的分钟数没有前导零。 | 45 |
| s | 秒。一位数的秒数没有前导零。 | 52 |
| S | 毫秒 | 970 |
| E | 周几 | Tuesday |
| D | 一年中的第几天 | 180 |
| F | 一个月中的第几个周几 | 2 (一个月中的第二个星期三) |
| w | 一年中的第几周r | 27 |
| W | 一个月中的第几周 | 2 |
| a | a.m./p.m. 指示符 | PM |
| k | 小时(12 小时制的小时) | 24 |
| K | 小时(24 小时制的小时) | 0 |
| z | 时区 | 中部标准时间 |
| ‘ | 转义文本 | |
| ‘’ | 单引号 |
例子:
1 | <c:set var="now" value="<%=new java.util.Date()%>" /> |
结果:
1 | 日期格式化: |
剩下的fmt标签较少使用,懒得记录。
函数
引入:
1 | <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
contains函数
fn:contains()函数的语法如下:
1 | <c:if test="${fn:contains(<原始字符串>, <要查找的子字符串>)}"> |
如,下面的EL表达式都返回true:
1 | <c:set var="myString" value="Hello World"/> |
containsIgnoreCase函数
和contains类似,不区分大小写。
endsWith函数
判断以什么为结尾。
startsWith函数
escapeXml函数
如:
1 | ${fn:escapeXml("Use <br> to change lines")} |
显示为:
1 | Use <br> to change lines |
indexOf函数
fn:indexOf()函数返回一个字符串中指定子串的位置。
fn:indexOf()函数的语法如下:
1 | ${fn:indexOf(<原始字符串>,<子字符串>)} |
例子:
1 | <c:set var="string1" value="This is first String."/> |
结果:
1 | Index: 8 |
join函数
fn:join()函数将一个数组中的所有元素使用指定的分隔符来连接成一个字符串。
split函数
fn:split()函数将一个字符串用指定的分隔符分裂为一个子串数组。
join和split例子:
1 | <c:set var="string1" value="www runoob com"/> |
结果为:
1 | 字符串为 : www-runoob-com |
length函数
replace函数
fn:replace()函数将字符串中所有指定的子串用另外的字符串替换。
fn:replace()函数的语法如下:
1 | ${fn:replace(<原始字符串>, <被替换的字符串>, <要替换的字符串>)} |
例子:
1 | <c:set var="string1" value="I am from USA"/> |
结果:
1 | 替换后的字符串 : I am from China |
substring函数
fn:substring()函数返回字符串中指定开始和结束索引的子串。
fn:substring()函数的语法如下:
1 | ${fn:substring(<string>, <beginIndex>, <endIndex>)} |
例子:
1 | <c:set var="string1" value="This is first String."/> |
结果:
1 | 生成的子字符串为 : is first S |
substringBefore函数
fn:substringBefore()函数返回一个字符串中指定子串前面的部分。
如:
1 | <c:set var="string1" value="This is first String."/> |
结果:
1 | 生成的子字符串 : This is |
substringAfter函数
toLowerCase函数
toUpperCase函数
trim函数
sql标签
略。

