JSTL:检查属性是否不存在

时间:2009-07-02 19:45:13

标签: conditional jstl

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

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

有一个名为“review.updatedDate”的变量。在普通页面视图中,此变量作为哈希映射加载到页面中,如下所示:

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

1 个答案:

答案 0 :(得分:4)

除了“不要这样做”之外,我猜你可以测试 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>