JSTL概述
什么是JSTL
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL是apache对EL表达式的扩展(也就是说jstl依赖于EL表达式),JSTL是标签库语言,使用起来非常方便。与jsp动作标签一样,只不过它不是jsp的内置标签。需要导包后才能使用。在用myEclipse时创建项目需要加上jstl的jar包。使用的时候需要在jsp中使用taglib标签导入jar包。
JSTL构成
JSTL标签库一共有四大标签库,这里主要对其中两个做简要介绍
* core : 核心标签库(重点)
* fmt : 格式化标签库(只学习其中一部分常用标签)
JSTL标签库的导入
使用taglib导入指令标签库
* 导包taglib <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix=”c”,指定标签库的前缀,一般用c代表JSTL的核心标签库。
* uri=“…” 不是url,uri是一个标签的唯一性标识,不一定是真实网络地址,但是它可以让jsp、找到标签库的描述文件。
core标签库的常用标签
out和set
- out用法
用法 | 功能 |
| 输出aaa字符串常量 |
| 在四大域范围内查找,找不到不显示任何信息 |
| 当${aaa}不存在时,输出xxx字符串 |
<%request.setAttribute("","");%><c:out value="${a}" default="xxx" escapeXml="false"/>
当escapeXml为false,不会转换”<”,”>”。
* set用法
用法 | 功能 |
| 在pageContext中添加name为a,value为hello的域参数 |
| 在session中添加name为a,value为hello的数据。 |
* remove用法
jsp给几个域对象设置属性
<%
pageContext.setAttribute("a", "pageContext");
request.setAttribute("a", "session");
session.setAttribute("a", "session");
application.setAttribute("a", "application");
%>
用法 | 功能 |
| 移除所有域中name为a的数据 |
| 删除pageContext中name为a的数据 |
* url用法
用法 | 功能 |
| 输出上下文路径 |
| 把本该输出的结果赋给变量a,作为request的域属性 |
| 输出/myapp/AServlet |
<c:url value="/AServlet">
<c:param name="username" value="abc"/>
<c:param name="password" value="123"/>
</c:url>
输出:
/myapp/AServlet?username=abc&password=123
- if用法
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。
<c:set var="a" value="hello"/>
<c:if test="${not empty a}">
<c:out value="${a}"/>
</c:if>
- choose用法
choose标签对应java中if/else结构。当when标签中的test为true时,会执行这个when中的内容,当所有when标签的test值都为false时,执行otherwise标签中的内容。
<h3>演示choose标签</h3>
<br/> A 90-100 B 60-90 C<60 <br/>
如果0>score||score>100 错误的分数 <br/>
<br/>
<c:set var="score" value="99"/>
<c:choose>
<c:when test="${score>90&&score<=100}">
A
</c:when>
<c:when test="${score>60&&score<=90}">
B
</c:when>
<c:when test="${0<score&&score<=60}">
C
</c:when>
<c:otherwise>
这是错误的分数
</c:otherwise>
</c:choose>
- forEach循环
forEach可以分为两种 - 使用循环变量,指定开始和结束值,for(int i=1;i<=10;i++){….}
- 循环遍历集合,类似for(Object o: 集合){…}
循环变量:
<body>
求和:
<c:set var="sum" value="0"/>
<c:forEach var="i" begin="1" end="10">
<c:set var="sum" value="${sum+i}"/>
<c:out value="${sum}"></c:out>
</c:forEach><br/>
<c:set var="sum2" value="0"/>
<c:forEach var="i" begin="1" end="10" step="3">
<c:set var="sum2" value="${sum2+i}"/>
<%-- <c:out value="${i}"></c:out> --%>
<c:out value="${sum2}"></c:out>
</c:forEach>
</body>
遍历集合
便利map(key,value)
<body>
<%
Map<String,String> map=new HashMap<String,String>();
map.put("name1", "zhangsanfeng1");
map.put("name2", "zhangsanfeng2");
map.put("name3", "zhangsanfeng3");
map.put("name4", "zhangsanfeng4");
request.setAttribute("map1",map);
%>
//items:存放在域空间中的集合
//var:forEach会对该集合进行遍历,每遍历一次,都会取出该集合中一个对象,
//item :当前遍历出的对象取的对象名称,可以随便取名,但是需要注意:
//该值必须和key与value前的值一致
<c:forEach var="item" items="${map1}">
${item.key}:${item.value}<br/>
</c:forEach>
</body>
遍历数组和list
User为一个JavaBean类,具体代码不再给出
<h3>遍历数组</h3>
<%
String[] str={"zhansan","lisi","wangwu","zhaoliu"};
request.setAttribute("arr",str);
%>
<c:forEach var="item" items="${arr}">
${item}<br/>
</c:forEach>
<h3>遍历list</h3>
<%
List<String> list=new ArrayList<String>();
list.add("l1");
list.add("l2");
list.add("l3");
list.add("l4");
request.setAttribute("arrayList", list);
%>
<c:forEach var="a" items="${arrayList}">
${a}<br/>
</c:forEach>
<%
List<User> uList=new ArrayList<User>();
uList.add(new User("01","张无忌","123","男","20","倚天屠龙记"));
uList.add(new User("02","杨过","123","男","20","神雕侠侣"));
uList.add(new User("03","郭靖","123","男","20","射雕英雄传"));
uList.add(new User("04","小龙女","123","女","20","射雕英雄传"));
uList.add(new User("05","熊二","123","男","20","熊出没"));
request.setAttribute("uList", uList);
%>
<hr>
<table cellpadding="0" cellspacing="0" border="1" width="90%" align="center">
<tr>
<th width="120px;">用户编号</th>
<th width="120px;">用户姓名</th>
<th width="120px;">用户密码</th>
<th width="120px;">用户性别</th>
<th width="120px;">用户年龄</th>
<th width="120px;">用户地址</th>
<th width="60px;">增加</th>
<th width="60px;">删除</th>
<th width="60px;">修改</th>
<th width="60px;">查看</th>
</tr>
<c:forEach var="user" items="${uList}">
<tr align="center">
<td>${user.id }</td>
<td>${user.username}</td>
<td>${user.password}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
<td>${user.address}</td>
<td><a href="javascript:void(0);">增加</a></td>
<td><a href="javascript:void(0);">删除</a></td>
<td><a href="javascript:void(0);">修改</a></td>
<td><a href="javascript:void(0);">查看</a></td>
</tr>
</c:forEach>
</table>
Foreach标签还有一个属性,varstatus,这个属性用来接收“循环状态”的变量名,例如
vs.count从1开始{vs.index}从0开始
vs.first判断是否第一行{vs.last}判断是否最后一行
具体用法如下
<body>
<hr>
<h3>遍历list</h3>
<%
List<String> list=new ArrayList<String>();
list.add("l1");
list.add("l2");
list.add("l3");
list.add("l4");
request.setAttribute("arrayList", list);
%>
<c:forEach var="a" items="${arrayList}" varStatus="vs">
${a}<br/>
第${vs.count}行 <br/>
该行索引为${vs.index}<br/>
<c:if test="${vs.first}">第一行</c:if> <br/>
<c:if test="${vs.last}">最后一行</c:if> <br/>
</c:forEach>
</body>
fmt:格式化标签库
fmt标签库用来格式化输出的,通常需要格式化的有时间还有数字
该 标签库需要先导入才能使用,导入方法如下 <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<body>
<h3>格式化时间</h3>
<%
Date date=new Date();
request.setAttribute("date", date);
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
<%
double d1=30.5;
double d2=4.00000;
pageContext.setAttribute("d1", d1);
pageContext.setAttribute("d2", d2);
%>
<hr>
<br/>
<!--必须保留两位小数:如果大于2位,那么只保留两位,并四舍五入,如果小于两位,那么用0补足 -->
<fmt:formatNumber value="${d1}" pattern="0.00"/><br/>
<!--小数位:有几个#号最多显示几位小数;如果小于两位,那么有几位保留几位,不会用0补足;
大于两位,只保留两位,四舍五入 ;为整数则只保留整数-->
<fmt:formatNumber value="${d2}" pattern="#.##"/>
</body>