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
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);
}
}
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
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:
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.
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]}".
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
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
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.
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