J'ai besoin de cacher un élément si certaines valeurs sont présentes dans le JSP
Les valeurs sont stockées dans une liste alors j'ai essayé:
<c:if test="${ mylist.contains( myValue ) }">style='display:none;'</c:if>
Mais ça ne marche pas.
Comment puis-je évaluer si une liste contient une valeur dans JSTL, la liste et les valeurs sont des chaînes.
Malheureusement, je pense que JSTL ne supporte rien, sauf une itération à travers tous les éléments pour comprendre cela. Dans le passé, j'avais déjà utilisé la méthode forEach dans la bibliothèque de balises principale:
<c:set var="contains" value="false" />
<c:forEach var="item" items="${myList}">
<c:if test="${item eq myValue}">
<c:set var="contains" value="true" />
</c:if>
</c:forEach>
Après que cela fonctionne, $ {contient} sera égal à "true" si myList contenait myValue.
il n'y a pas de fonctionnalité intégrée pour vérifier cela - ce que vous feriez est d'écrire votre propre fonction tld qui prend une liste et un élément, et appelle la méthode contains () de la liste. par exemple.
//in your own WEB-INF/custom-functions.tld file add this
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://Java.Sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib
xmlns="http://Java.Sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Java.Sun.com/xml/ns/j2ee http://Java.Sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0"
>
<tlib-version>1.0</tlib-version>
<function>
<name>contains</name>
<function-class>com.Yourclass</function-class>
<function-signature>boolean contains(Java.util.List,Java.lang.Object)
</function-signature>
</function>
</taglib>
Créez ensuite une classe appelée Yourclass et ajoutez une méthode statique appelée contient avec la signature ci-dessus. Je suis sûr que l’application de cette méthode est assez explicite:
package com; // just to illustrate how to represent the package in the tld
public class Yourclass {
public static boolean contains(List list, Object o) {
return list.contains(o);
}
}
Ensuite, vous pouvez l’utiliser dans votre jsp:
<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %>
<c:if test="${ fn:contains( mylist, myValue ) }">style='display:none;'</c:if>
La balise peut être utilisée à partir de n’importe quel fichier JSP du site.
edit: plus d'infos sur le fichier tld - plus d'infos ici
Une autre façon de faire consiste à utiliser une Map (HashMap)
avec des paires clé-valeur représentant votre objet.
Map<Long, Object> map = new HashMap<Long, Object>();
map.put(new Long(1), "one");
map.put(new Long(2), "two");
Dans JSTL
<c:if test="${not empty map[1]}">
Cela devrait retourner vrai si la paire existe dans la carte
Vous devez utiliser la fonction fn:contains()
ou fn:containsIgnoreCase()
.
<%@ taglib prefix="fn" uri="http://Java.Sun.com/jsp/jstl/functions"%>
...
<c:if test="${not fn:containsIgnoreCase(mylist, 'Apple')}">
<p>Doesn't contain 'Apple'</p>
</c:if>
ou
<c:if test="${not fn:contains(mylist, 'Apple')}">
<p>Contains 'Apple'</p>
</c:if>
Ce qui suit est plus une solution de contournement qu'une réponse à votre question, mais cela peut être ce que vous recherchez. Si vous pouvez mettre vos valeurs dans une carte au lieu d'une liste, cela résoudrait votre problème. Mappez simplement vos valeurs sur une valeur non nulle et faites ceci <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>
ou vous pouvez même mapper sur style='display:none;
et simplement sortir ${mymap.myValue}
${fn:contains({1,2,4,8}, 2)}
OR
<c:if test = "${fn:contains(theString, 'test')}">
<p>Found test string<p>
</c:if>
<c:if test = "${fn:contains(theString, 'TEST')}">
<p>Found TEST string<p>
</c:if>