2009-07-02 5 views
3

Ich werde auf einer JSP-Seite blockiert und unser 1 Java-Ingenieur kann jetzt nicht helfen.JSTL: überprüfen, ob die Eigenschaft nicht existiert

Es gibt eine Vorlage namens "module-review.jsp", die in 2 Instanzen geladen wird, über eine normale Seite Laden einer über eine API, die es als Teil eines JSON-Objekts zurückgibt.

Es gibt eine Variable namens "review.updatedDate". Auf einer normalen Seitenansicht wird diese Variable als hashmap in die Seite geladen und sieht wie folgt aus:

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

Also, wenn ich das Datum Wert wollen, verwende ich $ {} review.updatedDate._value

Wenn module-review.jsp jedoch von der API geladen wird, wird der Datumswert direkt als Datumsobjekt zurückgegeben, wobei $ {review.updatedDate} den Datumswert direkt zurückgibt.

Ich brauche eine Reihe von bedingten Anweisungen, die nur $ {review.updatedDate} anzeigen, wenn ._value nicht existiert. Alles, was ich versucht habe, gibt mir Fehler, dass ._value nicht existiert, was ziemlich ironisch ist.

Ich bin derzeit versucht, dies zu verwenden, aber es funktioniert nicht in der 2. Bedingung:

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

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

Antwort

4

Neben „tun es nicht auf diese Weise“, ich denke, die Art des testen konnte 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> 

... vorausgesetzt, dass das Datum eine Instanz der Date Klasse. Seltsamerweise funktionierte dieser Ansatz nicht, als ich versuchte, auf java.util.HashMap zu testen.


Vielleicht ein zuverlässiger Ansatz wäre, den Test zu übergeben, um eine Java-Klasse:

package typetest; 

import java.util.Map; 

public class TypeUtil { 

    public static boolean isMap(Object o) { 
     return o instanceof Map; 
    } 

} 

Dies kann über eine TLD-Datei (zB WEB-INF/maptest zu einer benutzerdefinierten Funktion zugeordnet wird .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> 

Beispiel JSP, die die Funktion Importe:

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