Servlet系列学习笔记9 --- JSTL标准标签库
目录
JSTL(JSP Standard Tag Library)是JSP标准标签库,能够解决Web应用程序中常见功能的定制标记库集,例如迭代一个映射或集合、条件判断、XML 操作、数据库访问以及数据操作等等。
本篇笔记主要记载JSTL中最重要的标签,例如访问域对象、迭代集合以及格式化数字和日期。
一、JSTL库的安装和引用
(1) 使用JSTL需要下载Apache标准库中的二进包,官方下载地址如下:
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
(2) 下载压缩包并解压,将jakarta-taglibs-standard-1.1.2/lib/下的两个 jar文件:standard.jar和jstl.jar文件拷贝到/WEB-INF/lib/下。
(3) 在需要使用 EL 语音的页面加上<%@ page isELIgnored="false" %>。表示是否禁用EL语言,true表示禁止,false表示不禁止。JSP2.0中默认的启用EL语言。
(4) Web.xml配置JSTL标签如下:
但需要注意的是,如果没有在web.xml中配置JSTL标签库的话,在没有联网的情况下无法使用JSTL。此时,就需要通过web.xml配置文件手动加载startand.jar中的c.tld、fmt.tld、fn.tld等。
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.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/functions</taglib-uri>
<taglib-location>/WEB-INF/fn.tld</taglib-location>
</taglib>
</jsp-config>
指定文件使用JSTL标签库,必须在每个JSP文件的头部包含<taglib>标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
二、JSTL类库
JSTL是JSP标准标签类库,通过多个标签类库来显露器动作指令,JSTL 1.2中标签可以被归纳5大类。
类别 |
下属功能 |
URL |
前缀 |
Core |
变量支持 |
http://java.sun.com/jsp/jstl/core |
c |
流向控制 |
|||
URL管理 |
|||
杂项 |
|||
XML |
Core |
http://java.sun.com/jsp/jstl/xml |
x |
流向控制 |
|||
转换 |
|||
I18n |
语言环境 |
http://java.sun.com/jsp/jstl/fmt |
fmt |
消息格式化 |
|||
数字/日期格式化 |
|||
数据库 |
SQL |
http://java.sun.com/jsp/jstl/sql |
sql |
功能 |
集合长度 |
http://java.sun.com/jsp/jstl/functions |
fn |
字符串操作 |
三、核心标签库
核心标签是最常用的JSTL标签,引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用指令如下表格所示:
标签 |
描述 |
用于在JSP中输出数据,就像<%= ... > |
|
用于保存数据 |
|
用于删除数据 |
|
条件判断语句 |
|
基础迭代标签,接受多种集合类型 |
|
用来给包含或重定向的页面传递参数 |
|
用来处理产生错误的异常情况,并且将错误信息存储起来 |
3.1 输出指令out标签
<c:out>标签可以对表达式进行运算,并将结果输出到页面中。out语法有两种形式,有主体内容和没有主体内容。
<c:out value="<string>" escapeXml="<true|false>" default="<string>" />
<c:out value="<string>">
default value
</c:out>
* 标签属性如下
标签 |
类型 |
描述 |
必选 |
默认值 |
value |
Object |
要输出的内容 |
是 |
无 |
escapeXML |
boolean |
输出的默认值 |
否 |
主体中的内容 |
default |
Object |
是否忽略XML特殊字符 |
否 |
true |
* 案例代码如下:
<%
String person = "张三";
request.setAttribute("person",person);
%>
<c:out value="${person}"/>
<c:out value="${null}">
默认值的作用就是如果输出的值为NULL,就默认输出默认值。
</c:out>
3.2 判断指令if标签
<c:if>标签用来判断表达式的值,如果值为true,则执行其主体内容。语法格式如下所示:
<c:if test="<boolean>" var="<string>" scope="<string>">
//执行内容
</c:if>
* 标签属性如下
属性 |
描述 |
必选 |
默认值 |
test |
条件 |
是 |
无 |
var |
用于存储条件结果的变量 |
否 |
无 |
scope |
var属性的作用域 |
否 |
page |
* 案例代码如下
<c:set var="num" scope="request" value="100"/>
<c:if test="${requestScope.num < 100}">
<p>num的值小于100<p>
</c:if>
<c:if test="${requestScope.num >= 100}" var="result" scope="request">
<p>num的值大于或等于100<p>
<p>${result}<p>
</c:if>
3.3 迭代指令forEach标签
<c:forEach>标签能够迭代一个集合中的所有对象。<c:forTokens>标签和<c:forEach>标签不同的是,<c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。也就是说前者针对集合,后者针对字符串。
接下来主要针对<c:forEach>标签进行介绍。它的语法格式如下:
<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>">
//迭代结果......
</c:forEach>
* 标签属性如下
属性 |
描述 |
是否必要 |
默认值 |
items |
要被循环的信息 |
否 |
无 |
var |
代表当前条目的变量名称 |
否 |
无 |
begin |
开始的元素索引 |
否 |
0 |
end |
最后一个元素的索引 |
否 |
Last |
step |
每一次迭代的步长 |
否 |
1 |
varStatus |
代表循环状态的变量名称 |
否 |
无 |
* 案例代码如下
<c:set var="persons" value='"张三","李四","王五","周六","吴七"'/>
<div>1、迭代所有的元素</div>
<c:forEach items="${persons}" var="pers">
<p>姓名:${pers}</p>
</c:forEach>
<div>2、迭代指定范围内的元素</div>
<c:forEach items="${persons}" var="pers" begin="1" end="3">
<p>姓名:${pers}</p>
</c:forEach>
<div>3、获取相隔的元素(迭代步长)</div>
<c:forEach items="${persons}" var="pers" begin="0" end="4" step="2">
<p>姓名:${pers}</p>
</c:forEach>
* 结果如下所示
上述第三个实例表示的是,对作用域名字为persons的字符数组对象,将索引为0到索引为4的元素,从起点开始每隔2个元素进行遍历。
需要了解的是varStatus表示的是当前迭代的状态,它具有以下属性。
- current: 当前这次迭代的(集合中的)项
- index: 当前这次迭代从 0 开始的迭代索引
- count: 当前这次迭代从 1 开始的迭代计数
- first: 用来表明当前这轮迭代是否为第一次迭代的标志
- last: 用来表明当前这轮迭代是否为最后一次迭代的标志
- begin: 属性值
- end: 属性值
- step: 属性值
这些相关状态的属性,可以由EL表达式来应用,例如下面例子所示
<c:forEach items="${persons}" var="pers" begin="1" end="3" step="1" varStatus="status">
<p>当前索引:${status.index}</p>
<p>当前序号:${status.count}</p> //当前迭代元素中的序号,而不是数组中
<p>是否是第一项:${status.first}</p>
<p>是否是第二项:${status.last}</p>
<p>迭代起始索引:${status.begin}</p> //对应begin属性
<p>迭代终止索引:${status.end}</p> //对应end属性
<p>跳跃步伐:${status.step}</p> //对应step属性
</c:forEach>
最终结果如下图所示
3.4 choose、when和otherwise标签
choose和when标签的作用与Java中的switch和case关键字相似,也就是说它们为互相排斥的条件式执行提供相关内容。如果所有when标签的判断结果都不为true,就会执行otherwise标签内的代码块。具体代码如下所示
<c:set var="num" value="5"/>
<c:choose>
<c:when test="${num <= 2}">
<p>num=${num}</p>
</c:when>
<c:when test="${num <= 4}">
<p>num=${num}</p>
</c:when>
<c:otherwise>
<p>num=${num}</p>
</c:otherwise>
</c:choose>
四、格式化标签
格式化标签能够用来格式化文本、日期、时间、数字,并且输出格式化的结果,使用格式化标签,需要引用fmt标签库,具体语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
这一部分,只介绍对日期格式化<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 |
时代标志 |
y |
不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。 |
M |
月份数字。一位数的月份没有前导零。 |
d |
月中的某一天。一位数的日期没有前导零。 |
h |
12 小时制的小时。一位数的小时数没有前导零。 |
H |
24 小时制的小时。一位数的小时数没有前导零。 |
m |
分钟。一位数的分钟数没有前导零。 |
s |
秒。一位数的秒数没有前导零。 |
S |
毫秒 |
E |
周几 |
D |
一年中的第几天 |
F |
一个月中的第几个周几 |
w |
一年中的第几周r |
W |
一个月中的第几周 |
a |
a.m./p.m. 指示符 |
k |
小时(12 小时制的小时) |
K |
小时(24 小时制的小时) |
z |
时区 |
案例代码如下所示:
<c:set var="now" value="<%=new java.util.Date()%>" />
案例1:<fmt:formatDate type="time" value="${now}"/>
案例2:<fmt:formatDate type="date" value="${now}"/>
案例3:<fmt:formatDate type="both" value="${now}"/>
案例4:<fmt:formatDate type="both" dateStyle="short" timeStyle="short" value="${now}" />
案例5:<fmt:formatDate type="both" dateStyle="medium" timeStyle="medium" value="${now}" />
案例6: <fmt:formatDate type="both" dateStyle="long" timeStyle="long" value="${now}" />
案例7: <fmt:formatDate pattern="yyyy-MM-dd" value="${now}" />
最终结果