【问题标题】:Date is printing but failed to evaluate as not empty in jstl日期正在打印,但无法在 jstl 中评估为非空
【发布时间】:2015-01-18 04:42:43
【问题描述】:

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

上面的代码有什么问题?

【问题讨论】:

    标签: java spring hibernate jsp jstl


    【解决方案1】:

    &lt;c:choose&gt; 的工作方式类似于 Java 的 switch 语句。它让您选择在许多备选方案中。 switch 语句有case 语句,&lt;c:choose&gt; 标签有&lt;c:when&gt; 标签。因此,如果&lt;c:when&gt; 中的一个满足条件,那么其他&lt;c:when&gt; 将不会执行,就像您在case 块之后放置break 条件一样。如果要打印任一属性,则应使用&lt;c:choose&gt;。如果您想同时打印它们,那么您最好使用&lt;c:if&gt; 来测试是否为空。如果您仍想使用&lt;c:choose&gt;,那么您需要在单独的标签中使用它。对于格式化日期也可以使用&lt;fmt:formatDate&gt;

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

    【讨论】:

    • 谢谢 Roman 它对我有用,他们的东西像 jstl 中的 if-elseif-else 吗?
    • 不,只有在其他情况下才选择。
    【解决方案2】:

    另一个选项可以是 -

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

    【讨论】:

      【解决方案3】:

      这是因为当您在&lt;c:choose&gt; 中有多个&lt;c:when&gt; 时,第一个将被解释为if,而所有其他else if。因此,您的第一个条件得到满足,第二个 when 被忽略。

      如果您想根据非排他性条件同时打印它们,最好使用&lt;c:if&gt;。当您的条件很少时,它也比&lt;c:choose&gt; 构造更容易阅读。

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

      【讨论】:

        猜你喜欢
        • 2021-11-03
        • 2011-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 2019-06-18
        • 1970-01-01
        相关资源
        最近更新 更多