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