Frage

Ich habe eine Enum genannt Den Status als solche definiert:

public enum Status { 

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

    private final String val;

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

    public String getStatus() {
        return val;
    }

}

Ich möchte den Wert von VALID von einem JSTL-Tag zugreifen. Insbesondere das test Attribut des <c:when>-Tag. Z.

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

Ich bin mir nicht sicher, ob dies möglich ist.

War es hilfreich?

Lösung

Ein einfacher Vergleich gegen String funktioniert:

<c:when test="${someModel.status == 'OLD'}">

Andere Tipps

Bei der Verwendung von Spring MVC, die Frühlings-Expression Language (Spel) kann hilfreich sein:

<spring:eval expression="dp.status == T(com.example.Status).VALID" var="isValid" />
<c:if test="${isValid}">
   isValid
</c:if>

Sie haben 3 Möglichkeiten hier, von denen keiner ist perfekt:

  1. Sie können eine scriptlet im test Attribute verwenden:

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

    Dies verwendet die Enum, aber es nutzt auch einen scriptlet, die nicht der „richtige Weg“ in JSP 2.0 ist. Aber am wichtigsten ist, bedeutet dies nicht, wenn Sie eine weitere Bedingung auf die gleiche when mit ${} hinzufügen möchten. Und das bedeutet, dass alle Variablen, die Sie testen möchten, haben in einem scriptlet deklariert werden, oder in Anforderung gehalten oder Sitzung (pageContext Variable ist in .tag Dateien nicht verfügbar).

  2. Sie können gegen Zeichenfolge vergleichen:

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

    Das sieht sauber, aber Sie sind die Einführung einer Zeichenfolge, die den ENUM-Wert dupliziert und nicht durch den Compiler überprüft werden können. Also, wenn Sie diesen Wert aus dem Enum entfernen oder umbenennen, werden Sie nicht sehen, dass dieser Teil des Codes nicht mehr zugänglich ist. Sie haben grundsätzlich eine Suchen / Ersetzen durch den Code jedes Mal zu tun.

  3. Sie können jeden der ENUM-Werte Sie in den Seitenkontext verwenden hinzuzufügen:

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

    und dann können Sie dies tun:

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

Ich ziehe es die letzte Option (3), obwohl es auch ein scriptlet verwendet. Dies ist, weil es nur verwendet, wenn Sie den Wert eingestellt. Später können Sie es in komplexeren EL Ausdrücke verwenden, zusammen mit anderen EL Bedingungen. Während in Option (1) Sie können keine scriptlet und ein EL-Ausdruck in der test Attribut eines einzelnen when Tag verwenden.

So mein Problem vollständig gelöst zu werden brauchte ich Folgendes zu tun:

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

Dann war ich in der Lage zu tun:

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

, die funktionierten wie erwartet.

Hier sind zwei weitere Möglichkeiten:

JSP EL 3.0 Konstanten

Solange Sie mindestens Version 3.0 von EL verwenden, dann können Sie Konstanten in die Seite importieren wie folgt:

<%@ page import="org.example.Status" %>
<c:when test="${dp.status eq Status.VALID}">

Doch einige IDEs nicht verstehen dies noch (zB IntelliJ ), so dass Sie wird keine Warnungen erhalten, wenn Sie einen Tippfehler machen, erst zur Laufzeit.

Das wäre meine bevorzugte Methode sein, wenn es richtig IDE-Unterstützung bekommt.

Hilfsmethoden

Sie können nur hinzufügen Getter auf Ihre Enum.

public enum Status { 
  VALID("valid"), OLD("old");

  private final String val;

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

  public String getStatus() {
    return val;
  }

  public boolean isValid() {
    return this == VALID;
  }

  public boolean isOld() {
    return this == OLD;
  }
}

Dann in Ihrer JSP:

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

Dies ist in allen IDEs unterstützt und wird auch funktionieren, wenn Sie nicht EL 3.0 noch verwenden können. Dies ist, was ich im Moment tun, weil es die gesamte Logik in meine Enum eingewickelt hält.

Seien Sie auch vorsichtig sein, wenn es möglich ist, für die Variable des ENUM-Speicherung null zu sein. Sie würden für die ersten überprüfen müssen, wenn Ihr Code nicht garantieren, dass es nicht null ist:

<c:when test="${not empty db.status and dp.status.valid}">

Ich denke, diese Methode zu denjenigen überlegen ist, wo Sie einen Vermittler Wert in der JSP gesetzt, weil Sie, dass auf jeder Seite zu tun haben, in dem Sie die ENUM verwenden müssen. Doch mit dieser Lösung müssen Sie nur den Getter einmal erklären.

Für diese Zwecke ich folgendes tun:

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

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

Es sieht hässlich aus, aber funktioniert!

Ich habe keine Antwort auf die Frage von Kornel, aber ich habe eine Bemerkung über die anderen Skriptbeispiele. Die meisten der Ausdruck Vertrauen implizit auf dem toString(), aber der Enum.valueOf() erwartet ein Wert, der von / entspricht dem Enum.name() Eigenschaft kommt. Also sollte man verwenden, z.

<% pageContext.setAttribute("Status_OLD", Status.OLD.name()); %>
...
<c:when test="${someModel.status == Status_OLD}"/>...</c:when>

Fügen Sie eine Methode zum ENUM wie:

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

Zum Beispiel

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

Dann können Sie:

<c:if test="${myObject.myEnumProperty.string eq 'VALUE_2'}">...</c:if>

Wenn Sie einen MVC-Framework ich folgend in meinem Controller setzen.

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

Dies ermöglicht es mir die folgenden in meiner JSP-Seite zu verwenden.

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

Es kann auch in Ihrem Vergleich verwendet wird

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

Was ich lieber über wörtliches in einem String setzen.

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

1. ${dp.status eq Title.VALID.getStatus()}
2. ${dp.status eq Title.VALID}
3. ${dp.status eq Title.VALID.toString()}
  • Setzen Sie den Import auf oben , in JSP Seitenkopf
  • Wenn Sie mit getStatus Methode arbeiten möchten, verwenden Sie # 1
  • Wenn Sie mit dem Enum Elemente arbeiten wollen selbst, entweder # 2 oder # 3
  • Sie können == anstelle von eq

ich es in der Regel als schlecht Praxis Java-Code zu mischen in jsps / Tag-Dateien. 'Eq' Mit Hilfe sollte es tun:

<c:if test="${dp.Status eq 'OLD'}">
  ...
</c:if>

Ich mache es auf diese Weise, wenn es viele Punkte zu verwenden ...

public enum Status { 

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

    private final String val;

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

    public String getStatus() {
        return val;
    }

    public static void setRequestAttributes(HttpServletRequest request) {
        Map<String,String> vals = new HashMap<String,String>();
        for (Status val : Status.values()) {
            vals.put(val.name(), val.value);
        }
        request.setAttribute("Status", vals);
    }

}

JSP

<%@ page import="...Status" %>
<% Status.setRequestAttributes(request) %>

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

In Java-Klasse:

    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
}

So, jetzt POJO und Enum obj erstellt. Jetzt EnumTest Sie werden in Session-Objekt festgelegt in der Servlet oder Controller-Klasse session.setAttribute ( "enumTest", EnumTest);

In JSP Seite

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

//TRUE??? THEN PROCESS SOME LOGIC
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top