JSP 标准标签库,是一个定制标签 :
用途解决一些常见问题:迭代一个映射或者集合,条件测试,xml处理,数据库和数据库访问操作等
核心标签库:
http://java.sun.com/jsp/jstl/core 包含 Web 应用的常见工作, 比如:循环、表达式赋值、基本输入输出等。
格
格式化标签库:
http://java.sun.com/jsp/jstl/fmt, 用来格式化显示数据的工作, 比如:对不同区域的日期格式化等
格式:
<%@taglib uri=”” prefix=””%>
导入两个 jar 包
标签的使用
(一般操作域对象,变量无法操作)
条件动作标签 :
处理页面的输出结果依赖于某些输入值的情况,在 Java 中是利用 if、 if…else 和 switch 语句来进行处理的。在 JSTL 中也有 4 个标签 可以执行条件式动作指令:if、 choose、when 和 otherwise
1)if标签
可以利用 var 属性设置限域变量名,利用 scope 属性来指定其 作用范围,可以设置返回值,返回是boolean类型,通过var设置,
两种语法形式:
没有主体内容:
格式:<c:if test="条件" var="限域变量的名称" scope="域对象的范围[page|request|session|application]"></c:if>
有主体内容
格式:
<c:if test="条件" var="限域变量的名称" scope="域对象的范围[page|request|session|application]">
条件满足时,显示的内容
</c:if>
注意:JSTL 中没有 else 标签,为了模拟 else 的情景,需要使用两个 if 标签,并 且这两个标签为相反的条件。 JSTL 中没有 else 标签,为了模拟 else 的情景,需要使用两个 if 标签,并 且这两个标签为相反的条件。
<%
int a = 1;
if(a<1){
%>
<h1 style='color:blue'>q</h1>
<%
} else {
%>
<h1>w</h1>
<%
}
%>
<%
request.setAttribute("b", 10);
%>
<c:if test="${b>=10}"> <%--只能针对域对象--%>
10-
</c:if>
<c:if test="${b<10}">
0-9
</c:if>
if和域对象的判断:
<%
int a = 1;
request.setAttribute("b", 0);
request.setAttribute("c", 1);
int d = 1;
%>
<c:if test="$(1==1)" var="flag" scope="request"></c:if> ${flag }
<%--false --%>
<c:if test="${a == b}" var="flag1" ></c:if> ${flag1 } <br><%--false --%>
<c:if test="${c == b}" var="flag2" ></c:if> ${flag2 } <br><%--false --%>
<c:if test="${a == d}" var="flag3" ></c:if> ${flag3 } <br> <%--true 两个变量,找不到域对象,所以都是null才为true --%>
<c:if test="${'' == ''}" var="flag4" ></c:if> ${flag4 } <br><%--true --%>
<c:if test="${a > 0}" var="flag5" ></c:if> ${flag5 } <br><%--false a为null--%>
<c:if test="b == c" var="flag6" ></c:if> ${flag6 } <br><%--false --%>
<c:if test="1 == 1" var="flag7" ></c:if> ${flag7 } <br><%--false --%>
<c:if test="true" var="flag8" ></c:if> ${flag8 } <br><%--true --%>
<c:if test="${'1==1' }" var="flag9" ></c:if> ${flag9 } <br><%--false --%>
<c:if test="${b > 0 }" var="flag10" ></c:if> ${flag10 } <br>
choose、when 和 otherwise 标签:
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似,。choose 标签内容部必须 嵌有一个或多个 when 标签
如果有 otherwise 标签,它必须放在最后一个 when 标签之后,否则会报错。 choose 和 otherwise 标签没有属性,设置属性报错,
Attribute xxx invalid for tag choose according to TLD
when 标签则必须使用 test 属性设定 一个条件,用于确定是否处理主体内容
否则:attribute test is mandatory for tag when
choose标签中只能包含when标签和otherwise标签、when标签和otherwise标签可以包含其他标签
Illegal child tag in "c:choose" tag: "c:if" tag
choose标签中至少要有一个吻痕标签,可以没有otherwise标签
Illegal "choose" without child "when" tag
otherwise标签必须放在最后一个when标签之后
Illegal "c:when" after "c:otherwise" tag in "c:choose" tag.
otherwise标签只有在所有when标签都不成立时才会执行
格式:<c:choose>
<c:when test="条件语句"></c:when>
...
<c:otherwise></c:otherwise>
</c:choose>
<%
request.setAttribute("score", 100);
%>
<c:choose>
<c:when test="${score>60 }">
<h1>分不在高,及格就好!</h1>
</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
forEach 标签 :
forEach 是将一个主体内容迭代多次,迭代一个对象集合。可以迭代的对象包括所 有的 java.util.Collection 和 java.util.Map 接口的实现,以及对象或 者基本类型的数组,java.util.Iterator 和 java.util.Enumeration,不能在多个动作指令中使用 Iterator 或者 Enumeration,因为 Iterator 或者 Enumeration 都不能重置
var :存放现在指到的成员
varStatus:存放现在指到的相关成员信息
begin:开始的位置
end:结束的位置
step:每次迭代的间隔数
设置9x9表
<table border="1" style="border-collapse:collapse; "><%-- border-collapse:collapse为表格设置合并边框模型--%>
<c:forEach begin="1" end="9" var="i">
<tr>
<c:forEach begin="1" end="${i }" var="j">
<td>
${j }*${i }=${j*i }
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
迭代:将主体内容重复打印多次
格式:
<c:forEach begin="开始循环的数" end=“结束循环的数” step="循环的间隔" var="被循环到的值的域对象名称">
主体内容
</c:forEach>
迭代集合:
<c:forEach items="被循环的集合/对象" var ="被循环到的成员的域对象名称" varStatus="当前被循环的成员信息">
主体内容
</c:forEach>
<%
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
request.setAttribute("list", list);
%>
<table border="1" style="border-collapse: collapse;">
<tr>
<th>姓名</th>
<th>当前成员的下标</th>
<th>循环次数</th>
<th>当前成员是否第一次循环</th>
<th>当前成员是否最后一次循环</th>
</tr>
<c:forEach items="${list }" var="item" varStatus="info">
<tr>
<td>${item }</td>
<td>${info.index }</td>
<td>${info.count }</td>
<td>${info.first }</td>
<td>${info.last }</td>
</tr>
</c:forEach>
</table>
varStatus属性的使用:
index :现在指到成员的索引
count:总共指到成员的总数
first:指到的成员是否为第一个成员
last:现在指到的成员是否为最后一个成员
<%
Map<String,Object> map = new HashMap<>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
map.put("admin",list);
request.setAttribute("myMap",map);
%>
<c:forEach items="${myMap }" var="user">
${user.key }= ${user.value }<br>
</c:forEach>
格式化动作指令 :
JSTL 提供了格式化和解析数字和日期的标签,
formatNumber、formatDate、parseNumber 及 parseDate
formatNumber 标签 :
fmatNumber 标签 该标签用指定的格式或精度来格式化数
没有主体内容
格式:<fmt:formatNumber value="被格式化的值" var="格式化后的结果(域对象的名称)" type="被格式化的类型"></fmt:formatNumber>
type:被格式化的类型
number:数值型
percent:百分比类型
currency:货币类型
value:被格式化的值
var:用来接收格式化后的结果的限域变量,没有设置格式化后直接输出,设置了就需通过表达式获取域对象中的值
格式化百分比,默认保留两位小数,四舍五入
maxIntegerDigits:允许最大的整数位
maxFractionDigits:允许最大的小数位
<fmt:formatNumber value="10" type="number"></fmt:formatNumber> <br><!-- 10 -->
<fmt:formatNumber value="10" type="number" var="num"></fmt:formatNumber>${num }<br><!--10 -->
<fmt:formatNumber value="0.235265" type="percent"></fmt:formatNumber><!--24% -->
<fmt:formatNumber value="12345.6789" type="number" maxIntegerDigits="3" maxFractionDigits="2"></fmt:formatNumber><!--345.68 -->
<fmt:formatNumber value="1000" type="currency"></fmt:formatNumber><br> <!-- ¥1,000.00 -->
formatDate格式化日期:
格式:<fmt:formatDate value="要被格式化的值" type="被格式化的类型"/>
value:也可以用表达式从域对象中取值
type:被格式化的类型
date:日期类型,默认值
time:时间类型
both:日期+时间类型
<%
Date myDate = new Date();
request.setAttribute("myDate",myDate);
%>
${myDate }<br><%--Mon Sep 03 21:03:41 CST 2018 --%>
<fmt:formatDate value="${myDate }" type="date"/><br><%--2018-9-3 --%>
<fmt:formatDate value="${myDate }" type="time"/><br><%--21:03:41 --%>
<fmt:formatDate value="${myDate }" type="both"/><br><%--2018-9-3 21:03:41 --%>
<fmt:formatDate value="${myDate }" type="date" dateStyle="full"/><br><%-- 2018年9月3日 星期一--%>
<fmt:formatDate value="${myDate }" type="date" dateStyle="long"/><%--2018年9月3日 --%>
<fmt:formatDate value="${myDate }" type="date" dateStyle="short"/> <%-- 18-9-3--%>
<fmt:formatDate value="${myDate }" type="date" dateStyle="medium"/><br><%-- 2018-9-3--%>
<fmt:formatDate value="${myDate }" type="date" dateStyle="default"/><br><%-- 2018-9-3--%>
<fmt:formatDate value="${myDate }" type="time" dateStyle="full"/><br><%--21:11:35 --%>
<fmt:formatDate value="${myDate }" type="time" dateStyle="short"/><br><%--21:12:49 --%>
<fmt:formatDate value="${myDate }" type="both" timeZone="America/Los_Angeles"/> <%-- 市区:2018-9-3 6:14:40--%>
<fmt:formatDate value="${myDate }" pattern="yyyy-MM-dd HH:mm:ss" /><br> <%--2018-9-3 6:15:37 --%>
<fmt:formatDate value="${myDate }" pattern="yyyy/MM/dd HH:mm:ss" /><br> <%--2018/09/03 21:16:55 --%>
<fmt:formatDate value="${myDate }" pattern="yy/MM/dd" /><br><%-- 18/09/03--%>
parseNumber:
可以将数字,货币或百分比的字符出表示法解析成指定语言环境的数字,解析代表数字,货币,百分比的字符串
<fmt:parseNumber value="25%" type="percent"></fmt:parseNumber><br><%--0.25 --%>
<fmt:parseNumber value="¥100.10" type="currency" var="num"></fmt:parseNumber>${num }<br><%--100.1 --%>
<fmt:parseNumber value="${num1 }" type="number" ></fmt:parseNumber><br><%--10.1221 --%>
<fmt:parseNumber value="${num1 }" type="number" integerOnly="true"></fmt:parseNumber><br><%--10 --%>
parseDate:
将指定格式的字符串转换成日期类型
<fmt:parseDate value="2018-09-04" pattern="yyyy-MM-dd"></fmt:parseDate><br>
<fmt:parseDate value="21:35:16" pattern="HH:mm:ss"></fmt:parseDate><br>
<%
request.setAttribute("dat1", "2018/09/04");
request.setAttribute("dat2", "09/03/2018");
%>
<fmt:parseDate pattern="yyyy/MM/dd">${dat1}</fmt:parseDate>
<fmt:parseDate pattern="MM/dd/yyyy">${dat2 }</fmt:parseDate>