web-dev-qa-db-ja.com

JSTLセットとリスト-アイテムがセットに存在するかどうかの確認

セッションにJavaセットがあり、セッションにも変数があります。その変数がセットに存在するかどうかを確認できるようにする必要があります。

リストとセットにJavaが含む)(Object)メソッドを使用して、そのオブジェクトがセットに存在するかどうかをテストしたい。

JSTLでそれは可能ですか?もしそうなら、どうですか? :)

ありがとう、アレックス

29
Alex Genadinik

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')}
41
McDowell

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}
1
xxg