2009-07-02 6 views
29

J'ai un ensemble Java dans ma session et une variable également dans la session. Je dois être capable de dire si cette variable existe dans l'ensemble.JSTL Ensembles et listes - vérifier si l'élément existe dans un ensemble

Je veux utiliser la méthode contains (Object) que Java a pour Lists and Sets pour tester si cet objet existe dans l'ensemble.

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

Merci, Alex

Répondre

41

Vous pouvez le faire en utilisant les balises JSTL, mais le résultat est 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 alors être importé dans votre: JSPs

<%@ 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 de EL (due à JEE6) devrait permettre à la forme plus directe:

${numbers.contains('two')} 
+0

+1 pour utiliser la fonction personnalisée. C'est la bonne façon d'y aller et réutilisable :) – AlfaTeK

1

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} 
Questions connexes