Muszę ukryć element, jeśli na stronie JSP obecne są określone wartości
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.
Odpowiedzi:
Niestety, myślę, że JSTL nie obsługuje niczego poza iteracją przez wszystkie elementy, aby to zrozumieć. W przeszłości korzystałem z metody forEach w podstawowej bibliotece tagów:
<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 uruchomieniu $ {zawiera} będzie równe „true”, jeśli mojaLista zawiera myValue.
źródło
nie ma wbudowanej funkcji, która by to sprawdzała - co byś zrobił, to napisanie własnej funkcji tld, która pobiera listę i element i wywołuje metodę include () listy. na przykład
//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 metodę statyczną o nazwie zawiera z powyższym podpisem. Jestem pewien, że implementacja tej metody nie wymaga wyjaśnień:
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>
Znacznika można używać z dowolnej strony JSP w serwisie.
edycja: więcej informacji o pliku tld - więcej informacji tutaj
źródło
Collection
zamiastList
w taglib - działa tak samo, ale obsługuje więcej typów kolekcji, takich jakSet
sInnym sposobem na to jest użycie
Map (HashMap)
par z kluczem i 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]}">
Powinno to zwrócić prawdę, jeśli para istnieje na mapie
źródło
test="${isPresentByValue[myValue]}"
.Musisz użyć funkcji
fn:contains()
lubfn:containsIgnoreCase()
.<%@ 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>
Uwaga: to zadziała,
mylist.toString().contains("apple")
a jeśli nie jest to to, czego szukasz, lepiej użyj innego podejścia.źródło
mylist.toString().contains("apple")
absolutnie nie jest to, czego początkowo można by się spodziewać.Poniżej przedstawiono 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, rozwiązałoby to problem. Po prostu zmapuj swoje wartości na wartość inną niż null i zrób to
<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>
lub możesz nawet odwzorowaćstyle='display:none;
i po prostu wyprowadzić${mymap.myValue}
źródło
${fn:contains({1,2,4,8}, 2)}
LUB
<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>
źródło
Jeśli używasz EL 3.0+ , najlepszym podejściem w tym przypadku jest taka, jak ta inna odpowiedź wyjaśniona w innym temacie:
źródło
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>
źródło
To rozwiązanie wydało mi się niesamowite.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <% ArrayList list = new ArrayList(); list.add("one"); list.add("two"); list.add("three"); %> <c:set var="list" value="<%=list%>" /> <html> <body> My list is ${list}<br/> <c:if test='${fn:contains(list, "two")}'> My list contains two <br/> </c:if> <c:if test='${fn:contains(list, ",")}'> My list contains , </c:if> </body> </html>
Dane wyjściowe dla powyższego kodu to
Moja lista to [jeden, dwa, trzy]
Moja lista zawiera dwa
Moja lista zawiera,
Mam nadzieję, że to komuś pomoże.
źródło
<c:if test="${fn:contains(task.subscribers, customer)}">
U mnie to działa dobrze.
źródło