Board logo

标题: JSTL 入门 探讨 core(3)条件化 [打印本页]

作者: look_w    时间: 2018-7-15 08:44     标题: JSTL 入门 探讨 core(3)条件化

条件化对于包含动态内容的 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> 条件操作的语法
1
2
3
4
5
6
7
<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 项显示日期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table>
  <c:forEach items=
    "${entryList}" var="blogEntry" varStatus="status">
    <c:if test="${status.first}">
      <tr><td align="left" class="blogDate">
            <cut value="${blogEntry.created}"/>
      </td></tr>
    </c:if>
    <tr><td align="left" class="blogTitle">
      <cut value="${blogEntry.title}" escapeXml="false"/>
    </td></tr>
    <tr><td align="left" class="blogText">
      <cut 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> 操作的语法
1
2
3
4
5
6
7
8
9
10
11
12
<c:choose>
  <c:when test="
        expression">
     
        body content
  </c:when>
  ...
  <ctherwise>
     
        body content
  </ctherwise>
</c:choose>




每个要测试的条件都由相应的         <c:when> 标记来表示,至少要有一个         <c:when> 标记。只会处理第一个其         test 值为         true 的         <c:when> 标记体内的内容。如果没有一个         <c:when> 测试返回         true ,那么会处理         <ctherwise> 标记的主体内容。注:尽管如此,         <ctherwise> 标记却是可选的;         <c:choose> 标记至多可有一个嵌套的         <ctherwise> 标记。如果所有         <c:when> 测试都为         false ,而且又没有给出         <ctherwise> 操作,那么不会处理任何         <c:choose> 标记的主体内容。      
清单 10 显示了运用         <c:choose> 标记的示例。在这里,检索请求对象而获得协议信息(通过 EL 的         pageContext 隐式对象),并用简单的字符串比较对协议信息进行测试。根据这些测试的结果,会显示相应的文本消息。      
清单 10. 使用 <c:choose> 进行内容条件化
1
2
3
4
5
6
7
8
9
10
11
<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>
  <ctherwise>
    You are using an unrecognized Web protocol. How did this happen?!
  </c:otherwise>
</c:choose>






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0