Necesito ocultar un elemento si ciertos valores están presentes en el JSP
Los valores se almacenan en una lista, así que intenté:
<c:if test="${ mylist.contains( myValue ) }">style='display:none;'</c:if>
Pero no funciona.
¿Cómo puedo evaluar si una lista contiene un valor en JSTL, la lista y los valores son cadenas?

Respuestas:
Lamentablemente, creo que JSTL no admite nada más que una iteración a través de todos los elementos para resolver esto. En el pasado, usé el método forEach en la biblioteca de etiquetas principal:
<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>Después de que esto se ejecute, $ {contiene} será igual a "verdadero" si myList contiene myValue.
fuente
no hay una función incorporada para verificar eso; lo que haría es escribir su propia función tld que toma una lista y un elemento, y llama al método contains () de la lista. p.ej
//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>Luego cree una clase llamada Yourclass y agregue un método estático llamado contains con la firma anterior. Estoy seguro de que la implementación de ese método se explica por sí misma:
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); } }Entonces puedes usarlo en tu jsp:
<%@ taglib uri="/WEB-INF/custom-functions.tld" prefix="fn" %> <c:if test="${ fn:contains( mylist, myValue ) }">style='display:none;'</c:if>La etiqueta se puede utilizar desde cualquier JSP del sitio.
editar: más información sobre el archivo tld - más información aquí
fuente
Collectionlugar deListen el taglib; funciona igual pero admite más tipos de colección comoSetsOtra forma de hacer esto es usando
Map (HashMap)pares de clave y valor que representen su objeto.Map<Long, Object> map = new HashMap<Long, Object>(); map.put(new Long(1), "one"); map.put(new Long(2), "two");En JSTL
<c:if test="${not empty map[1]}">Esto debería devolver verdadero si el par existe en el mapa
fuente
test="${isPresentByValue[myValue]}".Necesita utilizar la función
fn:contains()ofn: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>o
<c:if test="${not fn:contains(mylist, 'Apple')}"> <p>Contains 'Apple'</p> </c:if>Nota: Esto funcionará así
mylist.toString().contains("apple")y si esto no es lo que está buscando, mejor use otro enfoque.fuente
mylist.toString().contains("apple")que no es en absoluto lo que esperarías inicialmente.La siguiente es más una solución alternativa que una respuesta a su pregunta, pero puede ser lo que está buscando. Si puede poner sus valores en un mapa en lugar de una lista, eso resolvería su problema. Simplemente asigne sus valores a un valor no nulo y haga esto
<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>o incluso puede asignarstyle='display:none;y simplemente generar${mymap.myValue}fuente
${fn:contains({1,2,4,8}, 2)}O
<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>fuente
Si está utilizando EL 3.0+ , el mejor enfoque en este caso es como esta otra respuesta se explica en otro tema:
fuente
Si está usando Spring Framework, puede usar Spring TagLib y 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>fuente
Encontré esta solución asombrosa.
<%@ 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>La salida para el código anterior es
Mi lista es [uno, dos, tres]
Mi lista contiene dos
Mi lista contiene
Espero que esto ayude a alguien.
fuente
<c:if test="${fn:contains(task.subscribers, customer)}">Esto funciona bien para mi.
fuente