Mam Enum o nazwie Status zdefiniowany jako:
public enum Status {
VALID("valid"), OLD("old");
private final String val;
Status(String val) {
this.val = val;
}
public String getStatus() {
return val;
}
}
Chciałbym uzyskać dostęp do wartości VALID
z tagu JSTL. W szczególności test
atrybut <c:when>
tagu. Na przykład
<c:when test="${dp.status eq Status.VALID">
Nie jestem pewien, czy jest to możliwe.
java
jsp
jakarta-ee
jstl
IaCoder
źródło
źródło
W przypadku korzystania ze Spring MVC pomocny może być język Spring Expression Language (SpEL):
źródło
<c:if>
i<c:when>
(po cichu zawodzą).Masz tutaj 3 możliwości, z których żadna nie jest idealna:
Możesz użyć skryptletu w
test
atrybucie:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Używa to wyliczenia, ale także skryptletu, co nie jest „właściwą drogą” w JSP 2.0. Ale co najważniejsze, nie działa to, gdy chcesz dodać kolejny warunek do tego samego
when
użycia${}
. A to oznacza, że wszystkie zmienne, które chcesz przetestować, muszą być zadeklarowane w skrypcie, przechowywane w żądaniu lub sesji (pageContext
zmienna nie jest dostępna w.tag
plikach).Możesz porównać ze stringiem:
<c:when test="${dp.status == 'VALID'}">
Wygląda to na czysty, ale wprowadzasz ciąg, który duplikuje wartość wyliczenia i nie może zostać zweryfikowany przez kompilator. Więc jeśli usuniesz tę wartość z wyliczenia lub zmienisz jej nazwę, nie zobaczysz, że ta część kodu nie jest już dostępna. Zasadniczo za każdym razem musisz wyszukiwać / zastępować kod.
Możesz dodać każdą z używanych wartości wyliczenia do kontekstu strony:
<c:set var="VALID" value="<%=Status.VALID%>"/>
a następnie możesz to zrobić:
<c:when test="${dp.status == VALID}">
Wolę ostatnią opcję (3), mimo że również używa skryptletu. Dzieje się tak, ponieważ używa go tylko podczas ustawiania wartości. Później możesz go używać w bardziej złożonych wyrażeniach EL, razem z innymi warunkami EL. W opcji (1) nie możesz używać skryptletu i wyrażenia EL w
test
atrybucie pojedynczegowhen
znacznika.źródło
Enum.valueOf(Class<T> enumType, String name)
co spowoduje wyzwolenie,ELException
jeśli wyliczenie nie ma stałej o tej nazwie. Wyrażenie nie zawsze będzie fałszywe.Aby w pełni rozwiązać problem, musiałem wykonać następujące czynności:
Wtedy mogłem zrobić:
który działał zgodnie z oczekiwaniami.
źródło
Oto dwie dodatkowe możliwości:
Stałe JSP EL 3.0
Jeśli używasz co najmniej wersji 3.0 EL, możesz importować stałe do swojej strony w następujący sposób:
Jednak niektóre IDE jeszcze tego nie rozumieją (np. IntelliJ ), więc nie otrzymasz żadnych ostrzeżeń, jeśli popełnisz literówkę, aż do czasu uruchomienia.
To byłaby moja preferowana metoda, gdy uzyska odpowiednią obsługę IDE.
Metody pomocnicze
Możesz po prostu dodać metody pobierające do swojego wyliczenia.
Następnie w Twoim JSP:
Jest to obsługiwane we wszystkich IDE i będzie działać również, jeśli nie możesz jeszcze używać EL 3.0. To właśnie robię w tej chwili, ponieważ utrzymuje całą logikę zawiniętą w moim wyliczeniu.
Uważaj także, jeśli zmienna przechowująca wyliczenie może mieć wartość null. Najpierw musisz to sprawdzić, jeśli twój kod nie gwarantuje, że nie jest pusty:
Myślę, że ta metoda jest lepsza od tych, w których ustawiasz wartość pośrednią na stronie JSP, ponieważ musisz to zrobić na każdej stronie, na której musisz użyć wyliczenia. Jednak w przypadku tego rozwiązania wystarczy tylko raz zadeklarować getter.
źródło
${MyEnum.}
, umieść kursor tuż po kropce i naciśnij,Ctrl+Space
aby wyświetlić sugestie.W tym celu wykonuję następujące czynności:
Wygląda brzydko, ale działa!
źródło
Nie mam odpowiedzi na pytanie Kornela, ale mam uwagę na temat innych przykładów skryptów. Większość wyrażeń ufa niejawnie do
toString()
, aleEnum.valueOf()
oczekuje wartości, która pochodzi z / pasuje doEnum.name()
właściwości. Należy więc użyć np .:źródło
Dodaj metodę do wyliczenia, na przykład:
Na przykład
Następnie możesz użyć:
źródło
Korzystając z frameworka MVC, umieszczam w moim kontrolerze.
Dzięki temu mogę używać następujących elementów na mojej stronie JSP.
Można go również użyć w porównaniu
Które wolę od umieszczania dosłownego ciągu.
źródło
źródło
Generalnie uważam za złą praktykę mieszanie kodu java z plikami jsps / tag. Użycie „eq” powinno załatwić sprawę:
źródło
==
zamiast tego jest złą praktykąeq
? Robią dokładnie to samo, więc nie ma sposobu na „sztuczkę”.Robię to w ten sposób, gdy jest wiele punktów do wykorzystania ...
JSP
źródło
W klasie Java:
Więc teraz tworzony jest POJO i enum obj. Teraz EnumTest ustawisz w obiekcie sesyjnym za pomocą klasy serwletu lub kontrolera session.setAttribute ("enumTest", EnumTest);
Na stronie JSP
źródło