ChatGPT解决这个技术问题 Extra ChatGPT

如何在 JSTL 中使用 if-else 选项

JSTL 中是否有可用的 if-else 标签?

if...else within JSP or JSTL 的可能重复项

s
skaffman

是的,但它很笨重,例如

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

除了包装标签(选择)之外,我看不出这比 if/elseif/else 更冗长。一个包装标签几乎不构成“笨拙的地狱”,不是吗?
@Steven:这是它的 XML 特性。样板文件中的字符比实际逻辑中的字符多。
我知道我参加聚会有点晚了,但 <c:otherwise> 似乎有点冗长,是吗?
以适当的缩进开始嵌套逻辑,并且笨拙的描述似乎太客气了。
人们仍然可以使用普通的旧 java 语法。我知道我会因此而被讨厌,但 el 绝不是强制性的。它的目的是提高可读性并强制逻辑和 UI 分离,但它往往不是更易读,其余的都是关于纪律的。
l
laksys

除了 skaffman 的回答,简单的 if-else 你可以像这样使用三元运算符

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

这是一个很好的答案,但它的用处高度取决于情境。
M
Menuka Ishan

没有if-else,只是如果。

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

或者,您可以使用选择时间:

<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,你上面的链接现在不可用,请更新,如果你能获得好分数,否则删除它。
j
jonk

我只是使用了两个 if 标签就逃脱了,我想我会添加一个答案,以防它对其他人有用:

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

虽然技术上不是 if-else 本身,但行为是相同的,并且避免了使用 choose 标记的笨拙方法,因此根据您的要求有多复杂,这可能是更可取的。


考虑条件是复杂和丑陋的情况,例如 ${not param.age gt 42 和 someOtherVar eq 'foobar'}。您必须将条件存储到一个临时布尔变量中,以便您可以执行!条件,或编写该条件的逆。都丑。 “否则”语法是有保证的逆向。
事实上,一个复杂的条件需要一个局部变量或写逆,但这两个选项仍然有效。我澄清说,这取决于要求的复杂程度,即这种方法是否优于 choose 标记。
我同意这一点。如果你只有一个,那么使用 c:choose 的标记更少
使用 还有一个额外的好处。当变量为null(未初始化)时,两个分支都不执行,这很好。如果您使用 ,则当变量为 null 时将执行 false 分支。
a
ankit

你必须使用这个代码:

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

S
Stefan Mondelaers

除了需要 else 之外,在许多情况下,您还需要在多个位置使用相同的条件。

我更喜欢将条件提取到变量中:

<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 else,我认为这种方法更好。它是高效的并且具有以下优点:

如果变量名选择得当,则更具可读性

更可重用,因为条件被提取并且结果变量可以重用于其他 if 和其他表达式。它不鼓励多次编写相同的条件(并对其进行评估)。


S
Sachin Kumar

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

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