web-dev-qa-db-fra.com

Ensembles et listes JSTL - vérifier si un élément existe dans un ensemble

J'ai un Java Set dans ma session et une variable également dans la session. Je dois être capable de dire si cette variable existe dans le set.

Je veux utiliser la méthode contains (Object) que Java a pour les listes et les ensembles pour tester si cet objet existe dans l'ensemble.

Est-ce possible de faire en JSTL? Si c'est le cas, comment? :)

Merci, Alex

29
Alex Genadinik

Vous pouvez le faire en utilisant des balises JSTL, mais le résultat n'est pas optimal:

<%@ taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core"%>
<html>
<body>

<jsp:useBean id="numbers" class="Java.util.HashSet" scope="request">
    <%
        numbers.add("one");
        numbers.add("two");
        numbers.add("three");
    %>
</jsp:useBean>

<c:forEach items="${numbers}" var="value">
    <c:if test="${value == 'two'}">
        <c:set var="found" value="true" scope="request" />
    </c:if>
</c:forEach>
${found}

</body>
</html>

Une meilleure façon serait d'utiliser une fonction personnalisée:

package my.package;
public class Util {

  public static boolean contains(Collection<?> coll, Object o) {
    if (coll == null) return false;
    return coll.contains(o);
  }

}

Ceci est défini dans un fichier TLD ROOT /WEB-INF/tag/custom.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://samplefn</uri>
    <function>
      <name>contains</name>
      <function-class>my.package.Util</function-class>
      <function-signature>boolean contains(Java.util.Collection,
          Java.lang.Object)</function-signature>
  </function>
</taglib>

La fonction peut ensuite être importée dans vos JSP:

<%@ taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core"%>
<%@ taglib prefix="myfn" uri="http://samplefn"%>
<html>
<body>

<jsp:useBean id="numbers" class="Java.util.HashSet" scope="request">
    <%
        numbers.add("one");
        numbers.add("two");
        numbers.add("three");
    %>
</jsp:useBean>

${myfn:contains(numbers, 'one')}
${myfn:contains(numbers, 'zero')}

</body>
</html>

La prochaine version d'EL (prévue dans JEE6) devrait permettre la forme la plus directe:

${numbers.contains('two')}
41
McDowell

Si vous utilisez Spring Framework, vous pouvez utiliser Spring TagLib et SpEL:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
---
<spring:eval var="containsValue" expression="yourList.contains(yourValue)" />

Contains (true or false): ${containsValue}
1
xxg