【问题标题】:JSTL Sets and Lists - checking if item exists in a SetJSTL 集合和列表 - 检查集合中是否存在项目
【发布时间】:2010-11-07 18:44:31
【问题描述】:

我的会话中有一个 Java 集,会话中还有一个变量。我需要能够判断该变量是否存在于集合中。

我想使用 Java 为 Lists 和 Sets 提供的 contains ( Object ) 方法来测试该对象是否存在于集合中。

在 JSTL 中可以做到吗?如果是这样,怎么做? :)

谢谢, 亚历克斯

【问题讨论】:

    标签: list jstl set


    【解决方案1】:

    您可以使用 JSTL 标记执行此操作,但结果不是最佳:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <html>
    <body>
    
    <jsp:useBean id="numbers" class="java.util.HashSet" scope="request">
        <%
            numbers.add("one");
            numbers.add("two");
            numbers.add("three");
        %>
    </jsp:useBean>
    
    <c:forEach items="${numbers}" var="value">
        <c:if test="${value == 'two'}">
            <c:set var="found" value="true" scope="request" />
        </c:if>
    </c:forEach>
    ${found}
    
    </body>
    </html>
    

    更好的方法是使用自定义函数:

    package my.package;
    public class Util {
    
      public static boolean contains(Collection<?> coll, Object o) {
        if (coll == null) return false;
        return coll.contains(o);
      }
    
    }
    

    这是在 TLD 文件中定义的ROOT/WEB-INF/tag/custom.tld:

    <?xml version="1.0" encoding="UTF-8"?>
    <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
      version="2.1">
      <tlib-version>1.0</tlib-version>
        <short-name>myfn</short-name>
        <uri>http://samplefn</uri>
        <function>
          <name>contains</name>
          <function-class>my.package.Util</function-class>
          <function-signature>boolean contains(java.util.Collection,
              java.lang.Object)</function-signature>
      </function>
    </taglib>
    

    然后可以将该函数导入到您的 JSP 中:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ taglib prefix="myfn" uri="http://samplefn"%>
    <html>
    <body>
    
    <jsp:useBean id="numbers" class="java.util.HashSet" scope="request">
        <%
            numbers.add("one");
            numbers.add("two");
            numbers.add("three");
        %>
    </jsp:useBean>
    
    ${myfn:contains(numbers, 'one')}
    ${myfn:contains(numbers, 'zero')}
    
    </body>
    </html>
    

    EL 的下一个版本(在 JEE6 中到期)应该允许更直接的形式:

    ${numbers.contains('two')}
    

    【讨论】:

    • +1 用于使用自定义功能。这是正确的方法和可重复使用:)
    【解决方案2】:

    如果您使用的是 Spring Framework,则可以使用 Spring TagLib 和 SpEL:

    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    ---
    <spring:eval var="containsValue" expression="yourList.contains(yourValue)" />
    
    Contains (true or false): ${containsValue}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2023-03-22
      • 2018-08-11
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多