2009-07-02 7 views
3

Je suis bloqué sur une page jsp et notre 1 ingénieur java ne peut pas aider maintenant.JSTL: vérifie si la propriété n'existe pas

Il existe un modèle appelé "module-review.jsp" qui est chargé dans 2 instances, via un chargement de page normal via une API qui le renvoie en tant qu'élément d'un objet json.

Il existe une variable appelée "review.updatedDate". Sur une vue page normale, cette variable est chargé en tant que hashmap dans la page et ressemble à ceci:

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

Donc, si je veux la valeur de date, j'utilise $ {} review.updatedDate._value

Toutefois, lorsque module-review.jsp est chargé par l'API, la valeur de date est renvoyée directement en tant qu'objet de date, où $ {review.updatedDate} renvoie directement la valeur de date.

Je dois avoir un ensemble d'instructions conditionnelles qui afficheront seulement $ {review.updatedDate} si ._value n'existe pas. Tout ce que j'ai essayé me donne des erreurs que ._value n'existe pas, ce qui est plutôt ironique.

J'essaie actuellement d'utiliser, mais il échoue au 2ème condition:

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

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

Répondre

4

En dehors de « ne pas le faire de cette façon », je suppose que vous pouvez tester le type de 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> 

... en supposant que la date est une instance de la classe Date. Bizarrement, cette approche n'a pas fonctionné quand j'ai essayé de tester java.util.HashMap.


Peut-être une approche plus fiable serait de remettre le test hors d'une classe Java:

package typetest; 

import java.util.Map; 

public class TypeUtil { 

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

} 

Cela peut être mis en correspondance avec une fonction personnalisée via un fichier TLD (par exemple 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> 

Exemple JSP qui importe la fonction:

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