java - formulario - Evaluar list.conta string en JSTL
jstl maven (7)
La siguiente es más una solución 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 asignar un style=''display:none;
y simplemente ${mymap.myValue}
Necesito ocultar un elemento si ciertos valores están presentes en el JSP
Los valores se almacenan en una lista, así que probé:
<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?
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, he usado el método forEach en la biblioteca de etiquetas principales:
<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.
Necesita usar la función fn:contains()
o fn: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>
Otra forma de hacer esto es usar un Map (HashMap)
con los pares Clave, Valor que representan 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 volverse verdadero si el par existe en el mapa
Si está utilizando 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>
no hay una función incorporada para verificar eso: lo que haría sería 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 es bastante auto explicativa:
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 usar desde cualquier JSP en el sitio.
editar: más información sobre el archivo tld - más información aquí
<c:if test="${fn:contains(task.subscribers, customer)}">
Esto funciona bien para mi.