web-dev-qa-db-ja.com

list.contains文字列をJSTLで評価します

特定の値がJSPに存在する場合、要素を非表示にする必要があります

値はリストに保存されるので、私は試しました:

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

しかし、それは機能しません。

リストにJSTLの値が含まれている場合、リストと値が文字列であるかどうかをどのように評価できますか。

84
OscarRyz

悲しいことに、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」に等しくなります。

63
Kaleb Brasee

それをチェックする組み込み機能はありません-あなたがすることは、リストとアイテムを取り、リストのcontains()メソッドを呼び出す独自のtld関数を書くことです。例えば.

//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ファイルに関する詳細- 詳細はこちら

96
Chii

これを行う別の方法は、オブジェクトを表すキーと値のペアで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を返す必要があります

26
tamersalama

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

以下は、あなたの質問への回答というよりも回避策ですが、探しているものかもしれません。値をリストではなくマップに配置できる場合、問題は解決します。値をnull以外の値にマッピングしてこれを行う[<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>]またはstyle='display:none;にマッピングして${mymap.myValue}を出力することもできます

2
svachon
${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>
2
Tony Hung