Werte list.contains-String in JSTL aus

Lesezeit: 6 Minuten

Benutzer-Avatar
OscarRyz

Ich muss ein Element ausblenden, wenn bestimmte Werte in der JSP vorhanden sind

Die Werte werden in einer Liste gespeichert, also habe ich versucht:

<c:if test="${  mylist.contains( myValue ) }">style="display:none;"</c:if>

Aber es funktioniert nicht.

Wie kann ich auswerten, ob eine Liste einen Wert in JSTL enthält, die Liste und die Werte Zeichenfolgen sind.

  • Beachten Sie, dass die angegebene Syntax seit EL 2.2 (das als Teil von Servlet 3.0 / JSP 2.2, das im Dezember 2009 veröffentlicht wurde, eingeführt wird) wie beabsichtigt funktioniert.

    – BalusC

    10. Januar 2012 um 4:28 Uhr


  • Mögliches Duplikat von JSTL-Sets und -Listen – Überprüfung, ob Element in einem Set vorhanden ist

    – Mattball

    18. Juni 2012 um 13:32 Uhr

Benutzer-Avatar
Chii

es gibt keine eingebaute Funktion, um das zu überprüfen – was Sie tun würden, wäre, Ihre eigene tld-Funktion zu schreiben, die eine Liste und ein Element nimmt und die Methode contains() der Liste aufruft. z.B

//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>

Erstellen Sie dann eine Klasse namens Yourclass und fügen Sie eine statische Methode namens contains mit der obigen Signatur hinzu. Ich bin sicher, die Implementierung dieser Methode ist ziemlich selbsterklärend:

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);
   }
}

Dann können Sie es in Ihrem jsp verwenden:

<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %>
<c:if test="${  fn:contains( mylist, myValue ) }">style="display:none;"</c:if>

Das Tag kann von jeder JSP auf der Site verwendet werden.

Bearbeiten: Weitere Informationen zur TLD-Datei – mehr Infos hier

  • Ich empfehle zu verwenden Collection Anstatt von List in der Taglib – es funktioniert genauso, unterstützt aber mehr Sammlungstypen wie Sets

    – Ralf

    16. Dezember 2015 um 11:53 Uhr


Benutzer-Avatar
Kaleb Brasee

Leider denke ich, dass JSTL nur eine Iteration durch alle Elemente unterstützt, um dies herauszufinden. In der Vergangenheit habe ich die forEach-Methode in der Core-Tag-Bibliothek verwendet:

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

Nachdem dies ausgeführt wurde, ist ${contains} gleich “true”, wenn myList myValue enthielt.

  • funktioniert gut, wenn die Liste klein ist. Stellen Sie sich nur vor, dass dies Leistungskosten verursacht, wenn Sie dies auf diese Weise tun.

    – Chii

    29. September 2009 um 1:55 Uhr

  • Ja, würde es geben, wenn du high genug wirst. Ich habe es für Sammlungen von 10-20 Dingen verwendet und habe keine Leistungsprobleme festgestellt. Was ich noch schlimmer finde, ist die Anzahl der Zeilen von JSTL. Trotzdem denke ich, dass dies der einzige Weg ist, ohne eine eigene TLD einzurichten (was nicht allzu schwierig ist und sich durchaus lohnen kann).

    – Kaleb Brasee

    29. September 2009 um 2:01 Uhr

Eine andere Möglichkeit, dies zu tun, ist die Verwendung von a Map (HashMap) mit Schlüssel-Wert-Paaren, die Ihr Objekt darstellen.

Map<Long, Object> map = new HashMap<Long, Object>();
map.put(new Long(1), "one");
map.put(new Long(2), "two");

In JSTL

<c:if test="${not empty map[1]}">

Dies sollte wahr zurückgeben, wenn das Paar in der Karte vorhanden ist

  • Dies ist auch mein bevorzugter Weg, Hashmaps im Ansichtsmodell für alles einzurichten, was ich in einer Ansicht benötige. Sie integrieren sich gut in die EL-Syntax und sind blitzschnell bei der Suche.

    – Boris B.

    3. August 2012 um 14:21 Uhr


  • Nur noch eine Sache, wenn der Schlüssel existiert, aber der Wert null oder leer ist, würde er falsch zurückgeben.

    – Zai

    9. Mai 2014 um 11:01 Uhr

  • Oder wenn die Karte boolesche Werte enthält, test="${isPresentByValue[myValue]}".

    – Noumenon

    7. Februar 2017 um 4:13 Uhr

Benutzer-Avatar
tk_

Sie müssen die verwenden fn:contains() oder fn:containsIgnoreCase() Funktion.

<%@ 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>

oder

<c:if test="${not fn:contains(mylist, 'Apple')}">
            <p>Contains 'Apple'</p>
        </c:if>

Notiz:

Das wird wie funktionieren mylist.toString().contains("apple") und wenn dies nicht das ist, wonach Sie suchen, verwenden Sie besser einen anderen Ansatz.

Das Folgende ist eher eine Problemumgehung als eine Antwort auf Ihre Frage, aber es könnte das sein, wonach Sie suchen. Wenn Sie Ihre Werte in eine Karte anstelle einer Liste einfügen können, würde das Ihr Problem lösen. Ordnen Sie Ihre Werte einfach einem Nicht-Null-Wert zu und tun Sie dies <c:if test="${mymap.myValue ne null}">style="display:none;"</c:if> oder Sie können sogar zuordnen style="display:none; und einfach ausgeben ${mymap.myValue}

  • Ich denke, die Syntax sollte style=’display:none;’ Andernfalls wird die Variable “myValue” nicht ausgewertet.

    –Andreas

    8. Juni 2010 um 11:46 Uhr


Benutzer-Avatar
Toni Hung

${fn:contains({1,2,4,8}, 2)}

ODER

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

  • Ich denke, die Syntax sollte style=’display:none;’ Andernfalls wird die Variable “myValue” nicht ausgewertet.

    –Andreas

    8. Juni 2010 um 11:46 Uhr


Benutzer-Avatar
Lukas Basquerotto

Wenn Sie EL 3.0+ verwendender beste Ansatz in diesem Fall ist, wie diese andere Antwort in einem anderen Thema erklärt:

Für ein Collection Es ist einfach, verwenden Sie einfach die Colleciton#contains()
Methode in EL.

<h:panelGroup id="p1" rendered="#{bean.panels.contains('p1')}">...</h:panelGroup>
<h:panelGroup id="p2" rendered="#{bean.panels.contains('p2')}">...</h:panelGroup>
<h:panelGroup id="p3" rendered="#{bean.panels.contains('p3')}">...</h:panelGroup>

Für ein Object[] (Array) benötigen Sie mindestens EL 3.0 und nutzen die neue Lambda-Unterstützung.

<h:panelGroup id="p1" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p1').get()}">...</h:panelGroup>
<h:panelGroup id="p2" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p2').get()}">...</h:panelGroup>
<h:panelGroup id="p3" rendered="#{bean.panels.stream().anyMatch(v -> v == 'p3').get()}">...</h:panelGroup>

Wenn Sie EL 3.0 noch nicht verwenden, müssen Sie eine benutzerdefinierte EL-Funktion erstellen. […]

1265150cookie-checkWerte list.contains-String in JSTL aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy