JSTL
if标签
定义:
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库、可以解决迭代一个映射或者集 合、条件测试、XML 处理,甚至数据库和访问数据库操作等
准备工作:
1、导包 jstl.jar以及standard.jar 放到WEB-INF/lib下
2、<%@taglib uri=”核心标签库路径” prefix=”前缀”%>
uri中写http://java.sun.com/jsp/jstl/core(叫核心标签库)
或者http://java.sun.com/jsp/jstl/fmt (叫格式化标签库)
前缀可以随意指定,但是一般按照约定熟成的规范来写
c:if标签:
格式:
<c:if test="条件" var="指定将条件结果存域对象中键的名称" scope="指定将条件结果存在哪一个域对象中,默认page|request|session|application">
主体内容
</c:if>
相当于
if(条件){
主体内容
}
代码:
<%--无主体部分 --%>
<!--
<c:if test="条件" var="用于存储条件结果的变量" scope="var属性的作用域,默认page">
</c:if>
-->
<%
request.setAttribute("num", "1");
%>
<c:if test="${'1==1'}" var="flag"></c:if> <!-- flase -->
<c:if test="1==1" var="flag"></c:if> <!-- flase -->
<c:if test="${'num==1'}" var="flag"></c:if> <!-- true -->
<c:if test="${1==1}" var="flag"></c:if> <!-- true -->
<%--有主体部分 --%>
<!--
<c:if test="条件" var="用于存储条件结果的变量" scope="var属性的作用域,默认page">
主体内容,条件为true时才执行
</c:if>
-->
<%
request.setAttribute("num", "1");
%>
<c:if test="${num < 10 }">
<h1>num比10小</h1>
</c:if>
<c:if test="${num > 10 }">
<h1>num比10大</h1>
</c:if>
choose、when 和 otherwise 标签
choose 和 when 标签的作用与 Java 中的 switch 和 case 关键字相似。otherwise 标签用于默认的条件代码块,如果所有的 when 标签的测试条件运算结果都不为 true,就会执行该代码块。如果有 otherwise 标签,它必须放在最后一个when 标签之后,否则会报错。choose 和 otherwise 标签没有属性,when标签则必须使用 test 属性设定一个条件,用于确定是否处理主体内容。
注意点:
1、choose标签中只能有when和otherwise标签,when和otherwise标签中可有其他标签
2、choose中至少有一个when标签
3、choose标签和otherwise标签没有属性,when标签必须要有test属性
4、otherwise标签必须放在最后一个when标签之后
5、当所有的when标签的条件都不成立时,才执行otherwise标签中的语句
代码
<%
request.setAttribute("score", 80);
%>
<c:choose>
<c:when test="${score >= 90 }">
<h2>很优秀!</h2>
</c:when>
<c:when test="${score >= 80 && score < 90 }">
<h2>良好!</h2>
</c:when>
<c:when test="${score >= 60 && score < 80 }">
<h2>及格!</h2>
</c:when>
<c:otherwise>
<h2>学渣!</h2>
</c:otherwise>
迭代标签forEach
forEach 是将一个主体内容迭代多次,或者迭代一个对象集合。可以迭代的对象包括所有的
java.util.Collection 和 java.util.Map 接口的实现,以及对象或者基本类型的数组。他还可以迭代
java.util.Iterator 和 java.util.Enumeration,但不能在多个动作指令中使用 Iterator 或者
Enumeration,因为 Iterator 或者 Enumeration 都不能重置(reset)。
[外链图片转存失败(img-1njzsP8G-1568247823396)(https://i.loli.net/2019/09/11/wLs8SCuQziEFoGm.png)]
代码
<c:forEach var="每次循环的成员(限域变量)" begin="开始数" end="结束数" step="间隔数(默认
是1)" >
主体内容
</c:forEach>
<c:forEach var="i" begin="0" end="10">
${i }、主体内容<br/>
</c:forEach>
<c:forEach var="i" begin="0" end="10" step="3">
${i }、主体内容<br/>
</c:forEach>
迭代List集合
<%
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("赵六");
// 将集合存到域对象中
request.setAttribute("list", list);
%>
<table border="1" style="border-collapse: collapse;">
<tr>
<td>当前成员内容</td>
<td>当前成员的下标</td>
<td>当前循环次数</td>
<td>是否是第一个成员</td>
<td>是否是最后一个成员</td>
</tr>
<c:forEach items="${list}" var="item" begin="0" end="9" varStatus="itemStr">
<tr>
<td>${item}</td>
<td>${itemStr.index }</td>
<td>${itemStr.count }</td>
<td>${itemStr.first }</td>
<td>${itemStr.last }</td>
</tr>
</c:forEach>
</table>
<%
List<User> userList = new ArrayList<>();
User user1 = new User();
user1.setUserId(1);
user1.setUname("张三");
user1.setAge("18");
user1.setSex("男");
User user2 = new User();
user2.setUserId(2);
user2.setUname("李四");
user2.setAge("19");
user2.setSex("女");
User user3 = new User();
user3.setUserId(3);
user3.setUname("王五");
user3.setAge("20");
user3.setSex("男");
userList.add(user1);
userList.add(user2);
userList.add(user3);
request.setAttribute("userList", userList);
%>
<table border="1" style="border-collapse: collapse;">
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
</tr>
<c:forEach items="${userList }" var="user">
<tr>
<td>${user.userId }</td>
<td>${user.uname }</td>
<td>${user.age }</td>
<td>${user.sex }</td>
</tr>
</c:forEach>
</table>
<%
Map<String,User> map = new HashMap<>();
map.put("zhangsan", user1);
map.put("lisi", user2
迭代Map集合
<%
Map<String,User> map = new HashMap<>();
map.put("zhangsan", user1);
map.put("lisi", user2);
map.put("wangwu", user3);
request.setAttribute("map", map);
%>
<c:forEach items="${map }" var="item">
${item.key }---${item.value }---${item.value.uname }<br>
</c:forEach>
运行结果
格式化标签
formatNumber 标签
该标签用指定的格式或精度来格式化数字<fmt:formatNumber> 标签有如下属性:
代码(第一种语法,无主体内容)
<%
request.setAttribute("num", 1000);
%>
<fmt:formatNumber var="i" value="0.25" type="percent"></fmt:formatNumber>
${i }
<fmt:formatNumber value="${num }" type="currency"></fmt:formatNumber>
<!-- 25% ¥1,000.00 -->
有主体内容
<%
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 -->
formatDate标签
使用指定的风格或模式格式化日期和时间<fmt:formatDate> 标签有如下属性:
parseNumber标签
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 -->
parseDate 标签
此标签为指定区域解析日期和时间的字符串表示法,即解析一个代表着日期或时间的字符串