在JSTL中评估list.contains字符串

时间:2009-09-29 01:28:55

标签: java jsp jstl

如果JSP中存在某些值

,我需要隐藏一个元素

值存储在List中,所以我尝试了:

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

但是,它不起作用。

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

11 个答案:

答案 0 :(得分:96)

没有内置功能来检查 - 你要做的是编写自己的tld函数,它接受一个列表和一个项目,并调用列表的contains()方法。 e.g。

//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

答案 1 :(得分:63)

可悲的是,我认为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”。

答案 2 :(得分:26)

另一种方法是使用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

答案 3 :(得分:10)

您需要使用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>

答案 4 :(得分:2)

以下是一个解决方法,而不是对您的问题的答案,但它可能是您正在寻找的。 如果您可以将值放在地图而不是列表中,那么这将解决您的问题。只需将您的值映射到非空值并执行此<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>,或者您甚至可以映射到style='display:none;并输出${mymap.myValue}

答案 5 :(得分:2)

${fn:contains({1,2,4,8}, 2)}

OR

  <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>

答案 6 :(得分:0)

如果您使用的是EL 3.0 + ,则这种情况下最好的方法是this other answer在另一个主题中进行了解释:

对于su: cannot set groups: Operation not permitted很简单,只需使用Collection EL中的方法。

Colleciton#contains()

对于<h:panelGroup id="p1" rendered="#{bean.panels.contains('p1')}">...</h:panelGroup> <h:panelGroup id="p2" rendered="#{bean.panels.contains('p2')}">...</h:panelGroup> <h:panelGroup id="p3" rendered="#{bean.panels.contains('p3')}">...</h:panelGroup> (数组),您至少需要EL 3.0并利用 其新的Lambda支持。

Object[]

如果您尚未使用EL 3.0,则需要创建一个自定义EL 功能。 [...]

答案 7 :(得分:0)

你不能使用 fn:contains(),因为它是一个字符串比较。因此,假设您的列表包含 11,12,13 并且您已编写 fn:contains(list,'1'),它将为您提供“真实”结果。但我希望您期待错误,因为 1 不在列表中。您应该创建自己的自定义标记以使用 list.contains(Object o)。

答案 8 :(得分:-1)

如果您使用的是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>

答案 9 :(得分:-1)

我发现这个解决方案很棒。

<%@ 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>

上面代码的输出是

我的名单是[1、2、3]

我的列表包含两个

我的列表包含,

我希望它能对某人有所帮助。

答案 10 :(得分:-2)

<c:if test="${fn:contains(task.subscribers, customer)}">

这对我来说很好。