EL 3.0 atau yang lebih baru
Jika Anda sudah menggunakan Java EE 7 / EL 3.0, maka @page import
konstanta kelas juga akan diimpor dalam lingkup EL.
<%@ page import="com.example.YourConstants" %>
Ini akan di bawah sampul diimpor melalui ImportHandler#importClass()
dan tersedia sebagai${YourConstants.FOO}
.
Perhatikan bahwa semua java.lang.*
kelas sudah diimpor secara implisit dan tersedia seperti itu ${Boolean.TRUE}
dan ${Integer.MAX_VALUE}
. Ini hanya membutuhkan server kontainer Java EE 7 yang lebih baru karena versi awal memiliki bug dalam hal ini. Misalnya GlassFish 4.0 dan Tomcat 8.0.0-1x gagal, tetapi GlassFish 4.1+ dan Tomcat 8.0.2x + berfungsi. Dan Anda harus benar-benar memastikan bahwa Anda web.xml
dinyatakan sesuai dengan versi servlet terbaru yang didukung oleh server. Jadi dengan web.xml
yang dinyatakan sesuai dengan Servlet 2.5 atau lebih tua, tidak ada fitur Servlet 3.0+ yang akan bekerja.
Perhatikan juga bahwa fasilitas ini hanya tersedia di JSP dan bukan di Facelet. Dalam kasus JSF + Facelet, taruhan terbaik Anda adalah menggunakan OmniFaces<o:importConstants>
seperti di bawah ini:
<o:importConstants type="com.example.YourConstants" />
Atau menambahkan pendengar konteks EL yang memanggil ImportHandler#importClass()
seperti di bawah ini:
@ManagedBean(eager=true)
@ApplicationScoped
public class Config {
@PostConstruct
public void init() {
FacesContext.getCurrentInstance().getApplication().addELContextListener(new ELContextListener() {
@Override
public void contextCreated(ELContextEvent event) {
event.getELContext().getImportHandler().importClass("com.example.YourConstants");
}
});
}
}
EL 2.2 atau lebih tua
Ini tidak mungkin di EL 2.2 dan yang lebih lama. Ada beberapa alternatif:
Tempatkan mereka di tempat Map<String, Object>
yang Anda masukkan dalam ruang lingkup aplikasi. Dalam EL, nilai peta dapat diakses dengan cara Javabean biasa dengan ${map.key}
atau ${map['key.with.dots']}
.
Gunakan <un:useConstants>
dari Unstandard taglib (maven2 repo di sini ):
<%@ taglib uri="http://jakarta.apache.org/taglibs/unstandard-1.0" prefix="un" %>
<un:useConstants className="com.example.YourConstants" var="constants" />
Dengan cara ini mereka dapat diakses dengan cara Javabean biasa ${constants.FOO}
.
Gunakan CCC Javaranch <ccc:constantsMap>
seperti yang dijelaskan di suatu tempat di bagian bawah artikel ini .
<%@ taglib uri="http://bibeault.org/tld/ccc" prefix="ccc" %>
<ccc:constantsMap className="com.example.YourConstants" var="constants" />
Dengan cara ini mereka dapat diakses dengan cara Javabean biasa ${constants.FOO}
juga.
Jika Anda menggunakan JSF2, maka Anda bisa menggunakan <o:importConstants>
dari OmniFaces .
<html ... xmlns:o="http://omnifaces.org/ui">
<o:importConstants type="com.example.YourConstants" />
Dengan cara ini mereka dapat diakses dengan cara Javabean biasa #{YourConstants.FOO}
juga.
Buat kelas pembungkus yang mengembalikannya melalui metode pengambil gaya Javabean.
Buat resolver EL khusus yang terlebih dahulu memindai keberadaan konstanta dan jika tidak ada, lalu delegasikan ke resolver default, jika tidak, kembalikan nilai konstanta.
unstandard-taglib
proyek Jakarta masih hidup? apakah ada alternatif lain?Hal berikut ini tidak berlaku untuk EL secara umum, tetapi hanya untuk SpEL (Spring EL) (diuji dengan 3.2.2.RELEASE di Tomcat 7). Saya rasa perlu disebutkan di sini jika seseorang mencari JSP dan EL (tetapi menggunakan JSP dengan Spring).
sumber
Anda biasanya menempatkan jenis konstanta ini dalam sebuah
Configuration
objek (yang memiliki getter dan setter) dalam konteks servlet, dan mengaksesnya dengan${applicationScope.config.url}
sumber
url
sebagai properti String, beri namaConfiguration
, buat instance, dan setelurl
ke apa pun yang Anda suka. Setelah itu aturConfiguration
objek ituServletContext
. Lakukan sesuatu sepertiservletContext.setAttribute("config", config)
,. Dan begitulah.ServletContext
? Apakah hanya Anda bisa mengklasifikasikan konstanta dengan lebih rapi? misalnya:applicationScope.config.url
vsapplicationScope.url
.Tidak boleh. Ini mengikuti konvensi Java Bean. Jadi, Anda harus memiliki tekad untuk itu.
sumber
Properti statis tidak dapat diakses di EL. Solusi yang saya gunakan adalah membuat variabel non-statis yang menugaskan dirinya sendiri ke nilai statis.
Saya menggunakan lombok untuk menghasilkan pengambil dan penyetel jadi itu cukup baik. EL Anda terlihat seperti ini:
Kode lengkap di http://www.ninthavenue.com.au/java-static-constants-in-jsp-and-jsf-el
sumber
Saya menerapkan seperti:
-
Langkah selanjutnya memasukkan instance kelas ini ke servlerContext
tambahkan pendengar ke web.xml
akses di jsp
sumber
Saya mendefinisikan sebuah konstanta di jsp saya tepat di awal:
Saya menyertakan taglib inti di JSP saya:
Kemudian, saya menyediakan konstanta untuk EL dengan pernyataan berikut:
Sekarang, saya bisa menggunakannya nanti. Berikut contoh, di mana nilainya hanya ditulis sebagai komentar HTML untuk tujuan debugging:
Dengan kelas konstan, Anda cukup mengimpor kelas dan menetapkan konstanta ke variabel lokal. Saya tahu bahwa jawaban saya adalah semacam peretasan cepat, tetapi pertanyaannya juga muncul ketika seseorang ingin mendefinisikan konstanta secara langsung di JSP.
sumber
<%=URI%>
: P<%=URI%>
tidak berfungsi, tetapi teknik ini berhasil.Ya kamu bisa. Anda memerlukan tag khusus (jika Anda tidak dapat menemukannya di tempat lain). Saya telah melakukan ini:
dan tag tersebut disebut:
Semua variabel final statis publik akan dimasukkan ke dalam Map yang diindeks dengan nama Java mereka, jadi jika
maka tag akan membungkus ini dalam Integer dan Anda dapat mereferensikannya dalam JSP:
dan Anda tidak perlu menulis getter!
sumber
Kamu bisa. Coba ikuti cara
Diuji pada TomCat 7 dan java6
sumber
Meskipun mengetahui ini sedikit terlambat, dan bahkan mengetahui ini sedikit retasan - saya menggunakan solusi berikut untuk mencapai hasil yang diinginkan. Jika Anda pecinta Java-Naming-Conventions, saran saya adalah berhenti membaca di sini ...
Memiliki kelas seperti ini, mendefinisikan Konstanta, dikelompokkan berdasarkan kelas kosong untuk membuat semacam hierarki:
dapat digunakan dari dalam java
PERMISSION.PAGE.SEE
untuk mengambil nilainya1L
Untuk mencapai kemungkinan akses yang serupa dari dalam EL-Expressions, saya melakukan ini: (Jika ada dewa pengkode - semoga dia bisa memaafkan saya: D)
Akhirnya, EL-Ekspresi untuk mengakses yang sama
Long
menjadi:#{PERMISSION.PAGE.SEE}
- persamaan untuk Java dan EL-Access. Saya tahu ini di luar konvensi mana pun, tetapi berfungsi dengan baik.sumber
@Bozho sudah memberikan jawaban yang bagus
Namun, saya merasa sebuah contoh dibutuhkan sehingga memberikan sedikit kejelasan dan meluangkan waktu seseorang
sumber
Ada solusi yang tidak persis seperti yang Anda inginkan, tetapi memungkinkan Anda untuk aktif hampir sama dengan menyentuh scriptlet dengan cara yang sangat minimal. Anda dapat menggunakan scriptlet untuk memasukkan nilai ke dalam variabel JSTL dan menggunakan kode JSTL bersih nanti di halaman.
sumber