正在打印日期,但未能在 JSTL 中评估为非空

问题描述 投票:0回答:3

我正在使用 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>
标签内部打印。

上面的代码有什么问题?

java spring hibernate jsp jstl
3个回答
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
投票

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

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>
© www.soinside.com 2019 - 2024. All rights reserved.