首页 > 技术文章 > JSTL标签

zhangquan-yw 2018-11-28 13:24 原文

JSTL标签

制作人:全心全意

JSTL标签库简介

JSTL叫做标准标签库,但实际上是由5个功能不同的标签库组成。这5个标签库分别是核心标签库、格式标签库、SQL标签库、XML标签库和函数标签库等。在使用这些标签库之前,必须在JSP页面的顶部使用<%taglib%>指令定义引用的标签库和访问前缀。

<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 使用格式标签库的taglib指令 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- 使用SQL标签库的taglib指令 -->
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<!-- 使用XML标签库的taglib指令 -->
<%@ taglib prefix="xml" uri="http://java.sun.com/jsp/jstl/xml" %>
<!-- 使用函数标签库的taglib指令 -->
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
  • 核心标签库:核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签和循环标签共4种标签。
标     签 说     明
<c:out>            将表达式的值输出到JSP页面中,相当于JSP表达式<%=表达式%>
<c:set> 在指定范围中定义变量,或为指定的对象设置属性值
<c:remove> 从指定的JSP范围中移除指定的变量
<c:catch> 捕获程序中出现的异常,相当于Java语言中的try...catch语句
<c:import> 导入站内或其他网站的静态和动态文件到Web页面中
<c:redirect> 将客户端发出的request请求重定向到其他URL服务端
<c:url> 使用正确的URL重写规则构造一个URL
<c:param> 为其他标签提供参数信息,通常与其标签结合使用
<c:if> 根据不同的条件处理不同的业务,与Java语言中的if语句类似,只不过该语句没有else标签
<c:choose>、<c:when>、<c:otherwise> 根据不同的条件完成指定的业务逻辑,如果没有符合的条件,则会执行默认条件的业务逻辑,相当于Java语言中的switch语句
<c:forEach> 根据循环条件,遍历数组和集合类中的所有或部分数据
<c:forTokens> 迭代字符串中由分隔符分隔各成员
  • 格式标签库:格式标签库提供了一个简单的国际化标记,也被称为I18N标签库,用于处理和解决国际化相关的问题。另外,格式标签库中还包含用于格式化数字和日期显示格式的标签。
  • SQL标签库:SQL标签库提供了基本的访问关系型数据的能力。使用SQL标签,可以简化对数据库的访问。如果结合核心标签库,可以方便地获取结果集,并迭代输出结果集中的数据。
  • XML标签库:XML标签库可以处理和生成XML的标记,使用这些标记可以很方便地开发基于XML的Web应用。
  • 函数标签库:函数标签库提供了一系列字符串操作函数,用于完成分解字符串、连接字符串、返回子串、确定字符串是否包含特定的子串等功能。

 

注意:JSTL还不是JSP2.0规范中的一部分,在使用JSTL之前,需要安装并配置JSTL,也就是导入jstl-api和jstl-impl两个jar包。(在Eclipse中测试时,使用过用户库和直接导入jar包,都会报错500,必须将jar包放在lib中,才能正常使用)

 

表达式标签

在JSTL的核心标签库中,包括了<c:out>标签、<c:set>标签、<c:remove>标签和<c:catch>标签等4个表达式标签

<c:out>输出标签

<c:out>标签用于将表达式的值输出到JSP页面中,具体语法格式如下:

语法1——没有标签体:

<c:out value="expression" [escapeXml="true|false" ][default="defaultValue" ]/>

语法2——有标签体:

<c:out value="expression" [escapeXml="true|false"]>
	defaultValue
	</c:out>

参数说明:

value:用于指定将要输出的变量或表达式。该属性的值类似于Object,可以使用EL。

escapeXml:可选属性,用于指定是否转换特殊字符,可以被转换的字符如下表所示。其属性值为true或false,默认值为true,表示转换。

字     符 字符实体代码 字     符 字符实体代码
< &lt; > &gt;
' &#039; " &#034;
& &amp;    

default:可选属性,用于指定当value属性值等于null时,将要显示的默认值。如果没有指定该属性,并且value属性的值为null,该标签将输出空字符串。

 

使用示例:

