Оцените список.содержит строку в JSTL


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

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

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

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

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

7 78

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}

Если вы используете 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>
<c:if test="${fn:contains(task.subscribers, customer)}">

Это прекрасно работает для меня.