JSTL中是否有if-else标记?

评论

JSP或JSTL中if ... else的可能重复项

#1 楼

是的,但是笨拙,例如

<c:choose>
  <c:when test="${condition1}">
    ...
  </c:when>
  <c:when test="${condition2}">
    ...
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>


评论


除了wrapper标签(选择)之外,我看不出它比if / elseif / else更加冗长。一个包装标签很难构成“笨拙的地狱”,不是吗?

–史蒂文·贝尼特斯(Steven Benitez)
2011年1月8日在18:25

@Steven:这是XML的本质。样板中的字符比实际逻辑中的字符更多。

–skaffman
2011年1月8日在18:40

我知道我参加聚会有点晚了,但是似乎有点冗长,是吗?

– andronikus
2011-10-27 13:29

用适当的缩进和笨拙开始嵌套逻辑,因为地狱似乎太好了描述。

–亚当·托利(Adam Tolley)
13年8月5日在15:41

人们仍然可以使用普通的旧Java语法。我知道我会为此而讨厌,但el绝不是强制性的。它本来应该更具可读性并强制执行逻辑和UI的分离,但是它通常不易理解,其余的都是关于纪律的。

–克里斯
2015年9月23日在10:54

#2 楼

除了使用skaffman答案外,还可以使用简单的if-else这样的三元运算符

<c:set value="34" var="num"/>
<c:out value="${num % 2 eq 0 ? 'even': 'odd'}"/>


评论


这是一个很好的答案,但在很大程度上取决于它的用处。

– Mike LP
16年8月3日在15:26

#3 楼



<c:if test="${user.age ge 40}">
 You are over the hill.
</c:if>


也可以选择-when:

<c:choose>
  <c:when test="${a boolean expr}">
    do something
  </c:when>
  <c:when test="${another boolean expr}">
    do something else
  </c:when>
  <c:otherwise>
    do this when nothing else is true
  </c:otherwise>
</c:choose>


评论


@iwxfer,您好,您现在无法使用上面的链接,请更新,如果您能获得好的成绩,请明智地将其删除。

– Ajay2707
16年5月19日在5:51

#4 楼

我只使用了两个if标签,以为我会添加一个答案,以防万一它对其他人有用:

<c:if test="${condition}">
  ...
</c:if>
<c:if test="${!condition}">
  ...
</c:if>


从技术上讲,它本身并不是if-else ,其行为是相同的,并且避免了使用choose标签的笨拙方法,因此根据您的要求的复杂程度,这可能是更可取的。

评论


考虑一下条件复杂且丑陋的情况,例如$ {not param.age gt 42和someOtherVar eq'foobar'}。您必须将条件存储到一个临时布尔变量中,以便可以执行!condition或编写该条件的逆函数。两者都很丑。 “否则”语法是有保证的逆运算。

–亚光灼伤
16年5月11日在20:27

确实,复杂的条件将需要局部变量或编写逆函数,但是这两个选项仍然有效。我澄清说,这取决于要求的复杂程度,即这种方法是否比选择标记更可取。

– jonk
16年5月12日在15:56

我同意这一点。如果只有一个,则标记较少,然后使用c:choose

–javaMoca
16年8月15日在2:55

使用还有另一个好处。如果变量为null(未初始化),则不会执行任何分支,这很好。如果使用,则当变量为null时将执行false分支。

–史蒂夫·斯蒂尔森(Steve Stilson)
18年5月14日在22:41

#5 楼

您必须使用以下代码:

<%@ taglib prefix="c" uri="http://www.springframework.org/tags/form"%>



<c:select>
            <option value="RCV"
                ${records[0].getDirection() == 'RCV' ? 'selected="true"' : ''}>
                <spring:message code="dropdown.Incoming" text="dropdown.Incoming" />
            </option>
            <option value="SND"
                ${records[0].getDirection() == 'SND'? 'selected="true"' : ''}>
                <spring:message code="dropdown.Outgoing" text="dropdown.Outgoing" />
            </option>
        </c:select>


#6 楼

除了需要其他条件外,在许多情况下,您还需要在多个位置使用相同条件。
我更喜欢将条件提取到变量中:
<c:set var="conditionVar" value="#{expression}"/>

然后,您可以根据需要多次使用条件变量:
...
<c:if test="#{conditionVar}">
       ...
</c:if>
<c:if test="#{!conditionVar}">
       ...
</c:if>
...
<c:if test="#{conditionVar}">
       ...
</c:if>
<c:if test="#{!conditionVar}">
       ...
</c:if>
...

c:choose元素对更复杂的情况很有用,但是如果只需要if,我认为这种方法更好。它是有效的,并具有以下优点:

如果正确选择了变量名,则更具可读性
可重用,因为提取了条件,所得的
变量可重用于其他ifs和其他表达式。不鼓励多次写相同的条件(并求值)。


#7 楼

根据时间复杂度前景,这是一种很好且有效的方法。一旦获得真实条件,此后将不再检查其他任何内容。在多个If中,它将检查每个条件。

   <c:choose>
      <c:when test="${condtion1}">
        do something condtion1
      </c:when>
      <c:when test="${condtion2}">
        do something condtion2
      </c:when>
      ......
      ......
      ...... 
      .......

      <c:when test="${condtionN}">
        do something condtionn N
      </c:when>


      <c:otherwise>
        do this w
      </c:otherwise>
    </c:choose>