目录
一、JSTL简介
JSTL 标签库 全称是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标签库。EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个 jsp 页面变得更佳简洁。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
JSTL 由五个不同功能的标签库组成。如下:
二、JSTL核心标签库使用准备
1.在/WEB-INF/lib中添加以下jar包:taglibs-standard-impl-1.2.1.jar 和 taglibs-standard-spec-1.2.1.jar。
也可以访问连接下载http://tomcat.apache.org/taglibs/standard/
2.在需要使用核心标签库的JSP页面中添加如下taglib指令:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
三、核心标签库
<c:out> | 用于在JSP中显示数据,就像<%= ...%> |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL |
<c:url> | 使用可选的查询参数来创造一个URL |
<c:set>、<c:remove>、<c:if>、(<c:choose><c:when><c:otherwise>)使用示例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL示例</title>
</head>
<body>
<%-- 三个属性:
scope:保存到那个域。
1.page表示pageContext域
2.request表示request域
3.session表示session域
4.application表示ServletContext域
var:用于设置key值
value:用于设置value值
--%>
设置之前: ${pageScope.number }<br />
<c:set scope="page" var="number" value="80"></c:set>
<%--test属性表示判断的条件(使用 EL表达式输出) --%>
<c:if test="${!empty pageScope.number }">
<p>设置成功: ${pageScope.number }</p>
<%--
多路判断<c:choose> <c:when> <c:otherwise> 标签跟 switch ... case .... default 非常接近
使用注意点:
1 、标签里不能使用 html注释,要使用 jsp注释
2 、 when标签的父标签一定要是 choose标签
下面EL表达式中会先将number转换为数值类型再比较
--%>
<c:choose>
<c:when test="${pageScope.number > 18}">
<p>这是一个大于18的数</p>
</c:when>
<c:when test="${pageScope.number == 18}">
<p>这个数字为18</p>
</c:when>
<c:otherwise>
<%--注意这里when标签的父标签一定要是 choose标签 --%>
<c:choose>
<c:when test="${pageScope.number > 0}">
<p>该数大于0小于18</p>
</c:when>
<c:when test="${pageScope.number == 0}">
<p>这个数字为0</p>
</c:when>
<c:otherwise>
<p>这是一个负数</p>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</c:if>
<c:remove scope="page" var="number" />
移除之后:${pageScope.number }<br />
</body>
</html>
<c:forEach>使用示例
属性 | 描述 | 是否必要 | 默认值 |
items | 被遍历的数据源 | 否 | 无 |
begin | 开始的元素(0=第一个元素,1=第二个元素) | 否 | 0 |
end | 最后一个元素(0=第一个元素,1=第二个元素) | 否 | Last element |
step | 每一次迭代的步长 | 否 | 1 |
var | 代表当前条目的变量名称 | 否 | 无 |
varStatus | 代表循环状态的变量名称 | 否 | 无 |
基本循环
<body>
<%--
如下类似于for (int index = 1; index < 10; index++),step默认为1,如果指定2,即为index+=2
--%>
<table border="1">
<c:forEach begin="1" end="5" var="index">
<tr>
<td>第${index}行 </td>
</tr>
</c:forEach>
</table>
</body>
遍历数组或集合
<body>
<%
int[] arr = {1,2,3,4,5,6,7};
request.setAttribute("arr", arr);
%>
<%--
类似于for(int item : arr)
--%>
<c:forEach items="${requestScope.arr}" var="item">
${item}
</c:forEach>
</body>
遍历map
<body>
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
request.setAttribute("map", map);
%>
<%-- 类似于for ( Map.Entry<String,Object> entry : map.entrySet()) --%>
<c:forEach items="${requestScope.map }" var="entry">
<h1>键: ${entry.key}, 值: ${entry.value}</h1>
</c:forEach>
</body>