<body>
	escapeXml属性为true时:
	<!-- <hr>被以字符串的形式输出 -->
	<c:out value="水平线标记<hr>" escapeXml="true"></c:out>
	<br> escapeXml属性为false时:
	<!-- <hr>被当作HTML标记进行输出 -->
	<c:out value="水平线标记<hr>" escapeXml="false"></c:out>
	<c:out value="expression" [escapeXml="true|false"]>
		defaultValue
		</c:out>
</body>

 

<c:set>变量设置标签

<c:set>标签用于在指定范围(page、request、session或application)中定义保存某个值的变量,或为指定的对象设置属性值。使用该标签可以在页面中定义变量,而不用在JSP页面中嵌入打乱HTML排版的Java代码。<c:set标签>有4种语法格式,分别介绍如下:

语法1:在scope指定的范围内将变量值存储到变量中。

<c:set var="name" value="value" [scope="范围" ]/>

语法2:在scope指定的范围内将标签体存储到变量中。

<c:set var="name" [scope="page|request|session|application"]>
	标签体
</c:set>

语法3:将变量值存储在target属性指定的目标对象的propName属性中。

<c:set value=“value” target="object" property="propName" />

语法4:将标签体存储到target属性指定的目标对象的propName属性中。

<c:set target="object" property="propName">
	标签体
</c:set>

参数说明:

var:用于指定变量名。通过该标签定义的变量名,可以通过EL指定为<c:out>的value属性的值。

value:用于指定变量值,可以使用EL。

scope:用于指定变量的作用域,默认值为page。可选值包括page、request、session和application。

target:用于指定存储变量值或者标签体的目标对象,可以是JavaBean或Map集合对象。

注意:target属性不能是直接指定的JavaBean或Map,而应该是使用EL表达式或一个脚本表达式指定的真正对象。例如,这个对象可以通过<jsp:useBean>为JavaBean“CartForm”的id属性赋值,那么target属性值应该是target="${cart}",而不应该是target=“cart”。其中cart为CartForm的对象。

property:用于指定目标对象存储数据的属性名。

 

使用示例:

<!--定义request范围内的变量-->
<c:set var="username" value="全心全意" scope="request" />
<c:out value="username的值为:${username} }" />
<!--设置JavaBean对象中属性的属性值-->
<c:set target="${对象名 }" property="对象中属性名">
	标签体
</c:set>

 

<c:remove>变量移除标签

 <c:remove>标签用于移除指定的JSP范围内的变量,其语法格式如下:

<c:remove var="name" [scope="范围" ]/>

参数说明:

var:用于指定要移除的变量名。

scope:用于指定变量的有效范围,可选值有page、request、session、和application。默认值为page。如果在该标签中没有指定变量的有效范围,那么将分别在page、request、session和application的范围内查找要移除的变量并移除,也就是全部范围内的都移除。

 

使用示例:

<c:set var="username" value="全心全意" scope="request" />
username的值为:<c:out value="${username }" />
<!-- 移除request范围内的变量username -->
<c:remove var="username" scope="request" />
username的值为:<c:out value="${username }" default="空" />

 

<c:catch>捕获异常标签

<c:catch>标签用于捕获程序中出现的异常,如果需要它还可以将异常信息保存在指定的变量中。该标签与Java语言中的try...catch语句类似。其语法格式如下:

<c:catch [var="exception"]>
	<!-- 可能存在异常的代码-->
</c:catch>

参数说明:

var:可选属性,用于指定存储异常信息的变量。如果不需要保存异常信息,可以省略该属性。

注意:var属性值只有在<c:catch>标签的后面才有效,也就是说,在<c:catch>标签体中无法使用有关异常的任何信息。

 

 

URL相关标签

文件导入、重定向和URL地址生成是Web应用中常用的功能。JSTL中也提供了与URL相关的标签,分别是<c:import>、<c:url>、<c:redirect>和<c:param>。其中<c:param>标签通常与其它标签配合使用。

<c:import>导入标签

<c:import>标签可以导入站内或其它网站的静态和动态文件到Web页面中,例如,使用<c:import>标签导入其它网站的天气信息到自己的网页中。<c:import>标签与<jsp:include>动作指令类似,所不同的是<jsp:include>只能导入站内的资源,而<c:import>标签不仅可以导入站内的资源,也可以导入其它网站的资源。其语法格式有以下两种:

