2009-09-29 13 views
73

でlist.contains文字列を評価します仕事はありません。は私が私が試した特定の値は、JSP</p> <p>に存在している場合は値がリストに保存されている要素を非表示にする必要がありJSTL

リストにJSTLの値が含まれているかどうかを評価するには、リストと値が文字列である必要があります。

+13

(2009年12月にリリースされたサーブレット3.0/JSP 2.2の一部としてもたらされる)EL 2.2以降intentedとして与えられた構文が動作することに注意してください。 – BalusC

+0

[JSTLセットとリスト - アイテムがセット内に存在するかどうかをチェックする]の重複可能性(http://stackoverflow.com/questions/1076679/jstl-sets-and-lists-checking-if-item-exists-in-a -set) –

答えて

58

悲しいことに、私は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が含まれている場合、$ {含まれている}が「真」に等しくなります。

+8

は、リストが小さければうまく動作します。このようにするには、パフォーマンスコストがあることだけを認識してください。 – Chii

+0

ええ、もしあなたが十分に高くなったら、それがあります。私は10-20のコレクションのためにそれを使用しており、パフォーマンスの問題は発生していません。私が思うに悪いことは、JSTLの行数です。それでも、これは自分のTLDを設定することなく唯一の方法だと思います(これはあまり難しくなく、価値があるかもしれません)。 –

92

これをチェックするための組み込み機能はありません。リストと項目をとる独自のtld関数を作成し、リストのcontains()メソッドを呼び出します。例えば

//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ファイルに関する詳細情報 - more info here

+0

: - Sコードはどこに置かれていますか?脅威に見える – OscarRyz

+1

iveは少し詳細で答えを編集しました。 – Chii

+4

taglibで 'List'の代わりに' Collection'を使うことをお勧めします。これは同じように動作しますが、 'Set'のような多くのコレクションのタイプをサポートします – Ralph

2

次はあなたの質問への答えよりも回避策の詳細ですが、それはあなたが探しているものかもしれません。 リストの代わりにマップに値を入れることができれば、それはあなたの問題を解決するでしょう。ただ、これを行うための別の方法は、あなたのオブジェクトを表すキーと値のペアを持つMap (HashMap)を使用している${mymap.myValue}

+0

構文は でなければなりませんスタイル= '表示:なし;' それ以外の場合、変数 "myValue"は評価されません。 – Andreas

25

をnull以外の値に自分の価値観をマッピングし、この<c:if test="${mymap.myValue ne null}">style='display:none;'</c:if>を行うか、あなたもstyle='display:none;にマッピングすることができますし、単に出力。ペアはマップ

+2

これは私の好みの方法でもあります。ビューに必要なすべてのものについて、viewmodelにハッシュマップを設定します。それらはEL構文とうまく統合され、検索時には高速です。 –

+0

キーが存在してもvalueがnullまたは空の場合はfalseを返します。 – Zai

+1

またはマップがブール値を保持している場合、 'test =" $ {isPresentByValue [myValue]} "'。 – Noumenon

-3
<c:if test="${fn:contains(task.subscribers, customer)}"> 

これが私のために正常に動作して存在する場合JSTL

<c:if test="${not empty map[1]}"> 

Map<Long, Object> map = new HashMap<Long, Object>(); 
map.put(new Long(1), "one"); 
map.put(new Long(2), "two"); 

は、これはtrueを返す必要があります。

+15

これは、両方の要素を文字列に変換した後でチェックしています。リストは文字列に変換され、要素ごとにチェックされません。 trueの場合、customer = "one"(2回一致) false for customer = "three"(一致しない) 顧客= "twenty"(これはあなたが見ているものではない)の真実 – rmarimon

+1

rmarimonの警告を知っているので、この答えは私の正確なユースケースにマッチしました。 – CodeReaper

-1

あなたは春のフレームワークを使用している場合は、春のTagLibのとSPELを使用することができます。

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
--- 
<spring:eval var="containsValue" expression="mylist.contains(myValue)" /> 
<c:if test="${containsValue}">style='display:none;'</c:if> 
-1

あなたが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> 
+0

@BalusC 1)答えがSOFであるという回答はありません。 2)あなたの投票前に考えてください、この答えは正しいです。私は答えを提供する前にこれをテストしました。私はそれをさらに明確にするために答えを更新しました。 – tkr

+0

@BalusC私は繰り返さないで、私はただの答えを提供しています。私は読者にもフィードをスプーンしたくありません。私はそれがSOの全体のポイントだと思う。それで、私たちはまだ受け入れられた答えがあるかどうかという質問に答えることができます。あなたのためにセーションをしませんか?また、私はあなたの下院議員を尊重します。なぜなら、私は100人以上の議員がいることを理解しているからです。あなたが答えを閉じたいならば、優しく投票を開いてください。 – tkr

関連する問題