我正在使用 JSTL 在我的 JSP 中迭代 Spring 的模型值。
我使用 JSTL 在 JSP 中显示两个日期。
下面是我的Java代码:
model.put("oldest",timesheetService.getOldestPendingTimesheet(userDetails));
model.put("pending", timesheetService.getNextOldestPendingTimesheet(userDetails));
JSP代码:
<c:choose>
<c:when test="${not empty model.oldest}">
<c:out value="${model.oldest}"/>
</c:when>
<c:when test="${not empty model.pending}">
<c:out value="${model.pending}"/>
</c:when>
</c:choose>
我将两个日期显示在
<c:choose>
标签之外。打印如下:
oldest:Tue Nov 04 00:00:00 IST 2014
Pending:Sun Nov 09 00:00:00 IST 2014
最旧的
Date
在 <c:when>
标签内部打印,但 bpending
仅在 <c:choose>
标签外部打印,而不在 <c:when>
标签内部打印。
上面的代码有什么问题?
那是因为当
<c:when>
中有多个 <c:choose>
时,第一个被解释为 if
,所有其他都被解释为 else if
。因此,您的第一个条件已满足,第二个 when
将被忽略。
如果您想根据非排他性条件打印两者,最好使用
<c:if>
。当条件很少时,它也比 <c:choose>
构造更容易阅读。
<c:if test="${not empty model.oldest}">
<c:out value="${model.oldest}"/>
</c:if>
<c:if test="${not empty model.pending}">
<c:out value="${model.pending}"/>
</c:if>
<c:choose>
的工作方式类似于 Java switch
语句。它可以让您在多种选择之间进行选择。如果 switch
语句具有 case
语句,则 <c:choose>
标签具有 <c:when>
标签。因此,如果 <c:when>
中的一个满足条件,则其他 <c:when>
将不会执行,就像您在 break
块之后放置 case
条件一样。如果您想打印任一属性,则应该使用 <c:choose>
。如果你想打印它们,那么你最好使用 <c:if>
来测试是否为空。如果您仍想使用 <c:choose>
那么您需要将其放在单独的标签中。还可以使用 <fmt:formatDate>
格式化日期
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:choose>
<c:when test="${not empty model.oldest}">
<fmt:formatDate type="both"
dateStyle="long" timeStyle="long"
value="${model.oldest}" />
</c:when>
</c:choose>
<c:choose>
<c:when test="${not empty model.pending}">
<fmt:formatDate type="both"
dateStyle="long" timeStyle="long"
value="${model.pending}" />
</c:when>
</c:choose>
另一个选项可以是-
<c:choose>
<c:when test="${not empty model.oldest}">
<c:out value="${model.oldest}"/>
</c:when>
<c:otherwise>
<c:when test="${not empty model.pending}">
<c:out value="${model.pending}"/>
</c:when>
</c:otherwise>
</c:choose>