2009-07-02 115 views
3

我在jsp页面被阻止,我们的1个java工程师现在无法提供帮助。JSTL:检查属性是否不存在

有一个名为“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}直接返回日期值。

如果._值不存在,我需要有一组条件语句只显示$ {review.updatedDate}。我所尝试过的所有东西都给了我错误,即._value不存在,这颇具讽刺意味。

我目前正在使用这一点,但在第2条件失败:

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

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

回答

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>