`
java-mans
  • 浏览: 11468373 次
文章分类
社区版块
存档分类
最新评论

JSTL 学习2 - 2

 
阅读更多

流控制

由于可以用 EL 替代 JSP 表达式来指定动态属性值,因此页面创作人员无需使用脚本编制元素。因为脚本编制元素可能是引起 JSP 页面中维护问题的主要原因,所以 JSTL 的主要优点就在于提供了这样简单(且标准)的替代方法。

EL 从 JSP 容器检索数据,遍历对象层次结构,然后对结果执行简单的操作。不过,除了访问和操作数据之外,JSP 脚本编制元素的另一个常见用法是流控制。尤其是,页面创作人员常借助 scriptlet 来实现迭代或条件内容。然而,因为这样的操作超出了 EL 的能力,所以 core 库提供了几个定制操作来管理流控制,其形式有 迭代条件化异常处理

迭代

在 Web 应用程序环境中,迭代主要用于访存和显示数据集,通常是以列表或表中的一系列行的形式显示。实现迭代内容的主要 JSTL 操作是 <c:forEach> 定制标记。该标记支持两种不同样式的迭代:整数范围上的迭代(类似 Java 语言的 for 语句)和集合上的迭代(类似 Java 语言的 IteratorEnumeration 类)。

进行整数范围迭代用到了清单 1 中所示的 <c:forEach> 标记的语法。 beginend 属性要么是静态整数值,要么是可以得出整数值的表达式。它们分别指定迭代索引的初始值以及迭代索引的终止值。当使用 <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 中所示,上面的示例代码生成了一张表,显示前五个偶数及其平方。这是通过将 beginstep 属性值指定为 2,而将 end 属性值指定为 10 实现的。此外,用 var 属性创建用于存储索引值的限定了作用域的变量, <c:forEach> 标记体内引用了该变量。尤其是,使用了一对 <c:out> 操作来显示索引及其平方,其中索引的平方是使用一个简单的表达式计算得来的。


图 3. 清单 2 的输出
清单 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 查询所获得的行

可以使用 beginendstep 属性来限定在迭代中包含集合中哪些元素。和通过 <c:forEach> 进行数字迭代的情形一样,在迭代集合中的元素时同样要维护一个迭代索引。 <c:forEach> 标记实际上只处理那些与索引值相对应的元素,这些索引值与指定的 beginendstep 值相匹配。

清单 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 的输出
清单 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 的输出
清单 5 的输出

<c:forEach> 以外, core 库还提供了另一个迭代标记: <c:forTokens> 。JSTL 的这个定制操作与 Java 语言的 StringTokenizer 类的作用相似。清单 6 中显示的 <c:forTokens> 标记除了比 <c:forEach> 的面向集合版本多一个属性之外,其它属性都相同。对于 <c:forTokens> 而言,通过 items 属性指定要标记化的字符串,而通过 delims 属性提供用于生成标记的一组定界符。和 <c:forEach> 的情形一样,可以使用 beginendstep 属性将要处理的标记限定为那些与相应索引值相匹配的标记。


清单 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> 可以通过其 varscope 属性(它们所起的作用和在 <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 的输出

如清单 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-1_1-mr2-spec

    让你看到jstl内幕,他是如何实现的,你也可以做到。 好东西,多分享

    Struts2学习案例--------入门篇

    输出Hello World 使用到struts2标签和jstl表达式 2、 URL:http://localhost:8080/struts100515 输入用户名XXX ------&gt; 提交 ,显示 你好 XXX 使用ONGL表达式 3、 URL:...

    使用Java集合模拟JSTL包中的Result接口功能

    学习对象:所有学习Java方向的学生。 环境:windows professional xp, JDK 6.0, MyEclipse 5.5 使用步骤: 1. 下载解压之后,使用MyEclipse 5.5导入工程 2. 把数据库的url指向你机器上的数据库 3. 修改TestBaseDAO....

    Struts1-2和JSTL帮助文档及快书入门图书

    Struts1-2 和JSTL 帮助文档以及Struts入门的图书,可以轻松学习Struts,及Struts和Jstl标签库

    EL表达式和Jstl.docx

    El表达式与Jstl 标签库学习,EL表达式语法结构:El 表达式的作用,如何使用El表达式; 2.Jstl 标签库的作用3.使用JSTL标签库 :

    struts2、JSTL、Spring、JS、JSP标签大全

    不能保证内容的正确性,只供参考学习,可查询基本的标签。

    JSTL详细标签库介绍

    &lt;BR&gt;Java使用和C++类似的异常处理&lt;BR&gt;1、处理错误的方法有很多流行方法&lt;BR&gt;2、一般方法是把程序处理代码段分散到系统代码中,在可能发生错误的地方处理错误优点:便于程序员能够条理的看到程序中异常的处理缺点:...

    lerx2-utf8-v2-beta2-20121214.rar

    lerx2_utf8_v2_beta2_20121214.rar 是一个压缩文件,其中包含了计算机专业的 JSP(JavaServer Pages)源码资料包。这个资料包可能涵盖了一系列与 JSP 相关的教程、示例代码、项目模板以及其他有助于学习和实践JSP...

    基于jsp+Servlet+jstl写的考勤系统源码.zip

    2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于jsp+...

    javaweb 基于jstl的web项目管理系统

    2, 管理员: 工程管理;浏览工程项目 查找工程项目 添加工程项目 修改工程项目. 删除工程项目 职工管理;浏览职工信息 检索职工信息 添加职工 删除职工 修改职工 职务管理;浏览职务 添加职务 删除职务 ...

    Java学习笔记-个人整理的

    \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}{...

    JSP2.0技术手册pdf(带示例源码).zip

    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 的...

    Java程序员最新简历模板,熟悉Struts2,Hibernate,Spring等框架,精通Servlet,JSP,JSTL等

    近两年来一直从事JavaWeb开发,熟悉Struts2,Hibernate,Spring等框架,精通Servlet,JSP,JSTL,EL,Ajax等技术。 我具有较强的自学能力和逻辑思维能力,工作积极主动,对新技术有强烈的学习热情。对JavaWeb开发整体流程有...

    JSP_Servlet学习笔记(第2版).pdf

    《JSP & Servlet学习笔记(第2版)》涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 《JSP & Servlet学习笔记(第2版)》以“微博”项目贯穿全书,将JSP & Servlet技术应用...

    超全面javaweb教程28天第11,12天 2 介绍jstl标签库,以及out和set标签

    超全面javaweb教程28天第11,12天_2_介绍jstl标签库,以及out和set标签

    Struts 2.1.8_学习源码

    Struts2默认支持OGNL、JSTL、Groovy和Velcity表达式 Struts2_04ActionResultType : Struts2关于Action跳转类型的应用 对各种不同的跳转类型使用的实例 Struts2_05Interceptor : Struts2拦截器的使用 Struts2_06...

    java Tomcat 和前端用到的包

    2. 因为是刚学习servlet ,所以将Tomcat 升级到最新版本10,但这个版本遇到了很多坑,有很多还没有适配完成,后面降级回来了Tomcat 9 上传到的包目前有以下,后续慢慢进行补充,里面有包括Tomcat 10 jstl jar

    JSP基础与案例开发详解随书源码2-10章

    第2章:网页布局与修饰,为前端开发做一些必要的知识储备。 第3章:JDBC应用,这是JSP开发中与Java联系最为紧密的知识点。 第4章:Serlet应用,这是JSP开发中最核心、最基础的部分。 第5章:JSP应用,这是JSP开发中...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    基于jsp+Servlet+jstl写的考勤系统.zip

    2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...

Global site tag (gtag.js) - Google Analytics