Оценить list.contains строку в JSTL

Мне нужно скрыть элемент, если некоторые значения присутствуют в JSP

Значения хранятся в списке, поэтому я попытался:

<c:if test="${  mylist.contains( myValue ) }">style='display:none;'</c:if>

Но это не сработает.

Как я могу оценить, содержит ли список значение в JSTL, список и значения являются строками.

Ответ 1

К сожалению, я думаю, что 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.

Ответ 2

нет встроенной функции для проверки того, что: вы должны написать свою собственную функцию tld, которая принимает список и элемент, и вызывает метод list 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 и добавьте статический метод, который содержит указанную выше подпись. Я уверен, что реализация этого метода довольно понятна:

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 - подробнее здесь

Ответ 3

Другой способ сделать это - использовать Map (HashMap) с парами Key, Value, представляющими ваш объект.

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, если пара существует на карте

Ответ 4

Ниже приведено более обходное решение, чем ответ на ваш вопрос, но это может быть то, что вы ищете. Если вы можете поместить свои значения на карту вместо списка, это решит вашу проблему. Просто сопоставьте свои значения с ненулевым значением и сделайте это <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>, или вы даже можете перейти к style='display:none; и просто вывести ${mymap.myValue}

Ответ 5

Если вы используете Spring Framework, вы можете использовать Spring TagLib и 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>

Ответ 6

Вам нужно использовать fn:contains() или fn:containsIgnoreCase() вместо этого.

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

...

<c:forEach items="${datas}" var="data">
    <c:if test="${not fn:containsIgnoreCase(data, 'apple')}">
        <p>Doesn't contain 'apple'</p>
    </c:if>
</c:forEach>

Ответ 7

<c:if test="${fn:contains(task.subscribers, customer)}">

Это отлично работает для меня.