我正在使用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
最早的日期在c:when
内打印,但待审核仅在c:choose
之外打印,而不是在c:when
内打印。
上述代码有什么问题?
答案 0 :(得分:1)
这是因为当<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>
答案 1 :(得分:1)
<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>
答案 2 :(得分:0)
另一种选择可以是 -
<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>