2

ItemTypes のセットであるフィールドを持つ Item オブジェクトがあります。

public class Item {
    EnumSet<ItemType> itemTypeSet;

    ...

    public Set<ItemType> getItemTypeSet(){
        return this.itemTypeSet;
    }
}

もちろん、ItemType は単純な Enum です。

public Enum ItemType {
    BOLD, THIN, COOL, ROUND;
}

私の JSP では、アイテムに特定の ItemType があるかどうかを確認するために JSTL を使用したいと考えています。次の 3 つのスニペットを使用しようとしましたが、エラーも結果も得られません。3つすべてが失敗する理由はわかりません。誰かがこれらの 3 つのケースのそれぞれについて、私が思うようにプログラムが機能しない理由を説明し、機能している 4 番目の代替案を提供できますか :)?

<c:if test="${item.itemTypeSet.contains('BOLD')}">
    Method 1 works!
</c:if>
<c:if test="${item.itemTypeSet.contains(ItemType.valueOf('BOLD'))}">
    Method 2 works!
</c:if>
<c:if test="${item.itemTypeSet.contains(ItemType.BOLD)}">
    Method 3 works!
</c:if>

重要なのは、ItemType列挙型がパブリックであり、別のクラス内ではないことです。EL/JSTL/JSP を解決するクラスを含め、他のクラスから完全にアクセスできます。

enumset 内のすべての値を繰り返し処理しても問題ないことに注意してください。

<c:forEach items="${item.itemTypeSet}" var="itemType">
    <p>${itemType}</p>
</c:forEach>

結果として与えます:

BOLD
ROUND
4

1 に答える 1

2

方法 3 は EL 3.0 (Tomcat 8、WildFly 8、GlassFish 4 など) で機能しますが、EL で定数を参照する方法の指示に従って JSP ページ コンテキストで列挙型をインポートした場合に限ります。

<@page import="com.example.ItemType" %>

方法 2 は、理論的には EL 3.0 でも機能するはずですが、3 と比べると扱いにくいです。

ELはコレクションのジェネリック型を認識せず、構文Stringのためにプレーンであると想定しているため、方法1はまったく機能しません。基本的には絶対に通用しない隠れ家で${'...'}やってます。"BOLD".equals(BOLD)

これにカスタム EL 関数を作成することをお勧めします。カスタム EL 関数のキックオフ例については、この関連する質問の回答に進んでください: How can i do a multiselect in jsp/jstl with selected value? あなたはこのようなもので終わりたいと思います:

<c:if test="${my:containsEnum(item.itemTypeSet, 'BOLD')}">

そして、それに応じて Java マジックをcontainsEnum(Set, String)関数で実行します。

于 2016-02-22T17:58:18.757 に答える