语法1:

<c:import url="url" [context="context" ] [var="name" ] [scope="范围"] [charEncoding="encoding"]>
	[标签体]
</c:import>

语法2:

<c:import url="url" varReader="name" [context="context"] [charEncoding="encoding"]>
	[标签体]
</c:import>

参数说明:

url:用于指定被导入的文件资源的URL地址。(如果指定的url属性为null、空或者无效,将抛出javax.servlet.ServletException异常

context:上下文路径,用于访问同一个服务器的其它Web应用,其值必须以“/”开头,如果指定了该属性,那么url属性也必须以“/”开头。

var:用于指定变量名称。该变量用于以String类型存储获取的资源。

scope:用于指定变量的存在范围,默认值为page。可选值有page、request、session、和application。

varReader:用于指定一个变量名,该变量用于以Reader类型存储被包含文件内容。(导出的Reader对象只能在<c:import>标记的开始标签和结束标签之间使用

charEncoding:用于指定被导入文件的编码格式。

标签体:可选,如果需要为导入的文件传递参数,则可以在标签体的位置通过<c:param>标签设置参数。

 

使用示例:

navigation.jsp页面:添加一个表格,在合适的位置通过EL输出<c:param>标签传递的参数值。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%request.setCharacterEncoding("UTF-8"); %>
<table width="901" height="128" border="0" align="center" cellpadding="0" cellspacing="0" style="background:#000;">
  <tr>
    <td width="16" height="91"> </td>
    <td width="885"> </td>
  </tr>
  <tr>
    <td> </td>
    <td style=" font-size:11pt; color:#FFFFFF"><b>${param.typeList}</b></td>
  </tr>
</table>

 index.jsp页面:应用<c:set>标签将歌曲类别列表组成的字符串保存到变量typeName中,最后应用<c:import>标签导入网站Banner(navigation.jsp页面),并将typeName字符串传递到navigation.jsp页面。

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>应用<c:import>标签导入网站Banner</title>
</head>
<body style="margin: 0px;">
	<c:set var="typeName"
		value="流行金曲 | 经典老歌 | 热舞DJ | 欧美金曲 | 少儿歌曲 | 轻音乐 | 最新上榜" />
	<!-- 导入网站的Banner -->
	<c:import url="navigation.jsp" charEncoding="UTF-8">
		<c:param name="typeList" value="${typeName}" />
	</c:import>

</body>
</html>

 

<c:url>动态生成URL标签

<c:url>标签用于生成一个URL路径的字符串,这个生成的字符串可以赋予HTML的<a>标记实现URL的连接,或者用这个生成的URL字符串实现网页转发与重定向等。在使用该标签生成URL时,还可以与<c:param>标签相结合动态添加URL的参数信息·。其语法格式有以下两种:

语法1:输出产生的URL字符串信息,如果指定了var和scope属性,相应的URL信息就不再输出,而是存储在变量中以备后用。

<c:url value="url" [var="name" ] [scope="范围" ] [context="context" ]/>

语法2:实现了语法1的功能,而且还可以搭配<c:param>标签完成带参数的复杂URL信息。

<c:url value="url" [var="name" ] [scope="范围" ] [context="context"]>
	<c:param />
	<!-- 可以有多个<c:param>标签 -->
</c:url>

参数说明:

value:用于指定将要处理的URL地址,可以使用EL。

context:上下文路径,用于访问同一个服务器的其他Web工程,其值必须以“/”开头。如果指定了该属性,那么url属性值也必须以“/”开头。:

var:用于指定变量名称,该变量用于保存新生成URL字符串。

scope:用于指定变量的存在范围。

 

使用示例:

<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>应用<c:url>标签生成带参数的URL地址</title>
</head>
<body>
	<c:url var="path" value="register.jsp" scope="page">
		<c:param name="user" value="mr" />
		<c:param name="email" value="wgh717@sohu.com" />
	</c:url>
	<a href="${pageScope.path }">提交注册</a>
</body>
</html>

注意:在应用<c:url>标签生成新的URL地址时,空格符将被转换为加号“+”。

 

<c:redirect>重定向标签

<c:redirect>标签可以将客户端发出的request请求重定向到其他URL服务器,由其他程序处理客户端的请求。而在这期间可以对request请求中的属性进行修改或添加,然后把所有属性传递到目标路径。其语法格式有以下两种:

语法1:没有标签体,并且不添加传递到目标路径的参数信息。

<c:redirect url="url" [context="/context" ]/>

 语法2:将客户端请求重定向到目标路径,并且在标签体中使用<c:param>传递参数。

<c:redirect url="url" [context="/context"]>
	<c:param />
	<!--可以有多个<c:param>标签  -->
</c:redirect>

参数说明:

url:必须属性,用于指定特定向资源的URL,可以使用EL。

context:用于在使用相对路径访问外部context资源时,指定资源的名字。

 

使用示例:将页面重定向到Servlet映射地址UserListServlet,并传递action参数,参数值为query。

<c:redirect url="UserListServlet">
	<c:param name="action" value="query" />
</c:redirect>

 

<c:param>传递参数标签

<c:param>标签只用于为其他标签提供参数信息,它与<c:import>、<c:redirect>和<c:url>标签组合可以实现动态定制参数,从而使标签可以完成更复杂的程序应用。其语法格式如下:

<c:param name="paramName" value="paramValue" />

参数说明:

name:用于指定参数名,可以引用EL。如果参数名为null或是空,该标签将不起任何作用。

value:用于指定参数值,可以引用EL。如果参数值为null,该标签作为空值处理。

 

使用示例:(应用<c:redirect>和<c:param>标签实现重定向网页并传递参数)

index.jsp页面:在该页面中通过<c:redirect>标签定义重定向页面,并通过<c:param>标签定义重定向参数。

<%@ 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>重定向页面并传递参数</title>
</head>
<body>
	<c:redirect url="main.jsp">
		<c:param name="user" value="zhangsan" />
	</c:redirect>
</body>
</html>

main.jsp页面:通过EL显示传递的参数user。

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示结果</title>
</head>
<body>
	[${param.user }]您好,欢迎访问我公司网站
</body>
</html>

 

流程控制标签

流程控制在程序中会根据不同的条件去执行不同的代码来产生不同的运行结果,使用流程控制可以处理程序中的任何可能发生的事情。在JSTL中包含<c:if>、<c:choose>、<c:when>和<c:otherwise>4种流程控制标签。

<c:if>条件判断标签

<c:if>条件判断标签可以根据不同的条件处理不同的业务。它与Java语言中的if语句类似,只不过该语句没有else标签。<c:if>标签有以下两种语法格式:

语法1:判断条件表达式,并将条件表达式的判断结果保存在var属性指定的变量中,而这个变量存在于scope属性所指定的范围中。

<c:if test="condition" var="name" [scope="范围"] />

语法2:该语法格式不但可以将test属性的判断结果保存在指定范围的变量中,还可以根据条件的判断结果去执行标签体。标签体可以是JSP页面能够使用的任何元素(例如,HTML标记、Java代码或者嵌入其它JSP标签)。

<c:if test="condition" var="name" [scope="范围"] >
	标签体
</c:if>

参数说明:

test:必选属性,用于指定条件表达式,可以使用EL。

var:可选属性,用于指定变量名,该变量用于保存test属性的判断结果。如果该变量不存在就创建它。

scope:用于指定变量的有效范围,默认值为page,可选值有page、request、session和application。

 

使用示例:根据是否登录,显示不同的内容。

index.jsp页面:判断result的值是否为空,为空显示表单内容,不为空显示欢迎信息。

<%@ 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>根据是否登录显示不同的内容</title>
</head>
<body>
	<%
		request.setCharacterEncoding("utf-8");
	%>
	<c:if var="result" test="${empty param.username }">
		<form name="form1" method="post" action="">
			用户名:<input name="username" type="text" id="username"> <br>
			<br> <input type="submit" name="Submit" value="登录">
		</form>
	</c:if>
	<c:if test="${!result }">
		[${param.username }]欢迎访问本公司网站!!!
	</c:if>
</body>
</html>

  

<c:choose>条件选择标签

 <c:choose>标签可以根据不同的条件完成指定的业务逻辑,如果没有符合的条件就执行默认条件的业务逻辑。<c:choose>标签只能作为<c:when>和<c:otherwise>标签的父标签,而要实现条件选择逻辑,可以在<c:choose>标签中嵌套其子标签来完成。其语法格式如下:

<c:choose>
	标签体<!-- 由<c:when>标签和<c:otherwise>标签组成 -->
</c:choose>

<c:choose>标签没有相关属性,它只是作为<c:when>和<c:otherwise>标签的父标签来使用,并且在<c:choose>标签中,除了空白字符外,只能包括<c:when>和<c:otherwise>标签。

在一个<c:choose>标签中可以包含多个<c:when>标签来处理不同条件的业务逻辑,但是只能有一个<c:otherwise>标签来处理默认条件的业务逻辑。

 

<c:when>条件测试标签

<c:when>条件测试标签是<c:choose>标签的子标签,它根据不同的条件执行相应的业务逻辑,可以存在多个<c:when>标签来处理不同的业务逻辑。其语法格式如下:

<c:choose>
	<c:when test="condition">
		标签体
	</c:when>
</c:choose>

参数说明:

test:条件表达式,这是<c:when>标签必须定义的属性,它可以引用EL表达式。

使用示例:实现分时问候

index.jsp页面:应用<c:when>标签进行分时判断,并显示不同的问候信息。

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>实现分时问候</title>
</head>
<body>
	<!-- 获取小时并保存到变量中 -->
	<c:set var="hours">
		<%=new java.util.Date().getHours()%>
	</c:set>
	<!-- 获取分钟并保存到变量中 -->
	<c:set var="second">
		<%=new java.util.Date().getMinutes()%>
	</c:set>
	<c:choose>
		<c:when test="${hours >= 1 && hours < 6 }">早上好!</c:when>
		<c:when test="${hours >=6 && hours < 11 }">上午好!</c:when>
		<c:when test="${hours >=11 && hours < 17 }">下午好!</c:when>
		<c:when test="${hours >= 17 && hours < 24 }">晚上好!</c:when>
	</c:choose>
	现在时间是:${hours }:${second}
</body>
</html>

  

<c:otherwise>其他条件标签

<c:otherwise>标签也是<c:choose>标签的子标签,用于定义<c:choose>标签中的默认条件处理逻辑,如果没有任何一个结果满足<c:when>标签指定的条件,将会执行这个标签体中定义的逻辑代码。在<c:choose>标签范围内只能存在一个该标签的定义。其语法格式如下:

<c:choose>
	<c:when test="condition">
		标签体
	</c:when>
	......
	<c:otherwise>
		标签体
	</c:otherwise>
</c:choose>

 

使用示例:幸运大抽奖

index.jsp页面:抽取幸运数字保存到变量中,根据幸运数字显示不同的中奖信息。

<%@page import="java.util.Random"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>幸运大抽奖</title>
</head>
<body>
	<%
		Random md = new Random();
	%>
	<!-- 将抽取的幸运数字保存到变量中 -->
	<c:set var="luck">
		<%=md.nextInt(10)%>
	</c:set>
	<c:out value="${luck }"></c:out>
	<c:choose>
		<c:when test="${luck==1 }">恭喜你,中了一等奖</c:when>
		<c:when test="${luck==2 }">恭喜你,中了二等奖</c:when>
		<c:when test="${luck==3 }">恭喜你,中了三等奖</c:when>
		<c:otherwise>谢谢您的参与!</c:otherwise>
	</c:choose>
</body>
</html>

 

 

循环标签

循环是程序算法中的重要环节,有很多著名的算法都需要在循环中完成,例如递归算法、查询算法和排序算法都需要在循环中完成。JSTL标签库中包含<c:forEach>和<c:forTokens>两个标签。

<c:forEach>循环标签

<c:forEach>循环标签可以根据循环条件,遍历数据和集合类中的所有或部分数据。使用JSTL的<c:forEach>循环标签代替Java代码显示这些数据不但可以解决JSP页面混乱的问题,而且也提高了代码的可维护性。其语法格式有以下两种:

语法1:集合成员迭代

<c:forEach items="data" [var="name" ] [begin="start" ] [end="finish"] [step="step" ] [varStatus="statusName"]>
	标签体
</c:forEach>

说明:在该语法中,items属性是必选属性,通常使用EL指定,其他属性均为可选属性。

语法2:数字索引迭代

<c:forEach begin="start" end="finish" [var="name"] [varStatus="statusName" ] [step="step"]>
	标签体
</c:forEach>

说明:在该语法中,begin和end属性是必选属性,其他属性均为可选属性。

参数说明:

items:用于指定被循环遍历的对象,多用于数组与集合类。该属性的属性值可以是数组、集合类、字符串和枚举类型,并且可以通过EL进行指定。

var:用于指定循环体的变量名,该变量用于储存items指定的对象的成员。

begin:用于指定循环的起始位置,如果没有指定,则从集合的第一个值开始迭代。可以使用EL。

end:用于指定循环的终止位置,如果没有指定,则一直迭代到集合的最后一位。可以使用EL。

step:用于指定循环的步长,可以使用EL。

varStatus:用于指定循环的状态变量,该属性还有4个状态属性,如下表所示。

变     量 类     型 描     述
index Int 当前循环的索引值,从0开始
count Int 当前循环的循环计数,从1开始
first Boolean 是否为第一次循环
last Boolean 是否为最后一次循环

标签体:可以是JSP页面显示的任何元素。

 

使用示例1:遍历List集合

index.jsp页面:应用<c:forEach>标签遍历List集合中的全部元素,并输出。然后遍历第一个元素以后的元素。

<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>遍历List集合</title>
</head>
<body>
	<%
		List<String> list = new ArrayList<String>();
		list.add("三人行,必有我师焉");
		list.add("学而不思则罔,思而不学则殆");
		list.add("有朋自远方来,不亦说乎");
		request.setAttribute("list", list);
	%>
	<b>遍历List集合的全部元素:</b>
	<br>
	<c:forEach items="${requestScope.list }" var="keyword" varStatus="id">
		${id.index }:${keyword }<br>
	</c:forEach>
	<b>遍历List集合的第一个元素以后的元素:</b>
	<br>
	<c:forEach items="${requestScope.list }" var="keyword" varStatus="id" begin="1">
		${id.index }:${keyword }<br>
	</c:forEach>
</body>
</html>

 

使用示例2:应用<c:forEach>标签输出10以内的全部奇数。

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 使用核心标签库的taglib指令 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>列举10以内的全部奇数</title>
</head>
<body>
	<b>10以内的全部奇数为:</b>
	<br>
	<c:forEach var="i" begin="1" end="10" step="2">
		${i}  
	</c:forEach>
</body>
</html>

  

<c:forTokens>迭代标签

<c:forTokens>迭代标签可以用指定的分隔符将一个字符串分割开,根据分割的数量确定循环的次数。其语法格式如下:

<c:forTokens items="String" delims="char" [var="name" ] [begin="start"] [end="end" ] [step="len" ] [varStatus="statusName"]>
	标签体
</c:forTokens>

参数说明:

items:用于指定要迭代的String对象,该字符串通常由指定的分隔符分隔。

delims:用于指定分隔字符串的分隔符,可以同时有多个分隔符。

var:用于指定变量名,该变量中保存了分隔后的字符串。

begin:用于指定迭代开始的位置,索引值从0开始。

end:用于指定迭代的结束位置。

step:用于指定迭代的步长,默认步长为1。

varStatus:用于指定循环的状态变量,同<c:forEach>标签一样,该属性也有4个状态属性。

标签体:可以是JSP页面显示的任何元素

使用示例:应用<c:forTokens>标签分隔字符串。

index.jsp页面:应用<c:forTokens>标签迭代输出按指定分隔符分隔的字符串。

<%@ 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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>分隔字符串</title>
</head>
<body>
	<c:set var="sourceStr" value="张三,李四、王五;赵六。" />
	<b>原字符串:</b>
	<c:out value="${sourceStr}" />
	<br>
	<b>分隔后的字符串为:</b>
	<br>
	<c:forTokens items="${sourceStr}" delims=",、;。" var="item">
		${item}<br>
	</c:forTokens>
</body>
</html>

 

推荐阅读