在JSTL中评估list.containsstring

如果JSP中存在某些值,我需要隐藏一个元素

值存储在一个列表,所以我试着:

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

但是,这是行不通的。

如何评估列表是否包含JSTL中的值,列表和值是否是string。

不幸的是,我认为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> 

运行之后,如果myList包含myValue,则$ {contains}将等于“true”。

没有内置的function来检查 – 你要做的是编写你自己的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> 

然后创build一个名为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中使用。

编辑:关于tld文件的更多信息 – 更多信息在这里

另一种方法是使用一个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,如果对存在于地图中

以下是更多的解决办法比你的问题的答案,但它可能是你在找什么。 如果你可以把你的价值观放在地图上,而不是列表上,那就能解决你的问题。 只需将你的值映射到一个非空值,并做到这一点<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)}"> 

这对我来说很好。