JSTL(标准标签库)

时间:2024-03-31 10:00:24

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/ 下。
JSTL(标准标签库)

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标签库安装成功了
JSTL(标准标签库)

2.核心标签

1.<c:set>标签
作用:用于保存数据
语法:

<c:set
   var="<string>"
   value="<string>"
   target="<string>"
   property="<string>"
   scope="<string>"
/>

属性:JSTL(标准标签库)
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>

属性:
JSTL(标准标签库)
其中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>">

    ...

属性:
JSTL(标准标签库)
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} &nbsp;
	</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} &nbsp; ${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}&nbsp;
	</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>

JSTL(标准标签库)