Ich habe eine Aufzählung namens 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 über VALID
einen JSTL-Tag auf den Wert von zugreifen . Insbesondere das test
Attribut des <c:when>
Tags. Z.B
<c:when test="${dp.status eq Status.VALID">
Ich bin mir nicht sicher, ob das möglich ist.
java
jsp
jakarta-ee
jstl
IaCoder
quelle
quelle
Bei Verwendung von Spring MVC kann die Spring Expression Language (SpEL) hilfreich sein:
quelle
<c:if>
und<c:when>
auftritt (sie schlagen leise fehl).Sie haben hier drei Möglichkeiten, von denen keine perfekt ist:
Sie können ein Scriptlet im
test
Attribut verwenden:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Dies verwendet die Aufzählung, aber es wird auch ein Scriptlet verwendet, was in JSP 2.0 nicht der "richtige Weg" ist. Am wichtigsten ist jedoch, dass dies nicht funktioniert, wenn Sie derselben
when
Verwendung eine weitere Bedingung hinzufügen möchten${}
. Dies bedeutet, dass alle Variablen, die Sie testen möchten, in einem Scriptlet deklariert oder in einer Anfrage oder Sitzung aufbewahrt werden müssen (pageContext
Variable ist in.tag
Dateien nicht verfügbar ).Sie können mit Zeichenfolge vergleichen:
<c:when test="${dp.status == 'VALID'}">
Das sieht sauber aus, aber Sie führen eine Zeichenfolge ein, die den Aufzählungswert dupliziert und vom Compiler nicht überprüft werden kann. Wenn Sie diesen Wert aus der Aufzählung entfernen oder umbenennen, sehen Sie nicht, dass auf diesen Teil des Codes nicht mehr zugegriffen werden kann. Grundsätzlich müssen Sie den Code jedes Mal durchsuchen / ersetzen.
Sie können jeden der von Ihnen verwendeten Aufzählungswerte zum Seitenkontext hinzufügen:
<c:set var="VALID" value="<%=Status.VALID%>"/>
und dann können Sie dies tun:
<c:when test="${dp.status == VALID}">
Ich bevorzuge die letzte Option (3), obwohl sie auch ein Scriptlet verwendet. Dies liegt daran, dass es nur verwendet wird, wenn Sie den Wert festlegen. Später können Sie es in komplexeren EL-Ausdrücken zusammen mit anderen EL-Bedingungen verwenden. In Option (1) können Sie kein Scriptlet und keinen EL-Ausdruck im
test
Attribut eines einzelnenwhen
Tags verwenden.quelle
Enum.valueOf(Class<T> enumType, String name)
der eine ausgelöst wird,ELException
wenn die Aufzählung keine Konstante mit diesem Namen hat. Der Ausdruck wird nicht immer falsch sein.Um mein Problem vollständig zu lösen, musste ich Folgendes tun:
Dann konnte ich tun:
das hat wie erwartet funktioniert.
quelle
Hier sind zwei weitere Möglichkeiten:
JSP EL 3.0-Konstanten
Solange Sie mindestens Version 3.0 von EL verwenden, können Sie Konstanten wie folgt in Ihre Seite importieren:
Einige IDEs verstehen dies jedoch noch nicht (z. B. IntelliJ ), sodass Sie bis zur Laufzeit keine Warnungen erhalten, wenn Sie einen Tippfehler machen.
Dies wäre meine bevorzugte Methode, sobald sie die richtige IDE-Unterstützung erhält.
Hilfsmethoden
Sie können Ihrer Aufzählung einfach Getter hinzufügen.
Dann in Ihrer JSP:
Dies wird in allen IDEs unterstützt und funktioniert auch, wenn Sie EL 3.0 noch nicht verwenden können. Dies ist, was ich im Moment mache, weil es die gesamte Logik in meiner Aufzählung festhält.
Seien Sie auch vorsichtig, wenn es möglich ist, dass die Variable, in der die Aufzählung gespeichert ist, null ist. Sie müssten dies zuerst überprüfen, wenn Ihr Code nicht garantiert, dass er nicht null ist:
Ich denke, diese Methode ist denen überlegen, bei denen Sie einen Zwischenwert in der JSP festlegen, da Sie dies auf jeder Seite tun müssen, auf der Sie die Aufzählung verwenden müssen. Bei dieser Lösung müssen Sie den Getter jedoch nur einmal deklarieren.
quelle
${MyEnum.}
, Caret direkt nach Punkt setzen und drückenCtrl+Space
, um Vorschläge anzuzeigen .Zu diesem Zweck mache ich Folgendes:
Es sieht hässlich aus, funktioniert aber!
quelle
Ich habe keine Antwort auf die Frage von Kornel, aber ich habe eine Bemerkung zu den anderen Skriptbeispielen. Der größte Teil des Ausdrucks vertraut implizit auf die
toString()
,Enum.valueOf()
erwartet jedoch einen Wert, der von derEnum.name()
Eigenschaft stammt / mit dieser übereinstimmt . Also sollte man zB verwenden:quelle
Fügen Sie der Aufzählung eine Methode hinzu, wie:
Beispielsweise
Dann können Sie verwenden:
quelle
Bei Verwendung eines MVC-Frameworks habe ich Folgendes in meinen Controller eingefügt.
Dadurch kann ich Folgendes auf meiner JSP-Seite verwenden.
Es kann auch in Ihrem Vergleich verwendet werden
Was ich lieber als ein String-Literal eingebe.
quelle
quelle
Ich halte es im Allgemeinen für eine schlechte Praxis, Java-Code in jsps / tag-Dateien zu mischen. Die Verwendung von 'eq' sollte den Trick machen:
quelle
==
statt zu verwendeneq
? Sie machen beide genau das gleiche, also gibt es keine Möglichkeit für einen "Trick".Ich mache es so, wenn es viele Punkte gibt ...
JSP
quelle
In der Java-Klasse:
Nun werden POJO und enum obj erstellt. Jetzt legen Sie EnumTest im Sitzungsobjekt fest, indem Sie in der Servlet- oder Controller-Klasse session.setAttribute ("enumTest", EnumTest) verwenden.
In der JSP-Seite
quelle