【问题标题】:JSTL: check if property doesn't existJSTL:检查属性是否不存在
【发布时间】:2009-07-02 19:45:12
【问题描述】:

我在 jsp 页面上被阻止,我们的 1 位 Java 工程师现在无法提供帮助。

有一个名为“module-review.jsp”的模板在 2 个实例中加载,通过普通页面加载和通过 api 将其作为 json 对象的一部分返回。

有一个名为“review.updatedDate”的变量。在正常的页面视图中,此变量作为 hashmap 加载到页面中,如下所示:

{_value=2009-07-02 11:54:30.0, class=sql-timestamp}

所以如果我想要日期值,我使用 ${review.updatedDate._value}

但是,当 API 加载 module-review.jsp 时,日期值直接作为日期对象返回,其中 ${review.updatedDate} 直接返回日期值。

我需要有一组条件语句,仅当 ._value 存在时才显示 ${review.updatedDate}。我尝试过的所有东西都给我错误 ._value 不存在,这很讽刺。

我目前正在尝试使用它,但它在第二个条件下失败:

<c:if test="${ (not empty review.updatedDate['_value']) }">
${review.updatedDate._value}
</c:if>

<c:if test="${ (empty review.updatedDate['_value']) }">
${review.updatedDate}
</c:if>

【问题讨论】:

    标签: conditional jstl


    【解决方案1】:

    除了“不要那样做”之外,我想你可以测试一下 updatedDate 的类型:

    <c:choose>
        <c:when test="${review.updatedDate.class.name == 'java.util.Date'}">
            Date: ${review.updatedDate}
        </c:when>
        <c:otherwise>
            Map: ${review.updatedDate._value}
        </c:otherwise>
    </c:choose>
    

    ...假设日期是Date 类的实例。奇怪的是,当我尝试测试 java.util.HashMap 时,这种方法不起作用。


    也许更可靠的方法是将测试交给 Java 类:

    package typetest;
    
    import java.util.Map;
    
    public class TypeUtil {
    
        public static boolean isMap(Object o) {
            return o instanceof Map;
        }
    
    }
    

    这可以通过 TLD 文件(例如 WEB-INF/maptest.tld)映射到自定义函数:

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
        <tlib-version>1.0</tlib-version>
        <short-name>myfn</short-name>
        <uri>http://typeutil</uri>
        <function>
            <name>isMap</name>
            <function-class>typetest.TypeUtil</function-class>
            <function-signature>boolean isMap(java.lang.Object)</function-signature>
        </function>
    </taglib>
    

    导入函数的示例 JSP:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="myfn" uri="http://typeutil"%>
    <html>
    <body>
    <c:choose>
        <c:when test="${myfn:isMap(review.updatedDate)}">
            Map: ${review.updatedDate._value}
        </c:when>
        <c:otherwise>
            Date: ${review.updatedDate}
        </c:otherwise>
    </c:choose>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多