JSTL虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签库共同组成的。在JSTL1.1规范中,为这5个标签库分别指定了不同的URI以及建议使用的前缀
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun.com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | x |
Functions | http://java.sun.com/jsp/jstl/functions | fn |
1.JSTL的安装和测试
要想在JSP页面中使用JSTL,首先需要安装JSTL
1.下载JSTL包
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
2.安装JSTL
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
3.测试JSTL
使用任何库,你必须在每个 JSP 文件中的头部包含<taglib> 标签。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- uri属性:指定引入标签库描述符文件的URI
- prefix属性:用于指定引入标签库描述符文件的前缀,在JSP文件中使用这个标签库中的某个标签时,都需要使用这个前缀。
通过<c:out>标签测试是否安装成功
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
<c:out value="Hello World!"></c:out>
</body>
</html>
浏览器显示结果如下,这样就表示JSTL标签库安装成功了
2.核心标签
1.<c:set>标签
作用:用于保存数据
语法:
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"
/>
属性:
scope="{page|request|session|application}"/>
实例演示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="salary" value="2000"/>
${salary}
</body>
</html>
我们相当于在pageContext中存储了一个变量名为salary,值为2000的变量(scope默认为page)
此时如果通过jsp脚本,在request/session/application域中是获取不到salary的值的
2.<c:if>标签
作用:与我们在一般程序中用的if一样
语法:
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
属性:
其中test中是判断表达式的值,如果表达式的值为 true 则执行其主体内容。
实例演示:
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}" var="flag" scope="request">
<%--输出request域中存储的flag变量的值 --%>
${flag}
</c:if>
</body>
我们在pageContext中存储了一个值为4000的变量salary
在if标签中,通过EL表达式判断salary的值是否大于2000,并将值以变量名flag存入request域中
注意:这里不能写成 test="${salary} > 2000"
3.<c:forEach>标签
作用:基础迭代标签,接受多种集合类型
语法:
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
...
属性:
var属性用于指将当前迭代到的元素保存到page域中的名称(后一个覆盖前一个)
实例演示:
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String[] fruits = { "apple", "orange", "grape", "banana" };
request.setAttribute("fruits",fruits);
%>
<%--数组 --%>
<c:forEach var="name" items="${fruits}">
${name}
</c:forEach><br/>
<%
Map userMap = new HashMap();
userMap.put("Tom", "123");
userMap.put("Make", "123");
userMap.put("Lina", "123");
pageContext.setAttribute("userMap", userMap);
%>
<%--map集合 --%>
<c:forEach var="entry" items="${userMap}">
${entry.key} ${entry.value} <br/>
</c:forEach>
<%
List colorsList=new ArrayList();
colorsList.add("red");
colorsList.add("yellow");
colorsList.add("blue");
colorsList.add("green");
colorsList.add("black");
pageContext.setAttribute("colorsList", colorsList);
%>
<%--list集合,同时测试begin,end和step --%>
<c:forEach var="color" items="<%=colorsList%>" begin="1"
end="3" step="2">
${color}
</c:forEach>
</body>
</html>
浏览器窗口中显示了colorsList集合中的yellow和green两个元素,只显示这两个元素的原因是,在使用<c:forEach>标签迭代List集合时,指定了迭代的起始索引为1,当迭代集合时首先会输出yellow元素,由于在<c:forEach>标签中指定了步长为2,并且指定了迭代的结束索引为3,因此,还会输出集合中的green元素,其他的元素不会再输出。
c:forEach varStatus 属性
- current: 当前这次迭代的(集合中的)项
- index: 当前这次迭代从 0 开始的迭代索引
- count: 当前这次迭代从 1 开始的迭代计数
- first: 用来表明当前这轮迭代是否为第一次迭代的标志
- last: 用来表明当前这轮迭代是否为最后一次迭代的标志
- begin: 属性值
- end: 属性值
- step: 属性值
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
List userList = new ArrayList();
userList.add("Tom");
userList.add("Make");
userList.add("Lina");
userList.add("jack");
userList.add("black");
%>
<table border="1">
<tr>
<td>序号</td>
<td>是否为第一个元素</td>
<td>是否为最后一个元素</td>
<td>元素的迭代索引</td>
<td>元素的值</td>
</tr>
<c:forEach var="name" items="<%=userList%>" varStatus="status" step="2">
<tr>
<td>${status.count}</td>
<td>${status.first}</td>
<td>${status.last}</td>
<td>${status.index}</td>
<td>${name}</td>
</tr>
</c:forEach>
</table>
</body>
</html>