标签: jstl学习笔记 |
JSP 标准标记库(JSP Standard Tag Library,JSTL )
流控制
由于可以用 EL 替代 JSP 表达式来指定动态属性值,因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 JSP 页面中维护问题的主要原因,所以 JSTL 的主要优点就在于提供了这样简单(且标准)的替代方法。core 库提供了几个定制操作来管理流控制,其形式有 迭代、 条件化和异常处理。
在 Web 应用程序环境中,迭代主要用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是 <c:forEach>
定制标记。该标记支持两种不同样式的迭代:整数范围上的迭代(类似 Java 语言的 for
语句)和集合上的迭代(类似 Java 语言的 Iterator
和 Enumeration
类)。
<c:forEach var="m" begin="0" end="10" step="2" varStatus="status"> </th> |
当出现 step
时,它也必须是整数值。它指定每次迭代后索引的增量。这样,迭代索引从 begin
属性的值开始,以 step
属性的值为增量进行递增,在迭代索引超过 end
属性的值时停止迭代。注:如果省略了 step
属性,那么步长缺省为 1。
如果指定了 var
属性,那么将会创建一个带有指定名称的并限定了作用域的变量,并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 ― 只可以在 <c:forEach>
标记体内对其进行访问。
<c:forEach var="item" items="${list}" varStatus="status"> <tr> <td> <c:out value="${status.count}" /> <td> <c:out value="${item.name}" /> <td> <c:out value="${item.password}" /> </tr> </c:forEach> |
其中items是存储所要的集合,var是变量,用来存放集合里面的每一个对象。
<c:forEach>
标记支持 Java 平台所提供的所有标准集合类型。此外,使用该操作来迭代数组(包括基本类型数组)中的元素。不论是对整数还是对集合进行迭代, <c:forEach>
剩余的属性 varStatus
所起的作用相同。和 var
属性一样, varStatus
用于创建限定了作用域的变量。
特性 | Getter | 描述 |
current | getCurrent() | 当前这次迭代的(集合中的)项 |
index | getIndex() | 当前这次迭代从 0 开始的迭代索引 |
count | getCount() | 当前这次迭代从 1 开始的迭代计数 |
first | isFirst() | 用来表明当前这轮迭代是否为第一次迭代的标志 |
last | isLast() | 用来表明当前这轮迭代是否为最后一次迭代的标志 |
begin | getBegin() | begin 属性值 |
end | getEnd() | end 属性值 |
step | getStep() | step 属性值 |
<c:forEach var="i" begin="100" end="200" step="50" varStatus="status">
begin:<c:out value="${status.begin}">begin</c:out>
end:<c:out value="${status.end}">end</c:out>
step:<c:out value="${status.step}">step</c:out>
isLast:<c:out value="${status.last}"></c:out>
isFirst:<c:out value="${status.first}"></c:out>
currentCount:<c:out value="${status.count}"></c:out>
<c:out value="${i}" />
<c:if test="${status.last}">
<br>There are <c:out value="${status.count}" /> numbers in the list.
</c:if>
</br>
</c:forEach>
<c:forTokens>
:JSTL 的这个定制操作与 Java 语言的 StringTokenizer
类的作用相似。下面程序中显示的 <c:forTokens>
标记除了比 <c:forEach>
的面向集合版本多一个属性之外,其它属性都相同。对于 <c:forTokens>
而言,通过 items
属性指定要标记化的字符串,而通过 delims
属性提供用于生成标记的一组定界符。和 <c:forEach>
的情形一样,可以使用 begin
、 end
和 step
属性将要处理的标记限定为那些与相应索引值相匹配的标记。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>JSTL: Iterator Support -- forTokens Example</title> </head> <body bgcolor="#FFFFFF"> <h3><forTokens></h3> <h4>String with '|' delimiter</h4> <c:forTokens var="token" items="bleu,blanc,rouge|vert,jaune|blanc,rouge" delims="|"> <c:out value="${token}"/> " </c:forTokens> <h4>String with '|' and ',' delimiters</h4> <c:forTokens var="token" items="bleu,blanc,rouge|vert,jaune|blanc,rouge" delims="|,"> <c:out value="${token}"/> " </c:forTokens> </body> </html>
core
库提供了两个不同的条件化标记 ―<c:if>
和<c:choose>
― 来实现这些功能。
<c:if>
仅当对表达式求出的值为
true 时,它才处理标记的主体内容。如果求出的值不为true
,就忽略该标记的主体内容。其中的程序在上面的源码中都给出了<C:if>
<c:choose>
标记来表示,至少要有一个
每个要测试的条件都由相应的
<c:when><c:when>
标记。只会处理第一个其test
值为true
的<c:when>
标记体内的内容。如果没有一个<c:when>
测试返回true
,那么会处理<c:otherwise>
标记的主体内容。
<c:choose> <c:when test="${pageContext.request.scheme eq 'http'}"> This is an Web session. </c:when> <c:when test="${pageContext.request.scheme eq 'https'}"> This is secure. </c:when> <c:otherwise> microamrs
</c:otherwise> </c:choose>
<c:catch>
它允许在 JSP 页面内进行初级的异常处理。如果产生了一个异常并且已经指定了
<c:catch> 标记的可选属性var
,那么会将异常赋给指定的变量,这使得能够在页面自身内部进行定制错误处理。
URL操作
JSTL
core 库中的其余标记主要是关于 URL。这些标记中的第一个被适当地命名为<c:url>
标记,用于生成 URL。
在
<c:url>中,value属性用来指定基本 URL,然后在必要时标记对其进行转换。如果这个基本 URL 以一个斜杠开始,那么会在它前面加上 servlet 的上下文名称。可以使用context
属性提供显式的上下文名称。如果省略该属性,那么就使用当前 servlet 上下文的名称。URL 重写是由<c:url>
操作自动执行的。如果 JSP 容器检测到一个存储用户当前会话标识的 cookie,那么就不必进行重写。但是,如果不存在这样的 cookie,那么<c:url>
生成的所有 URL 都会被重写以编码会话标识。
操作自动执行的。如果 JSP 容器检测到一个存储用户当前会话标识的 cookie,那么就不必进行重写。但是,如果不存在这样的 cookie,那么
URL 重写是由
<c:url><c:url>
生成的所有 URL 都会被重写以编码会话标识。
如:
<a href="<c:url value='/content/sitemap.jsp'/>">MARS</a>
当然后面还可以指定context属性,用来解析url的路劲。
生成带请求参数的 URL
<c:param>
标记指定了任何请求参数,那么将会使用 HTTP GET 请求的标准表示法将它们的名称和值添加到生成的 URL 后面。此外,还进行 URL 编码:为了生成有效的 URL,将对这些参数的名称或值中出现的任何字符适当地进行转换。
<c:url value="/content/search.jsp"> <c:param name="keyword" value="${searchTerm}"/> <c:param name="month" value="07/2007"/> </c:url>
生成的URL为:
/mars/content/search.jsp?keyword=foo+bar&month=02%2F2003