流控制
由于可以用 EL 替代 JSP 表达式来指定动态属性值,因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 JSP
页面中维护问题的主要原因,所以 JSTL 的主要优点就在于提供了这样简单(且标准)的替代方法。
EL 从 JSP 容器检索数据,遍历对象层次结构,然后对结果执行简单的操作。不过,除了访问和操作数据之外,JSP
脚本编制元素的另一个常见用法是流控制。尤其是,页面创作人员常借助 scriptlet 来实现迭代或条件内容。然而,因为这样的操作超出了 EL 的能力,所以
core
库提供了几个定制操作来管理流控制,其形式有 迭代
、 条件化
和 异常处理
。
迭代
在 Web 应用程序环境中,迭代主要用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是
<c:forEach>
定制标记。该标记支持两种不同样式的迭代:整数范围上的迭代(类似 Java 语言的
for
语句)和集合上的迭代(类似 Java 语言的 Iterator
和
Enumeration
类)。
进行整数范围迭代用到了清单 1 中所示的 <c:forEach>
标记的语法。 begin
和 end
属性要么是静态整数值,要么是可以得出整数值的表达式。它们分别指定迭代索引的初始值以及迭代索引的终止值。当使用
<c:forEach>
在整数范围内进行迭代时,这两个属性是必需的,而其它所有属性都是可选的。
清单 1. 通过 <c:forEach> 操作进行数字迭代的语法
<c:forEach var=" name
" varStatus=" name
"
begin=" expression
" end=" expression
" step=" expression
">
body content
</c:forEach>
|
当出现 step
时,它也必须是整数值。它指定每次迭代后索引的增量。这样,迭代索引从 begin
属性的值开始,以 step
属性的值为增量进行递增,在迭代索引超过 end
属性的值时停止迭代。注:如果省略了 step
属性,那么步长缺省为 1。
如果指定了 var
属性,那么将会创建一个带有指定名称的并限定了作用域的变量,并将每次迭代的当前索引值赋给该变量。这一限定了作用域的变量具有嵌套式可视性 ― 只可以在
<c:forEach>
标记体内对其进行访问。(我们很快将讨论可选属性 varStatus
的用法。)清单 2 显示了对一组固定整数值进行迭代的 <c:forEach>
操作示例。
清单 2. 使用 <c:forEach> 标记来生成表列数据,这些数据对应于某一范围内的数值
<table>
<tr><th>Value</th>
<th>Square</th></tr>
<c:forEach var="x" begin="0" end="10" step="2">
<tr><td><c:out value="${x}"/></td>
<td><c:out value="${x * x}"/></td></tr>
</c:forEach>
</table>
|
如图 3 中所示,上面的示例代码生成了一张表,显示前五个偶数及其平方。这是通过将 begin
和
step
属性值指定为 2,而将 end
属性值指定为 10 实现的。此外,用
var
属性创建用于存储索引值的限定了作用域的变量, <c:forEach>
标记体内引用了该变量。尤其是,使用了一对 <c:out>
操作来显示索引及其平方,其中索引的平方是使用一个简单的表达式计算得来的。
图 3. 清单 2 的输出
在对集合的成员进行迭代时,用到了 <c:forEach>
标记的另一个属性: items
属性,清单 3 中显示了该属性。当使用这种形式的 <c:forEach>
标记时, items
属性是唯一必需的属性。 items
属性的值应该是一个集合,对该集合的成员进行迭代,通常使用 EL 表达式指定值。如果变量名称是通过
<c:forEach>
标记的 item
属性指定的,那么对于每次迭代该已命名变量都将被绑定到集合后续元素上。
清单 3. 通过
<c:forEach> 操作对集合进行迭代的语法
<c:forEach var=" name
" items=" expression
" varStatus=" name
"
begin=" expression
" end=" expression
" step=" expression
">
body content
</c:forEach>
|
<c:forEach>
标记支持 Java
平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。表 1 列出了 items
属性所支持的所有值。正如表的最后一行所指出的那样,JSTL 定义了它自己的接口
javax.servlet.jsp.jstl.sql.Result
,用来迭代 SQL
查询的结果。(我们将在本系列后面的文章中详细讨论这一功能。)
表 1. <c:forEach> 标记的
items
属性所支持的集合
items
的值
|
所产生的 item
值
|
java.util.Collection
|
调用 iterator()
所获得的元素 |
java.util.Map
|
java.util.Map.Entry
的实例 |
java.util.Iterator
|
迭代器元素 |
java.util.Enumeration
|
枚举元素 |
Object
实例数组 |
数组元素 |
基本类型值数组 |
经过包装的数组元素 |
用逗号定界的 String
|
子字符串 |
javax.servlet.jsp.jstl.sql.Result
|
SQL 查询所获得的行 |
可以使用 begin
、 end
和 step
属性来限定在迭代中包含集合中哪些元素。和通过 <c:forEach>
进行数字迭代的情形一样,在迭代集合中的元素时同样要维护一个迭代索引。 <c:forEach>
标记实际上只处理那些与索引值相对应的元素,这些索引值与指定的 begin
、 end
和
step
值相匹配。
清单 4 显示了用来迭代集合的 <c:forEach>
标记。对于该 JSP 代码段,
entryList
这一限定了作用域的变量被设置成了 Entry
对象列表(确切的说,
ArrayList
)。 <c:forEach>
标记依次处理列表中的每个元素,将其赋给一个限定了作用域的变量 blogEntry
,然后生成两个表行 ― 一个用于 Weblog 项的
title
,另一个则用于该项 text
。这些特性是通过一对带有相应 EL 表达式的
<c:out>
操作从 blogEntry
变量检索得到的。注:由于 Weblog
项的标题和文本都可能包含 HTML 标记,因此这两个 <c:out>
标记的 escapeXml
属性都被设置成了 false。图 4 显示了结果。
清单 4. 使用 <c:forEach>
标记显示表示给定日期的 Weblog 项
<table>
<c:forEach items="${entryList}" var="blogEntry">
<tr><td align="left" class="blogTitle">
<c:out value="${blogEntry.title}" escapeXml="false"/>
</td></tr>
<tr><td align="left" class="blogText">
<c:out value="${blogEntry.text}" escapeXml="false"/>
</td></tr>
</c:forEach>
</table>
|
图 4. 清单 4 的输出
不论是对整数还是对集合进行迭代, <c:forEach>
剩余的属性 varStatus
所起的作用相同。和 var
属性一样, varStatus
用于创建限定了作用域的变量。不过,由
varStatus
属性命名的变量并不存储当前索引值或当前元素,而是赋予
javax.servlet.jsp.jstl.core.LoopTagStatus
类的实例。该类定义了一组特性,它们描述了迭代的当前状态,表 2 中列出了这些特性。
表 2. LoopTagStatus 对象的特性
特性
|
Getter
|
描述
|
current |
getCurrent()
|
当前这次迭代的(集合中的)项 |
index |
getIndex()
|
当前这次迭代从 0 开始的迭代索引 |
count |
getCount()
|
当前这次迭代从 1 开始的迭代计数 |
first |
isFirst()
|
用来表明当前这轮迭代是否为第一次迭代的标志 |
last |
isLast()
|
用来表明当前这轮迭代是否为最后一次迭代的标志 |
begin |
getBegin()
|
begin
属性值 |
end |
getEnd()
|
end
属性值 |
step |
getStep()
|
step
属性值 |
清单 5 显示了关于如何使用 varStatus
属性的一个示例。这个示例修改了清单 4 中的代码,将 Weblog
项的编号添加到显示 Weblog 标题(title)的表行。它是通过为 varStatus
属性指定一个值,然后访问所生成的限定了作用域的变量的 count
特性来实现这一点的。结果显示在图 5 中。
清单 5. 使用 varStatus 属性来显示 Weblog 项的数目
<table>
<c:forEach items=
"${entryList}" var="blogEntry" varStatus="status">
<tr><td align="left" class="blogTitle">
<c:out value="${status.count}"/>.
<c:out value="${blogEntry.title}" escapeXml="false"/>
</td></tr>
<tr><td align="left" class="blogText">
<c:out value="${blogEntry.text}" escapeXml="false"/>
</td></tr>
</c:forEach>
</table>
|
图 5. 清单 5 的输出
除 <c:forEach>
以外, core
库还提供了另一个迭代标记:
<c:forTokens>
。JSTL 的这个定制操作与 Java 语言的
StringTokenizer
类的作用相似。清单 6 中显示的 <c:forTokens>
标记除了比 <c:forEach>
的面向集合版本多一个属性之外,其它属性都相同。对于
<c:forTokens>
而言,通过 items
属性指定要标记化的字符串,而通过
delims
属性提供用于生成标记的一组定界符。和 <c:forEach>
的情形一样,可以使用
begin
、 end
和 step
属性将要处理的标记限定为那些与相应索引值相匹配的标记。
清单 6. 使用
<c:forTokens> 操作来迭代字符串标记的语法
<c:forTokens var=" name
" items=" expression
"
delims=" expression
" varStatus=" name
"
begin=" expression
" end=" expression
" step=" expression
">
body content
</c:forTokens>
|
条件化
对于包含动态内容的 Web 页面,您可能希望不同类别的用户看到不同形式的内容。例如,在我们的 Weblog
中,访问者应该能够阅读各项,也许还应该能够提交反馈,但只有经过授权的用户才能公布新项,或编辑已有内容。
在同一个 JSP 页面内实现这样的功能,然后使用条件逻辑来根据每条请求控制所显示的内容,这样做常常能够改善实用性和软件维护。
core
库提供了两个不同的条件化标记 ― <c:if>
和
<c:choose>
― 来实现这些功能。
<c:if>
是这两个操作中较简单的一个,它简单地对单个测试表达式进行求值,接下来,仅当对表达式求出的值为
true
时,它才处理标记的主体内容。如果求出的值不为 true
,就忽略该标记的主体内容。如清单 7
所示, <c:if>
可以通过其 var
和 scope
属性(它们所起的作用和在 <c:set>
中所起的作用一样)选择将测试结果赋给限定了作用域的变量。当测试代价非常高昂时,这种能力尤为有用:可以将结果高速缓存在限定了作用域的变量中,然后在随后对
<c:if>
或其它 JSTL 标记的调用中检索该结果。
清单 7.
<c:if> 条件操作的语法
<c:if test=" expression
" var=" name
" scope=" scope
">
body content
</c:if>
|
清单 8 显示了与 <c:forEach>
标记的 LoopTagStatus
对象的
first
特性一起使用的 <c:if>
。如图 6 中所示,在这种情况下,只在 Weblog
项的第一项上显示这组项的创建日期,而不在任何其它项前面重复该日期。
清单 8. 使用
<c:if> 来为 Weblog 项显示日期
<table>
<c:forEach items=
"${entryList}" var="blogEntry" varStatus="status">
<c:if test="${status.first}">
<tr><td align="left" class="blogDate">
<c:out value="${blogEntry.created}"/>
</td></tr>
</c:if>
<tr><td align="left" class="blogTitle">
<c:out value="${blogEntry.title}" escapeXml="false"/>
</td></tr>
<tr><td align="left" class="blogText">
<c:out value="${blogEntry.text}" escapeXml="false"/>
</td></tr>
</c:forEach>
</table>
|
图 6. 清单 8 的输出
如清单 8 所示, <c:if>
标记为条件化内容的一些简单情形提供了一种非常简洁的表示法。对于需要进行互斥测试来确定应该显示什么内容的情况下,JSTL core
库还提供了 <c:choose>
操作。清单 9 中显示了 <c:choose>
的语法。
清单 9. <c:choose> 操作的语法
<c:choose>
<c:when test=" expression
">
body content
</c:when>
...
<c:otherwise>
body content
</c:otherwise>
</c:choose>
|
每个要测试的条件都由相应的 <c:when>
标记来表示,至少要有一个
<c:when>
标记。只会处理第一个其 test
值为 true
的
<c:when>
标记体内的内容。如果没有一个 <c:when>
测试返回
true
,那么会处理 <c:otherwise>
标记的主体内容。注:尽管如此,
<c:otherwise>
标记却是可选的; <c:choose>
标记至多可有一个嵌套的 <c:otherwise>
标记。如果所有 <c:when>
测试都为 false
,而且又没有给出 <c:otherwise>
操作,那么不会处理任何
<c:choose>
标记的主体内容。
清单 10 显示了运用 <c:choose>
标记的示例。在这里,检索请求对象而获得协议信息(通过 EL 的
pageContext
隐式对象),并用简单的字符串比较对协议信息进行测试。根据这些测试的结果,会显示相应的文本消息。
清单 10. 使用 <c:choose> 进行内容条件化
<c:choose>
<c:when test="${pageContext.request.scheme eq 'http'}">
This is an insecure Web session.
</c:when>
<c:when test="${pageContext.request.scheme eq 'https'}">
This is a secure Web session.
</c:when>
<c:otherwise>
You are using an unrecognized Web protocol. How did this happen?!
</c:otherwise>
</c:choose>
|
异常处理
最后一个流控制标记是 <c:catch>
,它允许在 JSP
页面内进行初级的异常处理。更确切地说,在该标记的主体内容中产生的任何异常都会被捕获并被忽略(即,不会调用标准的 JSP
错误处理机制)。然而,如果产生了一个异常并且已经指定了 <c:catch>
标记的可选属性
var
,那么会将异常赋给(具有页面作用域的)指定的变量,这使得能够在页面自身内部进行定制错误处理。清单 11 显示了
<c:catch>
的语法(稍后在 清单 18
中给出一个示例)。
清单 11.
<c:catch> 操作的语法
<c:catch var=" name
">
body content
</c:catch>
|
分享到:
相关推荐
让你看到jstl内幕,他是如何实现的,你也可以做到。 好东西,多分享
输出Hello World 使用到struts2标签和jstl表达式 2、 URL:http://localhost:8080/struts100515 输入用户名XXX ------> 提交 ,显示 你好 XXX 使用ONGL表达式 3、 URL:...
学习对象:所有学习Java方向的学生。 环境:windows professional xp, JDK 6.0, MyEclipse 5.5 使用步骤: 1. 下载解压之后,使用MyEclipse 5.5导入工程 2. 把数据库的url指向你机器上的数据库 3. 修改TestBaseDAO....
Struts1-2 和JSTL 帮助文档以及Struts入门的图书,可以轻松学习Struts,及Struts和Jstl标签库
El表达式与Jstl 标签库学习,EL表达式语法结构:El 表达式的作用,如何使用El表达式; 2.Jstl 标签库的作用3.使用JSTL标签库 :
不能保证内容的正确性,只供参考学习,可查询基本的标签。
<BR>Java使用和C++类似的异常处理<BR>1、处理错误的方法有很多流行方法<BR>2、一般方法是把程序处理代码段分散到系统代码中,在可能发生错误的地方处理错误优点:便于程序员能够条理的看到程序中异常的处理缺点:...
lerx2_utf8_v2_beta2_20121214.rar 是一个压缩文件,其中包含了计算机专业的 JSP(JavaServer Pages)源码资料包。这个资料包可能涵盖了一系列与 JSP 相关的教程、示例代码、项目模板以及其他有助于学习和实践JSP...
2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于jsp+...
2, 管理员: 工程管理;浏览工程项目 查找工程项目 添加工程项目 修改工程项目. 删除工程项目 职工管理;浏览职工信息 检索职工信息 添加职工 删除职工 修改职工 职务管理;浏览职务 添加职务 删除职务 ...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
2-2 First Servlet Sample Code 2-3 Servlet 的生命周期 2-4 Servlet 范例程序 2-5 Servlet 2.4 的新功能 第三章 JSP 2.0 简介 3-1 JavaServer Pages 技术 3-2 What is JSP 3-3 JSP 与 Servlet 的比较 3-4 JSP 的...
近两年来一直从事JavaWeb开发,熟悉Struts2,Hibernate,Spring等框架,精通Servlet,JSP,JSTL,EL,Ajax等技术。 我具有较强的自学能力和逻辑思维能力,工作积极主动,对新技术有强烈的学习热情。对JavaWeb开发整体流程有...
《JSP & Servlet学习笔记(第2版)》涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 《JSP & Servlet学习笔记(第2版)》以“微博”项目贯穿全书,将JSP & Servlet技术应用...
超全面javaweb教程28天第11,12天_2_介绍jstl标签库,以及out和set标签
Struts2默认支持OGNL、JSTL、Groovy和Velcity表达式 Struts2_04ActionResultType : Struts2关于Action跳转类型的应用 对各种不同的跳转类型使用的实例 Struts2_05Interceptor : Struts2拦截器的使用 Struts2_06...
2. 因为是刚学习servlet ,所以将Tomcat 升级到最新版本10,但这个版本遇到了很多坑,有很多还没有适配完成,后面降级回来了Tomcat 9 上传到的包目前有以下,后续慢慢进行补充,里面有包括Tomcat 10 jstl jar
第2章:网页布局与修饰,为前端开发做一些必要的知识储备。 第3章:JDBC应用,这是JSP开发中与Java联系最为紧密的知识点。 第4章:Serlet应用,这是JSP开发中最核心、最基础的部分。 第5章:JSP应用,这是JSP开发中...
全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...