JSTL
一、主要内容
二、简介
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库 操作等。
这次只讨论 JSTL 中最重要的标签,条件动作、迭代集合以及格式化数字和日期几个标签。
核心标签库:http://java.sun.com/jsp/jstl/core 包含 Web 应用的常见工作,比如:循环、表达式
值、基本输入输出等。
格式化标签库:http://java.sun.com/jsp/jstl/fmt 用来格式化显示数据的工作,比如:对不同区域
的日期格式化等。
三、导入JSTL类库
<%@taglib uri="路径" prefifix="前缀"%>
例如:<%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefifix=”c”%>
前缀可以是任意内容,遵循规范可以使团队中由不同人员编写的代码更加相似;所以,建议使用事先设计好的前缀。此时需要导入两个 jar 包。
四、标签的使用
4.1 条件动作标签
1) if 标签
if 的语法有两种形式:没有主体内容、有主体内容
没有主体内容
<!--<c:if test="条件" var="用于存储条件结果的变量" scope="var属性的作用域,默认page|request|session|application"> </c:if> -->
<c:if test="${1==1}" var="flag"></c:if> <!-- true -->
<c:if test="${'num==1'}" var="flag" scope="request"></c:if> <!-- true -->
有主体内容
<!--
<c:if test="条件" var="用于存储条件结果的变量" scope="var属性的作用域,默认page">
主体内容,条件为true时才执行
</c:if>
-->
<%
int score = 80;
request.setAttribute("score", score);
%>
<c:if test="${score<60 }" >
<h1>革命尚未成功,同志仍需努力!</h1>
</c:if>
<c:if test="${score >= 60 && score < 80 }">
<h1>改革开放了,同志们辛苦了!</h1>
</c:if>
<c:if test="${score >= 80 }">
<h1>步入小康,同志们棒棒哒!</h1>
</c:if>
<c:if test="${empty user }">
<a href="login.jsp">亲,请登录</a>
</c:if>
<c:if test="${!empty user }">
<a href="userCenter.jsp">${user.uname }</a>
</c:if>
2) choose、when和 otherwise 标签
choose 、 when和otherwise 标签的作用与 Java 中的 switch 、 case 和 finally 关键字相似。
- choose标签中只能有when和otherwise标签,when和otherwise标签中可有其他标签
- choose中至少有一个when标签
- 如果有otherwise标签,它必须放在最后一个 when 标签之后,否则会报错。
- choose和 otherwise标签没有属性,when标签则必须使用 test 属性设定一个条件,用于确定是否处理主体内容。
- 当所有的when标签的条件都不成立时,才执行otherwise标签中的语句
格式
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
<%
request.setAttribute("score", 80);
%>
<c:choose>
<c:when test="${score < 60 }">
<h1>革命尚未成功,同志仍需努力!</h1>
</c:when>
<c:when test="${score >= 60 && score < 80 }">
<h1>改革开放了,同志们幸苦了!</h1>
</c:when>
<c:when test="${score <= 59 }">
<h1>穿透了码</h1>
</c:when>
<c:otherwise>
<h1>步入小康,同志们棒棒de!</h1>
</c:otherwise>
</c:choose>
- 事实证明不会穿透 ,所以说每个when中默认相当于有个return
4.2 迭代标签
forEach 标签
属性 | 描述 | 类型 | 是否必要 | 默认值 |
---|---|---|---|---|
var | 用来存放现在指到的成员 | String | 否 | 无 |
items | 被迭代的集合对象 | Arrays Collection Iterator Enumeration Map String | 否 | 无 |
varStatus | 用来存放现在指到的相关成员信息 | String | 否 | 无 |
begin | 开始的位置 | int | 否 | 0 |
end | 结束的位置 | int | 否 | 最后一个成员 |
step | 每次迭代的间隔数 | int | 否 | 1 |
varStatus 属性的使用:
属性 | 类型 | 意义 |
---|---|---|
index | number | 现在指到成员的索引 |
count | number | 总共指到成员的总数 |
fifirst | boolean | 现在指到的成员是否为第一个成员 |
last | boolean | 现在指到的成员是否为最后一个成员 |
- 将主体内容循环多次
<c:forEach var="每次循环的成员(限域变量)" begin="开始数" end="结束数" step="间隔数(默认 是1)" >
主体内容
</c:forEach>
<c:forEach var="i" begin="1" end="8" >
主体内容${i }
</c:forEach>
- 迭代集合
<c:forEach var="每次循环的成员(限域变量)" items="需要迭代的集合" varStatus="循环到的成员 的相关信息">
主体内容
</c:forEach>
varStatus属性:
index:现在指到成员的索引
count:总共指到成员的总数
first:现在指到的成员是否为第一个成员
last:现在指到的成员是否为最后一个成员
<%
List<String> list = new ArrayList<String>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
for(String str : list){
out.write(str+" ");
}
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="str" varStatus="status">
${str }-${status.index }-${status.count }-${status.first }-${status.last }
</c:forEach>
- 迭代 list 对象集合
<%
List<User> userList = new ArrayList<User>();
User user1 = new User("zs","张三","/jstl/image/zs.jpg");
User user2 = new User("ls","李四","/jstl/image/ls.jpg");
User user3 = new User("ww","王五","/jstl/image/ww.jpg");
userList.add(user1);
userList.add(user2);
userList.add(user3);
request.setAttribute("userList", userList);
%>
<c:forEach var="user" items="${userList }">
<h2>${user.uname }</h2>
<h2>${user.nick }</h2>
<img src="${user.head }" />
</c:forEach>
- 迭代map
<%
Map<String,Object> map = new HashMap<String,Object>();
map.put("user1",user1);
map.put("user2",user2);
map.put("user3",user3);
request.setAttribute("map", map);
%>
<c:forEach items="${map }" var="item">
${item.key }-${item.value }
<h2>${item.value.nick }</h2>
<h2>${item.value.uname }</h2>
</c:forEach>
内容主体为 JSP,对于每一次迭代,forEach 标签都会创建一个限域变量,其名称通过 var 属性设置。利用 forEach 迭代一个 Map,分别利用 key 和 value 属性引用一个 Map 键和一个 Map 值。
4.3 格式化标签
1) formatNumber 标签
formatNumber 标签,该标签用指定的格式或精度来格式化数字, <fmt:formatNumber > 标签有如下
属性:
使用该标签时,有两种语法:
没有主体内容
<%
request.setAttribute("num", 10000000);
request.setAttribute("num1", 88888.66666);
%>
<fmt:formatNumber value="0.25" type="percent"></fmt:formatNumber>
<fmt:formatNumber value="${num }" type="currency" currencySymbol="$"></fmt:formatNumber>
<fmt:formatNumber value="${num1 }" maxIntegerDigits="4" maxFractionDigits="2"></fmt:formatNumber>
使用主体内容
<% request.setAttribute("num", 123456.789); %>
<fmt:formatNumber type="currency">
1000000
</fmt:formatNumber>
<fmt:formatNumber type="number" maxIntegerDigits="4" maxFractionDigits="2">
${num }
</fmt:formatNumber>
<!-- ¥1,000,000.00 3,456.79 -->
2) formatDate 标签
使用指定的风格或模式格式化日期和时间, <fmt:formatDate > 标签有如下属性:
pattern 属性指定更精确的处理日期:
<%
request.setAttribute("date", new Date());
%>
<fmt:formatDate value="${date }" type="time"/><br><!-- 16:26:18 -->
<fmt:formatDate value="${date }" type="time" timeStyle="full"/><br/> <!-- 下午04时29分32秒 CST -->
<fmt:formatDate value="${date }" type="date"/><br><!-- 2019-9-11 -->
<fmt:formatDate value="${date }" type="both"/><!-- 2019-9-11 16:27:45 -->
<hr>
自定义格式化
<fmt:formatDate value="${date }" pattern="yyyy年M月d日-H时:m分:s秒"/>
3) parseNumber 标签
利用 parseNumber 标签可以将数字、货币或百分比的字符串表示法解析成指定语言环境的数字。
即解析一个代表着数字,货币或百分比的字符串。 <fmt:parseNumber > 标签有如下属性:
使用该标签时,有两种语法:
没有主体内容
<%
request.setAttribute("num", "¥1,000.00");
request.setAttribute("num1", "123,456.789");
%>
<fmt:parseNumber value="20%" type="percent"></fmt:parseNumber> <!-- 0.2 --> <fmt:parseNumber value="${num }" type="currency"></fmt:parseNumber> <!-- 1000 --> <fmt:parseNumber value="${num1 }" type="number" var="aa"></fmt:parseNumber>
${aa }<!-- 123456.789 -->
使用主体内容
<%
request.setAttribute("num", "$1,000,000.00");
%>
<fmt:parseNumber type="currency" parseLocale="en_US">
${num }
</fmt:parseNumber> <!-- 1000000 -->
4) parseDate 标签
此标签为指定区域解析日期和时间的字符串表示法。即解析一个代表着日期或时间的字符串。
<fmt:parseDate > 标签有如下属性:
使用该标签时,同样有两种语法:
<%
request.setAttribute("date", "16:26:18");
request.setAttribute("date1", "2019年份第09个月第09天 09点09分09秒09毫秒");
%>
<!--没有主体内容-->
<fmt:parseDate value="${date }" type="time"></fmt:parseDate>
<!--有主体内容-->
<fmt:parseDate pattern="yyyy年份第MM个月第dd天 HH点mm分ss秒SS毫秒">
${date1 }
</fmt:parseDate>
除此之外还有许多其他标签,使用的时候查阅即可