92 votes

Évaluer list.contains string dans JSTL

Je dois masquer un élément si certaines valeurs sont présentes dans le fichier 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.

100voto

Chii Points 7798

il n'y a pas de fonction pour vérifier que - ce que vous voulez faire est d'écrire votre propre tld fonction qui prend une liste et un élément, et les appels de la liste de la méthode contains (). 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>

Ensuite créer une classe appelée Yourclass, et ajouter une méthode statique appelé contient avec la signature ci-dessus. Je suis sûr que la mise en œuvre 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 page 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 de n'importe quel JSP dans le site.

edit: plus d'infos concernant le fichier tld - plus d'info ici

73voto

Kaleb Brasee Points 25776

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 à "vrai" si myList contenait myValue.

29voto

tamersalama Points 1915

Une autre façon de faire consiste à utiliser un 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

2voto

svachon Points 2688

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 générer simplement ${mymap.myValue}

-2voto

Vladislav Points 1
 <c:if test="${fn:contains(task.subscribers, customer)}">
 

Cela fonctionne bien pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X