Оцените список.содержит строку в JSTL
Мне нужно скрыть элемент, если определенные значения присутствуют в JSP
значения хранятся в списке, поэтому я попытался:
<c:if test="${ mylist.contains( myValue ) }">style='display:none;'</c:if>
но это не работает.
Как я могу оценить, если список содержит значение в JSTL, список и значения являются строками.
7 ответов:
к сожалению, я думаю, что JSTL не поддерживает ничего, кроме итерации по всем элементам, чтобы понять это. В прошлом, я использовал метод forEach в основной библиотеке тег:
<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>
после этого запуска ${contains} будет равно "true", если myList содержит myValue.
нет встроенной функции, чтобы проверить это - то, что вы бы сделали, это написать свою собственную функцию tld, которая принимает список и элемент и вызывает метод списка contains (). например,
//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>
затем создайте класс с именем Yourclass и добавьте статический метод с именем contains с указанной выше сигнатурой. Я уверен, что реализация этого метода довольно понятны:
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); } }
тогда вы можете использовать его в своем jsp:
<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %> <c:if test="${ fn:contains( mylist, myValue ) }">style='display:none;'</c:if>
бирку можно использовать от любого JSP на сайте.
edit: дополнительная информация о файле tld -подробнее здесь
другой способ сделать это с помощью
Map (HashMap)
С ключом, пары значений, представляющие ваш объект.Map<Long, Object> map = new HashMap<Long, Object>(); map.put(new Long(1), "one"); map.put(new Long(2), "two");
В JSTL
<c:if test="${not empty map[1]}">
Это должно вернуть true, если пара существует в карте
вы должны использовать
fn:contains()
илиfn:containsIgnoreCase()
следующее-Это скорее временное решение, чем ответ на ваш вопрос, но это может быть то, что вы ищете. Если вы можете поместить свои значения в карту вместо списка, это решит вашу проблему. Просто сопоставьте свои значения с ненулевым значением и сделайте это
<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>
или вы даже можете сопоставить сstyle='display:none;
и просто выход${mymap.myValue}