Oceń listę.zawiera ciąg znaków w JSTL

Muszę ukryć element, jeśli pewne wartości są obecne w JSP

Wartości są przechowywane na liście, więc próbowałem:

<c:if test="${  mylist.contains( myValue ) }">style='display:none;'</c:if>
Ale to nie działa.

Jak mogę ocenić, czy lista zawiera wartość w JSTL, lista i wartości są ciągami znaków.

Author: OscarRyz, 2009-09-29

7 answers

Niestety, myślę, że JSTL nie obsługuje niczego poza iteracją przez wszystkie elementy, aby to rozgryźć. W przeszłości używałem metody forEach w bibliotece znaczników core:

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

Po tym uruchomieniu, ${contains} będzie równe "true", jeśli myList zawiera myValue.

 62
Author: Kaleb Brasee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-10 04:12:33

Nie ma wbudowanej funkcji, która by to sprawdzała - to, co byś zrobił, to napisać własną funkcję tld, która pobiera listę i element i wywołuje metodę contains () listy. np.

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

Następnie utwórz klasę o nazwie Yourclass i dodaj statyczną metodę o nazwie contains z powyższym podpisem. Jestem pewien, że implementacja tej metody jest dość oczywiste:

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

Następnie możesz użyć go w swoim jsp:

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

Znacznik może być używany z dowolnego JSP w miejscu.

Edit: więcej informacji o pliku tld - więcej informacji tutaj

 94
Author: Chii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 16:43:22

Innym sposobem jest użycie Map (HashMap) z kluczem, par wartości reprezentujących Twój obiekt.

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

W JSTL

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

To powinno zwracać true, jeśli para istnieje na mapie

 26
Author: tamersalama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 13:54:30

Musisz użyć fn:contains() lub fn:containsIgnoreCase() funkcja.

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

Lub

<c:if test="${not fn:contains(mylist, 'Apple')}">
            <p>Contains 'Apple'</p>
        </c:if>
 5
Author: tk_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-21 05:14:33

Poniżej znajduje się bardziej obejście niż odpowiedź na twoje pytanie, ale może to być to, czego szukasz. Jeśli możesz umieścić swoje wartości na mapie zamiast na liście, to rozwiąże twój problem. Po prostu zmapuj swoje wartości do wartości innej niż null i wykonaj to <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if> lub możesz nawet zmapować do style='display:none; i po prostu wyjść ${mymap.myValue}

 2
Author: svachon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-08 18:27:53

Jeśli używasz Spring Framework, możesz użyć Spring TagLib i SpEL:

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
---
<spring:eval var="containsValue" expression="mylist.contains(myValue)" />
<c:if test="${containsValue}">style='display:none;'</c:if>
 -1
Author: xxg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 15:07:43
<c:if test="${fn:contains(task.subscribers, customer)}">
To mi pasuje.
 -3
Author: Vladislav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-26 18:16:23