web-dev-qa-db-fra.com

Évaluer list.contains string dans JSTL

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.

84
OscarRyz

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.

63
Kaleb Brasee

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

96
Chii

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

26
tamersalama

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>
12
tk_

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}

2
svachon
${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>
2
Tony Hung