<c:when> inside <c:choose> </c:choose> </c:when>

时间:2011-10-25 18:12:37

标签: jsp loops jstl

我想知道以下代码是否有效?我正在从事一个项目,我来自非Java背景。我是否需要将<c:otherwise><c:choose>括起来?非常感谢您的所有帮助。

 <c:choose>
     <c:when test="${empty example1}">
     </c:when>
     <c:otherwise>
         <c:when test="${empty example2}">
         </c:when>
         <c:otherwise>
         </c:otherwise>
     </c:otherwise>     
  </c:choose>

3 个答案:

答案 0 :(得分:2)

@Marvo钉了它。 JSTL 1.2 spec表示c:choose必须是至少一个c:when语句的父级,c:when必须始终在至少一个c:otherwise语句之前直接的父母。从本质上讲,这也意味着每个c:when必须在c:otherwise内跟随c:choose,而c:choose 必须包围任何c:when +} + c:otherwise。从我所看到的,规范没有引用嵌套c:choose元素,所以你必须尝试。

@EJP是正确的,c:choose通常可以翻译成Java switch,但是有区别。 Java开关要求在条件内具有互斥语句,而c:choose条件是。c:when条件。我们知道如果满足条件,c:when内的任何内容都将被执行,然后在c:choose元素中不会出现其下面出现的其他switch语句。我们不一定对Java case语句说同样的内容(尽管首选样式通常是互斥的switch语句)。

假设一个人13岁或14岁,我们想给他们发一张生日卡。如果他们是15或17,我们希望向他们发送生日短信。如果他们是16或18(特殊生日),我们希望向他们发送卡片和文本。下面的代码可以实现这一点,并且它是一个switch (age) { case 16: // falls through (executes case 18) case 18: sendBirthdayCard(); sendBirthdayText(); break; case 13: // falls through (executes case 14) case 14: sendBirthdayCard(); break; case 15: // falls through (executes case 17) case 17: sendBirthdayText(); break; default: System.out.println("You are under 13 or over 18 years old."); } ,如果满足特定条件,可以执行多个case语句:

{{1}}

答案 1 :(得分:0)

我不相信。但即使是这样,您也可以指定多个“when”子句。你会得到与我认为更具可读性相同的效果:

<c:choose>
    <c:when test="${empty example1}">
    </c:when>

    <c:when test="${empty example2}">
    </c:when>

    <c:otherwise>
    </c:otherwise>
</c:choose>

答案 2 :(得分:0)

您可以将此构造视为c:choose是Java switch; c:when是Java case; c:otherwise是一个Java default