107

私はそのように定義されたステータスと呼ばれる列挙型を持っています:

public enum Status { 

    VALID("valid"), OLD("old");

    private final String val;

    Status(String val) {
        this.val = val;
    }

    public String getStatus() {
        return val;
    }

}

VALIDJSTL タグからの値にアクセスしたいと思います。特にタグのtest属性。<c:when>例えば

<c:when test="${dp.status eq Status.VALID">

これが可能かどうかはわかりません。

4

13 に答える 13

115

文字列に対する単純な比較は次のように機能します。

<c:when test="${someModel.status == 'OLD'}">
于 2008-12-15T14:27:13.493 に答える
54

Spring MVC を使用している場合は、Spring Expression Language (SpEL) が役立ちます。

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>
于 2011-05-02T09:57:08.953 に答える
41

ここには 3 つの選択肢がありますが、どれも完璧ではありません。

  1. test属性でスクリプトレットを使用できます。

    <c:when test="<%= dp.getStatus() == Status.VALID %>">

    これは列挙型を使用しますが、JSP 2.0 の「正しい方法」ではないスクリプトレットも使用します。whenしかし、最も重要なことは、を使用して同じ条件に別の条件を追加したい場合、これは機能しません${}。これは、テストするすべての変数をスクリプトレットで宣言するか、リクエストまたはセッションで保持する必要があることを意味します ( pageContextvariable は.tagファイルでは使用できません)。

  2. 文字列と比較できます:

    <c:when test="${dp.status == 'VALID'}">

    これはきれいに見えますが、列挙値を複製し、コンパイラによって検証できない文字列を導入しています。そのため、列挙型からその値を削除するか名前を変更すると、コードのこの部分にアクセスできなくなることはありません。基本的に、毎回コードを検索/置換する必要があります。

  3. 使用する各列挙値をページ コンテキストに追加できます。

    <c:set var="VALID" value="<%=Status.VALID%>"/>

    そして、これを行うことができます:

    <c:when test="${dp.status == VALID}">

スクリプトレットも使用しますが、私は最後のオプション (3) を好みます。これは、値を設定するときにのみ使用するためです。後で、他の EL 条件と一緒に、より複雑な EL 式で使用できます。testオプション (1) では、単一whenタグの属性でスクリプトレットと EL 式を使用することはできません。

于 2013-05-22T13:16:45.970 に答える
23

したがって、問題を完全に解決するには、次のことを行う必要がありました。

<% pageContext.setAttribute("old", Status.OLD); %>

それから私はすることができました:

<c:when test="${someModel.status == old}"/>...</c:when>

期待どおりに機能しました。

于 2008-09-24T21:09:33.823 に答える
10

この目的のために、私は次のことを行います。

<c:set var="abc">
    <%=Status.OLD.getStatus()%>
</c:set>

<c:if test="${someVariable == abc}">
    ....
</c:if>

見た目は悪いですが、機能します。

于 2009-07-10T15:32:56.250 に答える
3

Kornel の質問に対する回答はありませんが、他のスクリプトの例についてコメントがあります。ほとんどの式は を暗黙的に信頼しますtoString()が、はプロパティEnum.valueOf()に由来する/一致する値を期待しEnum.name()ます。したがって、次のように使用する必要があります。

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %>
...
<c:when test="${someModel.status == Status_OLD}"/>...</c:when>
于 2011-03-17T15:24:54.760 に答える
2

次のようなメソッドを列挙型に追加します。

public String getString() {
    return this.name();
}

例えば

public enum MyEnum {
    VALUE_1,
    VALUE_2;
    public String getString() {
        return this.name();
    }
}

次に、次を使用できます。

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if>
于 2010-12-15T01:34:48.897 に答える
1

MVC フレームワークを使用する場合、コントローラーに以下を入れます。

request.setAttribute(RequestParameterNamesEnum.INBOX_ACTION.name(), RequestParameterNamesEnum.INBOX_ACTION.name());

これにより、JSP ページで以下を使用できます。

<script> var url = 'http://www.nowhere.com/?${INBOX_ACTION}=' + someValue;</script>

比較にも使えます

<c:when test="${someModel.action == INBOX_ACTION}">

文字列リテラルを入れるよりもどちらが好きですか。

于 2017-07-10T16:21:41.293 に答える
-1

私は一般的に、java コードを jsps/tag ファイルに混在させるのは悪い習慣だと考えています。「eq」を使用すると、うまくいくはずです:

<c:if test="${dp.Status eq 'OLD'}">
  ...
</c:if>
于 2009-11-24T02:17:58.367 に答える
-2

Java クラス:

    public class EnumTest{
    //Other property link
    private String name;
    ....

        public enum Status {
                ACTIVE,NEWLINK, BROADCASTED, PENDING, CLICKED, VERIFIED, AWARDED, INACTIVE, EXPIRED, DELETED_BY_ADMIN;
            }

        private Status statusobj ;

    //Getter and Setters
}

これで POJO と enum obj が作成されました。ここでEnumTestを、サーブレットまたはコントローラー クラス session.setAttribute("enumTest", EnumTest ); を使用してセッション オブジェクトに設定します。

JSP ページ内

<c:if test="${enumTest.statusobj == 'ACTIVE'}">

//TRUE??? THEN PROCESS SOME LOGIC
于 2016-06-15T19:51:27.440 に答える