特定の値がJSPに存在する場合、要素を非表示にする必要があります
値はリストに保存されるので、私は試しました:
<c:if test="${ mylist.contains( myValue ) }">style='display:none;'</c:if>
しかし、それは機能しません。
リストにJSTLの値が含まれている場合、リストと値が文字列であるかどうかをどのように評価できますか。
悲しいことに、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」に等しくなります。
それをチェックする組み込み機能はありません-あなたがすることは、リストとアイテムを取り、リストの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ファイルに関する詳細- 詳細はこちら
これを行う別の方法は、オブジェクトを表すキーと値のペアで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を返す必要があります
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>
以下は、あなたの質問への回答というよりも回避策ですが、探しているものかもしれません。値をリストではなくマップに配置できる場合、問題は解決します。値をnull以外の値にマッピングしてこれを行う[<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>
]またはstyle='display:none;
にマッピングして${mymap.myValue}
を出力することもできます
${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>