wake-up-neo.net

Bewerten Sie list.contains string in JSTL

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 sind Zeichenfolgen.

84
OscarRyz

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 $ {includes} gleich "true", wenn myList myValue enthält.

63
Kaleb Brasee

es gibt keine eingebaute Funktion, um dies zu überprüfen. Sie schreiben einfach eine eigene tld-Funktion, die eine Liste und ein Element aufnimmt und die contain () -Methode 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 mit dem Namen Yourclass und fügen Sie eine statische Methode mit dem Namen contain mit der obigen Signatur hinzu. Ich bin mir sicher, dass die Implementierung dieser Methode ziemlich selbsterklärend ist:

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 kannst du es in deinem jsp benutzen:

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

edit: mehr infos zur tld datei - mehr infos hier

96
Chii

Eine andere Möglichkeit hierfür ist die Verwendung einer 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 true zurückgeben, wenn das Paar in der Karte vorhanden ist

26
tamersalama

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

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

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 anstatt in eine Liste einfügen können, ist das Ihr Problem. Ordnen Sie einfach Ihre Werte einem Nicht-Null-Wert zu und führen Sie dies aus <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if> Oder Sie können sogar style='display:none; Zuordnen und einfach ${mymap.myValue} Ausgeben.

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