JSTL (JSP 标准标签库)
一、简介
Java Server Pages Standard Tag Libray(JSTL)
1.定义:
是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。
我们现在只讨论 JSTL 中最重要的标签,迭代集合以及格式化数字和日期几
个标签。
2.核心标签库:
http://java.sun.com/jsp/jstl/core c:
包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
3.格式化标签库:
http://java.sun.com/jsp/jstl/fmt fmt:
用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
4.JSTL的使用 ★
1).将jstl相关的jar包拷贝到项目的lib目录下
jstl.jar和standard.jar
2).在页面引入想要使用的库
<%@taglib uri="要使用的库的路径" prefix="前缀名" %>
3).使用标签
<前缀名:标签名 属性名="属性值"></前缀名:标签名>
4).标签一般通过el表达式操作域对象
EX:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
为了在 JSP 页面使用 JSTL 类库,必须以下列格式使用 taglib 指令:
<%@taglib uri="" prefix=""%>
例如:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相
似;所以,建议使用事先设计好的前缀。此时需要导入两个 jar 包
直接放入 Tomcat 的 lib 目录下即可。
一般通用的前缀 使用 core ==> c fmt ==> fmt
二、标签的使用
1. 条件动作标签
条件动作指令用于处理页面的输出结果依赖于某些输入值的情况,在 Java中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签可以执行条件式动作指令:if、 choose、when 和 otherwise。
1). if 标签 ★★
if 标签先对某个条件进行测试,如果该条件运算结果为 true, 则处理它的主体内容,测试结果保存在一个 Boolean 对象中,并创建一个限域变量来引用
Boolean 对象。可以利用 var 属性设置限域变量名,利用 scope 属性来指定其作用范围。if 的语法有两种形式:没有主体内容、有主体内容
1.没有主体内容
<c:if test="" var="" scope=""></c:if>
test="判断条件,返回true或false"
var="限域变量名,用户接收判断条件的返回值"
scope="限域变量名的域范围 page|request|session|application
未指定则 由小到大 查找
该情况下:var 指定的限域变量由同一个 JSP 页面中后面的标签测试所决定。
示例:
<%
request.setAttribute("age", 26);
%>
<c:if test="${age==26}" var="flag" scope="request">
</c:if>
2.有主体内容
<c:if test="" var="" scope="">
// 主体内容(当满足条件时,执行的代码)
</c:if>
示例:
<%
request.setAttribute("age", 26);
%>
<c:if test="${age >1 }">
<h2>Hello</h2>
</c:if>
主体内容为 JSP,若测试条件为 true,则处理 JSP。
JSTL 中没有 else 标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
3.示例代码:
//注意 操作域对象或常量
<%
request.setAttribute("num", 10);
%>
//完整格式 一般不用
<c:if test="${num > 1 }" var="flag" scope="request">
<h2>Hello JSTL</h2>
</c:if>
获取限域变量中的值:${requestScope.flag }
<hr>
//一些奇怪的代码 因为有自动转型 不用研究
<c:if test="${1==1 }" var="flag1"></c:if> ${flag1 } <br>
<c:if test="${1=='1' }" var="flag2"></c:if> ${flag2 } <br> //这行不注释可能报错
<c:if test="${'1'=='1' }" var="flag3"></c:if> ${flag3 } <br>
<c:if test="${'1==1' }" var="flag4"></c:if> ${flag4 } <br>
<c:if test="1==1" var="flag5"></c:if> ${flag5 } <br>
<c:if test="${num == 10 }" var="flag6"></c:if> ${flag6 } <br>
<c:if test="true" var="flag7"></c:if> ${flag7 } <br>
<hr>
//一般都会用这种简便用法
<c:if test="${num >1 }">
<h2>Hello</h2>
</c:if>
<c:if test="${num <=1 }">
<h2>Hi</h2>
</c:if>
结果:
2) choose、when 和 otherwise 标签 ★
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。也就是说:他们为相互排斥的条件式执行提供相关内容。
类似对应 choose ==> switch
when test ==> case
default ==> otherwise
语法:
<c:choose>
<c:when test="返回boolean类型的判断条件">
// 满足条件执行的代码
</c:when>
...(可添加多个when标签)
<c:otherwise>
// 当所有的when不执行时执行的代码
</c:otherwise>
</c:choose>
注意:
1、choose标签与otherwise标签没有属性,
when标签必须设置test属性
2、choose标签中只能包含when标签与otherwise标签,
when标签与otherwise标签可以包含其它标签
插入if标签异常示例:
Illegal "c:if" after "c:otherwise" tag in "c:choose" tag.
3、choose标签中至少包含一个when标签,最多只有一个otherwise标签
没有when标签异常示例:
Illegal "choose" without child "when" tag
4、所有的when标签必须设置在otherwise标签之前
when标签设置在otherwise之后异常示例:
Illegal "c:when" after "c:otherwise" tag in "c:choose" tag.
5、所有的when标签不执行的情况下才会执行otherwise标签
EX:
<%
request.setAttribute("score", 10);
%>
<c:choose>
<c:when test="${score>=60}">
<h2>可以</h2>
</c:when>
<c:when test="${score>30&&score<60}">
<h2>垃圾</h2>
</c:when>
<c:otherwise>
<h2>DIE</h2>
</c:otherwise>
</c:choose>
2. forEach迭代标签 ★★★
循环遍历
1).语法:
<c:forEach begin="1" end="9" var="i" step="1">
</c:forEach>
begin="开始循环的数"
end="结束循环的饿数"
var="当前成员的限域变量名"
step="循环的间隔数"
items="被迭代的容器对象"
varStatus="用来存放当前成员信息"(不常用)
2).可迭代内容:
1.主体内容
2.Collection实现
3.Map实现
4.Iterator
5.Enumeration
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的
对象包括所有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可以迭代java.util.Iterator 和 java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者Enumeration 都不能重置(reset)。 各属性含义如下:
varStatus 属性的使用:
3).forEach语法两种形式:
1.将 主语内容 重复一定的次数:
<c:forEach var="sleep" begin="1" end="9" step="1">
${sleep} <br>
</c:forEach>
结果: 1~9 并换行
2.用于迭代一个对象容器:
1).List == ArrayList
<%
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="item">
${item}
</c:forEach>
结果:zhangsan lisi wangwu
**************************************************************
2).测试:varStatus并打印到表格中:
<%
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add("A:" + i);
}
pageContext.setAttribute("li", list);
%>
<table>
<tr>
<td>List内容</td>
<td>当前下标</td>
<td>成员总数</td>
<td>是/否first成员</td>
<td>是/否为last成员</td>
</tr>
<c:forEach items="${li}" var="item" begin="0" end="9" varStatus="idx">
<tr>
<td><b>${item}</b></td>
<td>${idx.index}</td>
<td>${idx.count }</td>
<td>${idx.first }</td>
<td>${idx.last}<br /></td>
</tr>
</c:forEach>
</table>
结果打印:
**************************************************************
3).Map 遍历:
内容主体为 JSP,对于每一次迭代,forEach 标签都会创建一个限域变量,
其名称通过 var 属性设置。利用 forEach 迭代一个 Map,分别利用 key 和
value 属性引用一个 Map 键和一个 Map 值。
<%
Map<String,Object> map = new HashMap<>();
map.put("name", "zhangsan");
map.put("age", 18);
map.put("sex", "男");
request.setAttribute("map", map);
%>
<c:forEach items="${map}" var="item">
${item.key} --- ${item.value} <br>
</c:forEach>
结果:
sex --- 男
name --- zhangsan
age --- 18
**************************************************************
3. 格式化动作指令 <fmt:...> ☆
JSTL 提供了格式化和解析数字和日期的标签,我们讨论里面有:
formatNumber、formatDate、parseNumber 及 parseDate。
1) formatNumber 标签
用指定的格式或精度来格式化数字 (数值 ==> 字符串)
1.没有主体内容
<fmt:formatNumber type="" var="" value="" />
2.有主体内容
<fmt:formatNumber type="" var="" >
主体内容
</fmt:formatNumber>
3.常用属性
type:要格式化成的类型
number数值型,默认值
percent百分比类型
currency货币型
var:限域变量名:
用来接收格化式后的结果,如果不设置该属性,则结果会直接输出;如 果设置了,则需要通过el表达式输出限域变量名的值
value:要格式化的数据,与有主体内容的格式主体相同
2). formatDate 标签
使用指定的风格或模式格式化日期和时间(日期 ==> 字符串)
只有单标签
<fmt:formatDate ...>
常用属性:
value:要格式化的数据
type:要格式化成的类型 日期型(默认)、时间型、日期+时间型
dateStyle:日期型的格式
timeStyle:时间型的格式
pattern:具体的格式(自定义格式)
pattern 属性指定更精确的处理日期:
3). parseNumber 标签
利用 parseNumber 标签可以将数字、货币或百分比的字符串表示法解析成
指定语言环 境的数字。即解析一个代表着数字,货币或百分比的字符串。
(字符串 ==> 数值)
1.没有主体内容
<fmt:parseNumber type="" var="" value="" />
2.使用主体内容
<fmt:formatNumber type="" var="" >
主体内容
</fmt:formatNumber>
3.<fmt:parseNumber>标签有如下属性:
type:当前字符串的格式
number数值型,默认值
percent百分比类型
currency货币型
...
4) parseDate 标签
此标签为指定区域解析日期和时间的字符串表示法。即解析一个代表着日期
或时间的字符串
1.没有主体内容
<fmt:parseDate value="${now}" var="" pattern="">
2.使用主体内容
<fmt:parseDate value="${now}" var="" pattern="">
主体内容
<fmt:parseDate>
3.<fmt:parseDate>标签有如下属性:
type:当前字符串的格式
date、time、both
pattern:与当前字符串对应的格式
5).其他标签
查阅即可