Saya memiliki Enum yang disebut Status yang didefinisikan sebagai berikut:
public enum Status {
VALID("valid"), OLD("old");
private final String val;
Status(String val) {
this.val = val;
}
public String getStatus() {
return val;
}
}
Saya ingin mengakses nilai dari VALID
tag JSTL. Khususnya test
atribut <c:when>
tag. Misalnya
<c:when test="${dp.status eq Status.VALID">
Saya tidak yakin apakah ini mungkin.
java
jsp
jakarta-ee
jstl
IaCoder
sumber
sumber
Jika menggunakan Spring MVC, Spring Expression Language (SpEL) dapat membantu:
sumber
<c:if>
dan<c:when>
(gagal diam-diam).Anda memiliki 3 pilihan di sini, tidak ada yang sempurna:
Anda dapat menggunakan scriptlet di
test
atribut:<c:when test="<%= dp.getStatus() == Status.VALID %>">
Ini menggunakan enum, tetapi juga menggunakan scriptlet, yang bukan merupakan "cara yang benar" di JSP 2.0. Tapi yang paling penting, ini tidak bekerja ketika Anda ingin menambahkan kondisi lain untuk sama
when
menggunakan${}
. Dan ini berarti semua variabel yang ingin Anda uji harus dideklarasikan dalam scriptlet, atau disimpan dalam permintaan, atau sesi (pageContext
variabel tidak tersedia dalam.tag
file).Anda dapat membandingkan dengan string:
<c:when test="${dp.status == 'VALID'}">
Ini terlihat bersih, tetapi Anda memperkenalkan string yang menduplikasi nilai enum dan tidak dapat divalidasi oleh kompilator. Jadi jika Anda menghapus nilai itu dari enum atau mengganti namanya, Anda tidak akan melihat bahwa bagian kode ini tidak dapat diakses lagi. Anda pada dasarnya harus melakukan pencarian / penggantian melalui kode setiap kali.
Anda dapat menambahkan setiap nilai enum yang Anda gunakan ke dalam konteks halaman:
<c:set var="VALID" value="<%=Status.VALID%>"/>
dan kemudian Anda dapat melakukan ini:
<c:when test="${dp.status == VALID}">
Saya lebih suka opsi terakhir (3), meskipun itu juga menggunakan scriptlet. Ini karena ini hanya menggunakannya saat Anda menyetel nilainya. Nanti Anda bisa menggunakannya dalam ekspresi EL yang lebih kompleks, bersama dengan kondisi EL lainnya. Sedangkan pada opsi (1) Anda tidak dapat menggunakan scriptlet dan ekspresi EL dalam
test
atributwhen
tag tunggal .sumber
Enum.valueOf(Class<T> enumType, String name)
yang akan memicuELException
jika enum tidak memiliki konstanta dengan nama itu. Ungkapannya tidak akan selalu salah.Jadi untuk menyelesaikan masalah saya sepenuhnya, saya perlu melakukan hal berikut:
Kemudian saya bisa melakukan:
yang bekerja seperti yang diharapkan.
sumber
Berikut dua kemungkinan lagi:
Konstanta JSP EL 3.0
Selama Anda menggunakan setidaknya versi 3.0 dari EL, Anda dapat mengimpor konstanta ke halaman Anda sebagai berikut:
Namun, beberapa IDE belum memahami hal ini (mis. IntelliJ ) sehingga Anda tidak akan mendapatkan peringatan jika salah ketik, hingga runtime.
Ini akan menjadi metode pilihan saya setelah mendapat dukungan IDE yang tepat.
Metode Pembantu
Anda bisa menambahkan getter ke enum Anda.
Kemudian di JSP Anda:
Ini didukung di semua IDE dan juga akan berfungsi jika Anda belum dapat menggunakan EL 3.0. Inilah yang saya lakukan saat ini karena itu membuat semua logika tetap terbungkus dalam enum saya.
Juga berhati-hatilah jika memungkinkan untuk variabel yang menyimpan enum menjadi null. Anda perlu memeriksanya terlebih dahulu jika kode Anda tidak menjamin bahwa itu bukan null:
Saya pikir metode ini lebih unggul daripada metode di mana Anda menetapkan nilai perantara di JSP karena Anda harus melakukannya di setiap halaman di mana Anda perlu menggunakan enum. Namun, dengan solusi ini Anda hanya perlu mendeklarasikan pengambil satu kali.
sumber
${MyEnum.}
, beri tanda sisipan tepat setelah titik dan tekanCtrl+Space
untuk menampilkan saran.Untuk tujuan ini saya melakukan hal berikut:
Ini terlihat jelek, tapi berhasil!
sumber
Saya tidak punya jawaban untuk pertanyaan Kornel, tapi saya punya komentar tentang contoh skrip lainnya. Sebagian besar ekspresi percaya secara implisit pada
toString()
, tetapiEnum.valueOf()
mengharapkan nilai yang berasal dari / cocok denganEnum.name()
properti. Jadi seseorang harus menggunakan mis:sumber
Tambahkan metode ke enum seperti:
Sebagai contoh
Kemudian Anda dapat menggunakan:
sumber
Saat menggunakan kerangka MVC saya meletakkan yang berikut ini di pengontrol saya.
Ini memungkinkan saya untuk menggunakan berikut ini di Halaman JSP saya.
Ini juga dapat digunakan dalam perbandingan Anda
Yang saya lebih suka daripada memasukkan string literal.
sumber
sumber
Saya biasanya menganggap itu praktik yang buruk untuk mencampur kode java ke dalam file jsps / tag. Menggunakan 'eq' seharusnya berhasil:
sumber
==
bukaneq
? Mereka melakukan keduanya persis sama, jadi tidak ada cara "trik".Saya melakukannya dengan cara ini ketika ada banyak poin untuk digunakan ...
JSP
sumber
Di Kelas Java:
Jadi sekarang POJO dan enum obj dibuat. Sekarang EnumTest Anda akan mengatur objek sesi menggunakan di servlet atau kelas controller session.setAttribute ("enumTest", EnumTest);
Di Halaman JSP
sumber