SP标准模板库(JSTL)是SUN公司发布的一个针对JSP开发的新组件。JSTL允许你使用标签(tags)来进行JSP页面开发,而不是使用多数JSP程序员已经习惯了的scriptlet代码方式开发。
JSTL通常被认为是一种单标签库。但JSTL实际上有4个标签库。这些标签库被概括为如下:
1、核心标签库(core),包含一些Web应用的必要的标签。核心标签库的实例包括循环,表达式赋值和基本输入输出。.
2、格式化/国际化标签库(format),包括被用来解析数据的标签库。这种标签会解析数据,比如日期,不同的场所区域等。
3、数据库标签库(sql),包含被用来访问SQL数据库的标签。这些标签通常仅仅只创建原形(prototype)程序。这个是因为大多数程序不会直接从JSP页面中来处理数据库访问。数据库访问应该被嵌入到能够被JSP页面所访问的EJB中。
4、XML标签库(xml),包含被用来访问XML元素的标签。因为XML广泛使用于Web开发,XML的处理是JSTL的一个重要的特征。
在本文中,我们将仅仅只对核心标签做一个简单介绍。
我们先看看JSTL是如何处理表达式的,JSTL的表达式处理是通过使用EL表达式语言来完成的。
<p>
Your total, including shipping is <c:out var="${total+shipping"/>
</p>
核心标签库:
1.一般标签
在JSTL中,一般标签主要用在输出、设置变量值和错误处理等,这些是JSTL中使用最多的标签
1).<c:out value=”” escapeXml=”true|false” default=”defValue”> 计算一个表达式的值,然后把计算的结果输出到当前的JspWriter对象。调用的结果和Servlet中out.println()语句效果一样,其中value是将要输出的表达式;escapeXml表示将<、> 、&、 ‘、 “等特殊的符号转换成实体代码;default表示如果value的值为空,那么将输出这里的默认值。注意<c:out>可以有Body,这里的Body可以是HTML或者是JSP。例如:<c:out value=”${user.name}”>,(如果要使用表达式,那么这里的JSTL的版本必须是1.1以上)
2).<c:set var=”” value=”” scope=”” target=”” property=””> 这个标签用于在某个范围中使用某个名字设定特定的值,或者设置某个已经存在的JavaBean对象的属性,这其实就相当于<% request.setAttribute(“name”, “value”); %>。其中var表示这个属性的名字,它相当于在标签中定义了一个变量,并且这个变量只能在标签中使用;value表示将要计算的表达式;scope表示属性的有效范围;target表示将要设置属性的对象,它必须是JavaBeans或java.util.Map对象;property表示待设置的Target对象中的属性名字,比如在JavaBean中有个name属性,提供了setUserId方法,那么这里的property就是userId。例如:a. <c:set var=”flag” value=”yes” scope=”request”/> b. <c:set var=”price” scope=”session”>body content</c:set> c. <c:set value=”liky” target=”user” property=”name”/> d. <c:set target=”user” property=”pwd” >body content</c:set>
3).<c:remove var=”flag” scope=”page”> 这个标签用于删除某个变量或者属性。其中scope表示这个参数所在的范围,如果不指定范围,那么将从page,request,session,application中依次搜索这个参数,如果还是没有则不做任何动作;var表示待删除的参数的名字,这个名字可以使在<c:set/>定义,也可以是在someScope.setAttribute(“varName”, “varValue”)中定义,相当于pageContext.removeAttribute(varName, scope);
4).<c:catch var=””> 这个标签用于捕获由嵌套在它里面的标签抛出的异常对象(java.lang.Throwable),相当于<% try {} catch () {} %>。其中var表示标识这个异常的名字,它是一个标签变量。例如:<c:catch var=”error”> <% Integer.parse(“abcd”)%> </c:catch>
2.条件标签
在JSTL中,条件标签能完成条件判断和多个条件选择等功能。
1).<c:if test=”” var=”” scope=””> 用于进行条件判断,如果它的test属性true,那么就计算它的body。其中test表达式的条件,相当于if(test) 中的条件;var表示这个语句的名字;scope表示变量的作用范围。这个标签相当于<% if (test) {body} %>;例如:<c:if test=”8>5” var=”tif” scope=”page”>body</c:if>
2).<c:choose>body</c:choose> 这个标签用于条件选择,它和<c:when>以及<c:otherwise>一起使用。它的条件选择是排斥的,相当于:<% swith i {case 0: break; case 1: break;},也可以完成<% if() else if {} else {} %>这样的多重条件判断语句的功能。注意这里body只能由0个或多个<c:when>子标签,<c:otherwise>标签之前出现;0个或者多个<c:otherwise>子标签。
3).<c:otherwise > 这个标签表示<c:choose>的最后选择。相当于<% swith () {case: break; default: …}中default语句;或者是<% if() else if {} else {} %>这样的语句中的最后的else语句。例如:<c:choose><c:when test=”${count > 10}”><c:set var=”num” value=”10”/></c:when><c:otherwise><c:set var=”num” value=”20”></c:otherwise></c:choose>
3.迭代标签
在JSTL中,迭代标签支持循环提取一个集合中的数据。
1).<c:forEach var=”” items=”” varStatus=”” begin=”” end=”” step=””></c:forEach> 这个标签是我们经常用的用于迭代一个集合的标签,功能十分强大。其中var表示迭代的参数名字,它是标签参数,在其他标签中通过它来引用这个标签中的内容;items表示要迭代的集合,注意这里的集合是指Collection、Arrays、Iterator、Map、String、和Enumeration等这样的表示集合的类;varStatus表示迭代的状态,可以访问迭代自身的信息;begin表示如果指定了items,那么就从items的index[begin]开始迭代,并且items的第一个元素的索引是0;如果没有指定items,那么就从指定的index开始迭代;end表示如果指定了items,那么就在items的index[end]结束迭代;如果没有指定items,那么就在指定的index结束迭代;step表示迭代的步长值,默认为1。相当于<% for(int i=0; i<length; i++) {body} %>语句中的for循环的功能,只是这里更容易使用。例如:<c:forEach var=”user” items=”${users}” > <c:out value=”${user.name}”/><br><c:out value=”${user.pwd}”/><br></c:forEach>
2).<c:forTokens var=”” items=”” varStatus=”” delims=”” begin=”” end=”” step=””></c:forTokens> 这个标签专门用于处理TokenString的迭代,可以在delims中指定一个或多个分隔符(delimiters),其他和<c:forEach>是相似的。例如:<c:set var=”countries” value=”中国;美国;加拿大;英国;日本”<c:forTokens var=”nation” delims=”;” items=”${countries}”><c:out value=”${nation}”/><br></c:forTokens>
4.URL标签
URL标签是指页面导航、页面重定向、资源获得及参数传递等方面的标签。
1).<c:import url=”” context=”” var=”” scope=”” charEncoding=”” varReader=””> 这个标签可以导入一个资源相当于<jsp:include page=””/>。当然也可以将参数传递过去。
<c:import url="login.jsp">
<c:param name="name">liky</c:param>
<c:param name="pass">redhat</c:param>
</c:import>
其中url待导入资源的url,可以是相对路径或者是绝对路径,并且可以导入其他主机上的资源;context表示当使用相对路径访问外部context资源时,context指定了这个资源的名字;var为参数的名字;scope为var参数的作用范围;charEncoding输入资源的字符编码;varReader这个参数的类型为Reader,用于读取资源
<c:import url="source.txt" charEncoding="ISO8859-1" varReader="reader">
<c:out value="${reader}"/>
</c:import>
2).<c:redirect url=”” context=””> 这个标签是用于重定向到另外一个资源。其中url表示待定向资源的URL,相对路径或者绝对路径;context当使用相对路径访问外部context资源时,context制定了这个资源的名字。相当于<% request.sendRedirect(“next.jsp”);%>或者是Servlet中的RequestDispatcher.forward()语句的功能。例如:
<c:redirect url="login.jsp">
<c:param name="name">liky</c:param>
<c:param name="pass" value=”redhat”/>
</c:redirect>
3).<c:url value=”” context=”” var=”” scope=””> 这个标签用于构造URL,主要是重写URL地址。其中value表示URL的值;context表示当使用相对路径访问外部context资源时,context指定了这个资源的名字;var表示标识这个URL的变量;scope表示这个变量作用范围。例如:<c:url var=”footer” value=”footer.jsp” scope=”page”>
4).<c:param name=”” value=””> 这个标签用于在<c:import>、<c:url>、<c:redirect>中添加请求的参数。它和一般的参数标签没有什么区别。其中name表示参数的名字;value参数的值。要注意的是参数的值既可以用value指出,也可以在标签体中指出。例如:同上。
5.一般标签示例
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<jsp:useBean id="user" class="com.bean.UserBean" scope="page" />
<jsp:setProperty name="user" property="name" value="猛牛" />
<jsp:setProperty name="user" property="pwd" value="拴拴你" />
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试标准标签库</title>
</head>
<body>
user.name:<c:out value="${user.name}" escapeXml="true" default="liky" /><br>
user.pwd:<c:out value="${user.pwd}" /><br>
<c:set target="${user}" property="name" value="摆渡" />
<c:out value="${user.name}" escapeXml="true" default="liky" /><br>
<c:set var="flag" scope="page" value="${user.pwd}"/>
flag: <c:out value="${flag}"/><br>
<c:remove var="flag" scope="page"/>
flag: <c:out value="${flag}"/><br>
<c:catch var="error">
<%
Integer.parseInt("abc");
%>
</c:catch>
<c:out value="${error}"/>
</body>
</html>
6.条件标签示例
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试条件标签</title>
</head>
<c:set var="num" value="40" scope="page" />
<c:set var="bgcolor" value="#000000" scope="page" />
<c:if test="${num<50}" var="testCause" scope="page">
<c:out value="${testCause}" />
</c:if>
<c:choose>
<c:when test="${num==10}">
<c:set var="bgcolor" value="red" />
</c:when>
<c:when test="${num==40}">
<c:set var="bgcolor" value="blue" />
</c:when>
<c:otherwise>
<c:set var="bgcolor" value="purple" />
</c:otherwise>
</c:choose>
<body bgColor="${bgcolor }">
</body>
</html>
7.迭代标签
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="com.bean.*,java.util.*"%>
<%
int[] arr = new int[10];
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
pageContext.setAttribute("arr", arr);
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
UserBean user = new UserBean();
user.setName("Guest" + i);
user.setPwd("00" + i);
list.add(user);
}
pageContext.setAttribute("list", list, pageContext.PAGE_SCOPE);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试迭代标签</title>
</head>
<body>
<c:out value="开始迭代数组:" />
<br>
<c:forEach var="ar" items="${arr}">
<c:out value="${ar}" />
<br>
</c:forEach>
<c:out value="开始迭代列表:" />
<br>
<c:forEach var="lst" items="${list}">
<c:out value="${lst.name}" />
<c:out value="${lst.pwd}" />
<br>
</c:forEach>
<br>
</body>
</html>
/*=============== 测试迭代Map===============*/
<%@ page contentType="text/html; charset=GBK" import="java.util.Map"%>
<%@ page import="java.util.HashMap"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
Map map = new HashMap();
map.put("百度", "http://www.bai.com");
map.put("雅虎", "http://www.yahoo.com.cn");
map.put("谷歌", "http://www.google.com");
out.println(map.get("谷歌"));
request.setAttribute("map", map);
%>
<html>
<head>
<title>使用forEach标签迭代Map</title>
</head>
<body>
<table border="1">
<CAPTION><c:out value="输出Map中所有的值:" /></CAPTION>
<c:forEach items="${map}" var="mymap">
<tr>
<td><c:out value="${mymap.key}" /></td>
<td><c:out value="${mymap.value}" /></td>
</tr>
</c:forEach>
</table>
<table border="1">
<CAPTION><c:out value="输出Map中特定的值:" /></CAPTION>
<c:forEach items="${map}" var="mymap">
<tr>
<c:if test="${mymap.key=='谷歌}">
<td><c:out value="${mymap.key}" /></td>
<td><c:out value="${mymap.value}" /></td>
<br>
</c:if>
</tr>
</c:forEach>
</table>
</body>
</html>
8.URL标签示例
/*===========这里测试import标签============*/
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试import标签</title>
</head>
<body>
<!-- 这里是导入一个资源,并且将参数传递过去 -->
<c:import url="login.jsp">
<c:param name="name">liky</c:param>
<c:param name="pass">redhat</c:param>
</c:import>
<!-- 这里是导入一个资源,并且并且读取这个资源 -->
<c:import url="source.txt" charEncoding="ISO8859-1" varReader="reader">
<c:out value="${reader}"/>
</c:import>
</body>
</html>
/*============这里测试redirect标签============*/
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试重定向标签</title>
</head>
<body>
<c:redirect url="login.jsp">
<c:param name="name">liky</c:param>
<c:param name="pass" value="redhat" />
</c:redirect>
</body>
</html>
/*==============这里测试url标签 ===============*/
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试URL标签</title>
</head>
<body>
<c:url value="login.jsp" var="reg" scope="page">
<c:param name="name" value="liky" />
<c:param name="pass" value="wahaha" />
</c:url>
<c:redirect url="${reg}" />
</body>
</html>
参考:http://www.2cto.com/kf/201111/110714.html
http://www.cnblogs.com/programwjy/archive/2010/09/06/1818794.html