JSTL条件标签

条件化

对于包含动态内容的 Web 页面,您可能希望不同类别的用户看到不同形式的内容。例如,在我们的 Weblog 中,访问者应该能够阅读各项,也许还应该能够提交反馈,但只有经过授权的用户才能公布新项,或编辑已有内容。

在同一个 JSP 页面内实现这样的功能,然后使用条件逻辑来根据每条请求控制所显示的内容,这样做常常能够改善实用性和软件维护。 core 库提供了两个不同的条件化标记 ― <c:if><c:choose> ― 来实现这些功能。

<c:if> 是这两个操作中较简单的一个,它简单地对单个测试表达式进行求值,接下来,仅当对表达式求出的值为 true 时,它才处理标记的主体内容。如果求出的值不为 true ,就忽略该标记的主体内容。如清单 7 所示, <c:if> 可以通过其 varscope 属性(它们所起的作用和在 <c:set> 中所起的作用一样)选择将测试结果赋给限定了作用域的变量。当测试代价非常高昂时,这种能力尤为有用:可以将结果高速缓存在限定了作用域的变量中,然后在随后对 <c:if> 或其它 JSTL 标记的调用中检索该结果。


清单 7. <c:if> 条件操作的语法

清单 8 显示了与 <c:forEach> 标记的 LoopTagStatus 对象的 first 特性一起使用的 <c:if> 。如图 6 中所示,在这种情况下,只在 Weblog 项的第一项上显示这组项的创建日期,而不在任何其它项前面重复该日期。


清单 8. 使用 <c:if> 来为 Weblog 项显示日期


图 6. 清单 8 的输出
清单 8 的输出

如清单 8 所示, <c:if> 标记为条件化内容的一些简单情形提供了一种非常简洁的表示法。对于需要进行互斥测试来确定应该显示什么内容的情况下,JSTL core 库还提供了 <c:choose> 操作。清单 9 中显示了 <c:choose> 的语法。


清单 9. <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> 进行内容条件化

阅读更多
个人分类: J2EE
上一篇JSTL循环标签
下一篇JSTL URL标签
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