如果 JSP 中存在某些值,我需要隐藏一个元素
这些值存储在一个列表中,所以我尝试了:
<c:if test="${ mylist.contains( myValue ) }">style='display:none;'</c:if>
但是,它不起作用。
如何评估列表是否包含 JSTL 中的值,列表和值是字符串。
没有内置功能可以检查 - 您要做的是编写自己的 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 使用该标记。
编辑:有关 tld 文件的更多信息 - more info here
可悲的是,我认为 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”。
另一种方法是使用 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
test="${isPresentByValue[myValue]}"
。
您需要使用 fn:contains()
或 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>
或者
<c:if test="${not fn:contains(mylist, 'Apple')}">
<p>Contains 'Apple'</p>
</c:if>
注意:这将像 mylist.toString().contains("apple")
一样工作,如果这不是您想要的,则最好使用其他方法。
mylist.toString().contains("apple")
,这绝对不是您最初所期望的。
以下更多的是一种解决方法,而不是您的问题的答案,但它可能是您正在寻找的。如果您可以将值放在地图而不是列表中,那将解决您的问题。只需将您的值映射到非空值并执行此操作 <c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>
或者您甚至可以映射到 style='display:none;
并简单地输出 ${mymap.myValue}
${fn:contains({1,2,4,8}, 2)}
或者
<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>
如果您使用的是 EL 3.0+,在这种情况下,最佳方法是 this other answer 在另一个主题中解释:
对于 Collection 来说很简单,只需在 EL 中使用 Colleciton#contains() 方法。
你不能使用 fn:contains(),因为它是一个字符串比较。所以假设你的列表包含 11,12,13 并且你已经写了 fn:contains(list,'1'),它会给你“真实”的结果。但我希望你期待 false 因为 1 不在列表中。您应该创建自己的自定义标签以使用 list.contains(Object o)。
如果您使用的是 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>
我发现这个解决方案很棒。
<%@ 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>
上面代码的输出是
我的清单是[一、二、三]
我的清单包含两个
我的清单包含,
我希望它可以帮助某人。
<c:if test="${fn:contains(task.subscribers, customer)}">
这对我来说很好。
不定期副业成功案例分享
Collection
而不是List
- 它的工作原理相同,但支持更多的集合类型,如Set
s