评估列表。包含 JSTL 中的字符串

2022-08-31 11:06:59

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

这些值存储在列表中,所以我尝试了:

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

但是,它不起作用。

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


答案 1

没有内置功能可以检查这一点 - 你会做的是编写自己的tld函数,该函数采用列表和项,并调用列表的recluses()方法。例如:

//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文件的更多信息 - 更多信息在这里


答案 2

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