【问题标题】:<c:when> inside <c:choose><c:when> 内 <c:choose>
【发布时间】:2011-12-15 04:24:18
【问题描述】:

我想知道下面的代码是否有效?我正在做一个项目,我来自非 Java 背景。我需要用&lt;c:choose&gt; 括起来&lt;c:otherwise&gt; 吗?非常感谢您的所有帮助。

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

【问题讨论】:

  • 这肯定不是java。请标记它是什么。
  • 是的,你是对的。我正在尝试添加一个条件,不确定我是否在正确的方向。我看起来类似于 if else 循环。不确定我是否可以在这里做同样的事情。

标签: jsp loops jstl


【解决方案1】:

@Marvo 做到了。 JSTL 1.2 spec 声明c:choose 必须是至少一个c:when 语句的父级,并且c:when 必须始终位于至少一个具有相同直接父级的c:otherwise 语句之前。从本质上讲,这也意味着每个c:when 必须在c:choose 中跟随c:otherwise,并且c:choose 必须 包围任何c:when + c:otherwise。据我所知,规范没有提到嵌套c:choose 元素,所以你必须尝试一下。

@EJP 说得对,c:choose 一般都可以翻译成 Java 的switch,但还是有区别的。 Java 开关不需要在条件中包含互斥语句,而c:choose 条件则需要。我们知道,如果满足条件,c:when 中的任何内容都将被执行,然后在该c:choose 元素下方出现的其他c:when 语句将不会被执行。对于 Java 的 switch 语句,我们不一定要这么说(尽管首选样式通常是相互排斥的 case 语句)。

假设一个人 13 或 14 岁,我们想给他们寄一张生日贺卡。如果他们是 15 或 17 岁,我们想给他们发送生日短信。如果他们是 16 岁或 18 岁(特殊生日),我们想给他们发一张卡片和一条短信。下面的代码可以实现这一点,它是一个switch,如果满足特定条件,则可以执行多个 case 语句:

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.");
}

【讨论】:

    【解决方案2】:

    我不相信。但即使是这样,您也可以指定多个“when”子句。您将获得与我认为您所追求的相同的效果,并且更具可读性:

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

    【讨论】:

    • 其实我需要在 中检查一个条件,并且只在条件满足时才显示它。根据条件,我希望在最后显示一个文本。
    • 但这确实有效。如果您在第一个“何时”失败,它将进入第二个“何时”并测试该条件。这就像你进入“否则”子句然后设置一个新测试一样,只是更容易阅读。如果你真的想要,你可以在 else 子句中加入另一个 choose-when-otherwise。但你在这里不需要它。
    • :when> 这应该是有效的吧?
    • 对我来说看起来有效。当您将其放入您的页面时,您会确定。 =)
    • c:whenc:if 不同,因为它在c:choose 块内,正如@Marvo 指出的那样。 c:choose 表示条件是互斥的——在停止处理c:choose 之前,只会匹配c:when 条件之一。
    【解决方案3】:

    你可以把这个结构想象成c:choose 是一个Java switchc:when 是一个 Java casec:otherwise 是一个 Java default

    【讨论】:

    • 这不完全正确 - c:otherwise 声明不是必需的。上述规范说c:choose 语句可以包含:0 or 1 &lt;c:otherwise&gt; action 和它Must be the last action nested within &lt;c:choose&gt;
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 2011-11-02
    相关资源
    最近更新 更多