1. Pengenalan
Bahasa Ekspresi (EL), adalah bahasa skrip yang terlihat diadopsi dalam banyak kerangka kerja Java, seperti Spring dengan SpEL dan JBoss dengan JBoss EL.
Dalam artikel ini, kita akan menumpukan pada pelaksanaan JSF terhadap bahasa skrip ini - Unified EL.
EL kini dalam versi 3.0, peningkatan besar yang membolehkan mesin pemprosesan digunakan dalam mod mandiri - misalnya, di platform Java SE. Versi sebelumnya bergantung pada pelayan aplikasi atau wadah web yang mematuhi EE Jakarta. Artikel ini membincangkan EL versi 2.2.
2. Penilaian Segera dan Ditangguhkan
Fungsi utama EL dalam JSF adalah untuk menghubungkan pandangan JSF (biasanya markup XHTML) dan back-end berasaskan Java. Bahagian belakang boleh menjadi kacang yang diuruskan oleh pengguna, atau objek yang diuruskan bekas seperti sesi HTTP.
Kami akan melihat EL 2.2. EL dalam JSF terdapat dalam dua bentuk umum, EL sintaks segera dan EL sintaks tertunda.
2.1. Sintaks Segera EL
Jika tidak dikenali sebagai JSP EL, ini adalah format skrip yang merupakan penahan dari pengembangan aplikasi web java pada hari JSP.
Ungkapan JSP EL bermula dengan tanda dolar ( $ ), kemudian diikuti dengan tanda kurung kiri ( { ), kemudian diikuti dengan ungkapan sebenarnya, dan akhirnya ditutup dengan kurungan keriting kanan ( } ):
${ELBean.value > 0}
Sintaks ini:
- Dinilai hanya sekali (pada awal) dalam kitaran hayat halaman. Ini bermaksud bahawa nilai itu. Dibaca oleh ungkapan dalam contoh di atas mesti ditetapkan sebelum halaman dimuat.
- Menyediakan akses baca sahaja ke nilai kacang.
- Dan sebagai hasilnya, memerlukan kepatuhan pada konvensi penamaan JavaBean.
Untuk kebanyakan kegunaan, bentuk EL ini tidak begitu serba boleh.
2.2. Pelaksanaan Ditangguhkan EL
Deferred Execution EL adalah EL yang direka untuk JSF sesuai. Perbezaan sintaksis utama dengan JSP EL ialah ia ditandai dengan " #" dan bukan " $ ".
#{ELBean.value > 0}
EL yang ditangguhkan:
- Selari dengan kitaran hidup JSF. Ini bermaksud bahawa ungkapan EL dalam EL yang ditangguhkan dinilai pada titik yang berbeza dalam rendering halaman JSF (pada awal dan akhir).
- Menyediakan akses membaca dan menulis ke nilai kacang. Ini membolehkan seseorang menetapkan nilai dalam backs-bean JSF (atau di mana sahaja) menggunakan EL.
- Membolehkan pengaturcara menggunakan kaedah sewenang-wenang pada objek dan bergantung pada versi EL, menyampaikan argumen ke kaedah tersebut.
Unified EL adalah spesifikasi yang menyatukan EL tertunda dan JSP EL, yang memungkinkan kedua-dua sintaks tersebut dalam halaman yang sama.
3. Bersatu EL
Unified EL membenarkan dua rasa umum ungkapan, ungkapan nilai dan ungkapan kaedah.
Dan nota ringkas - bahagian berikut akan menunjukkan beberapa contoh, yang semuanya tersedia dalam aplikasi (lihat pautan Github di akhir) dengan menavigasi ke:
//localhost:8080/jsf/el_intro.jsf
3.1. Ungkapan Nilai
Ungkapan nilai membolehkan kita membaca atau menetapkan harta kacang yang diuruskan, bergantung pada tempat ia diletakkan.
Ungkapan berikut membaca harta kacang yang diuruskan ke halaman:
Hello, #{ELBean.firstName}
Walau bagaimanapun, ungkapan berikut membolehkan kita menetapkan nilai pada objek pengguna:
Pemboleh ubah mesti mengikuti konvensyen penamaan JavaBean agar layak mendapat rawatan seperti ini. Agar nilai kacang komited, borang lampiran hanya perlu disimpan.
3.2. Ungkapan Kaedah
Unified EL menyediakan ungkapan kaedah untuk melaksanakan kaedah awam, bukan statik dari dalam halaman JSF. Kaedahnya mungkin atau tidak mempunyai nilai pulangan.
Inilah contoh ringkas:
Kaedah save () yang dimaksudkan ditentukan pada kacang sokongan bernama ELBean.
Bermula dari EL 2.2, anda juga dapat menyampaikan argumen ke kaedah yang diakses menggunakan EL. Ini membolehkan kita menulis semula contoh kita dengan cara berikut:
Apa yang telah kami lakukan di sini, adalah dengan membuat ekspresi pengikatan yang diliputi halaman untuk komponen inputText dan secara langsung menyampaikan atribut nilai ke ekspresi kaedah.
Perhatikan bahawa pemboleh ubah diteruskan ke kaedah tanpa notasi khas, pendakap keriting atau watak pelarian.
3.3. Objek EL Tersirat
Enjin JSF EL menyediakan akses ke beberapa objek yang diuruskan bekas. Sebahagian daripadanya adalah:
- # {Application} : Juga tersedia sebagai # {servletContext} , ini adalah objek yang mewakili instance aplikasi web
- # {applicationScope} : peta pemboleh ubah yang boleh diakses di aplikasi web di seluruh kawasan
- # {Cookie} : peta pemboleh ubah HTTP Cookie
- # {faceContext} : contoh semasa FacesContext
- # {flash} : objek scoped JSF Flash
- # {header} : peta tajuk HTTP dalam permintaan semasa
- # {initParam} : peta pemboleh ubah inisialisasi konteks aplikasi web
- # {param} : peta parameter permintaan permintaan HTTP
- #{request}: the HTTPServletRequest object
- #{requestScope}: a request-scoped map of variables
- #{sessionScope}: a session-scoped map of variables
- #{session}: the HTTPSession object
- #{viewScope}: a view (page-) scoped map of variables
The following simple example lists all the request headers and values by accessing the headers implicit object:
#{header.key}#{header.value}
4. What You Can Do in EL
In its versatility, EL can be featured in Java code, XHTML markup, Javascript and even in JSF configuration files like the faces-config.xml file. Let's examine some concrete use-cases.
4.1. Use EL in Page Markup
EL can be featured in standard HTML tags:
4.2. Use EL in JavaScript
EL will be interpreted when encountered in Javascript or tags:
var theVar = #{ELBean.firstName};
A backing bean variable will be set as a javascript variable here.
4.3. Evaluate Boolean Logic in EL Using Operators
EL supports fairly advanced comparison operators:
- eq equality operator, equivalent to “==.”
- lt less than operator, equivalent to “<.”
- le less than or equal to operator, equivalent to “<=.”
- gt greater than operator, equivalent to “>.”
- ge greater than or equal, equivalent to “>=.“
4.4. Evaluate EL in a Backing Bean
From within the backing bean code, one can evaluate an EL expression using the JSF Application. This opens up a world of possibilities, in connecting the JSF page with the backing bean. You could retrieve implicit EL objects, or retrieve actual HTML page components or their value easily from the backing bean:
FacesContext ctx = FacesContext.getCurrentInstance(); Application app = ctx.getApplication(); String firstName = app.evaluateExpressionGet(ctx, "#{firstName.value}", String.class); HtmlInputText firstNameTextBox = app.evaluateExpressionGet(ctx, "#{firstName}", HtmlInputText.class);
This allows the developer a great deal of flexibility in interacting with a JSF page.
5. What You Can Not Do in EL
EL < 3.0 does have some limitations. The following sections discuss some of them.
5.1. No Overloading
EL doesn’t support the use of overloading. So in a backing bean with the following methods:
public void save(User theUser); public void save(String username); public void save(Integer uid);
JSF EL will not be able to properly evaluate the following expression
The JSF ELResolver will introspect the class definition of bean, and pick the first method returned by java.lang.Class#getMethods (a method that returns the methods available in a class). The order of the methods returned is not guaranteed and this will inevitably result in undefined behaviour.
5.2. No Enums or Constant Values
JSF EL < 3.0, doesn’t support the use of constant values or Enums in the script. So, having any of the following
public static final String USER_ERROR_MESS = "No, you can’t do that"; enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };
means that you won’t be able to do the following
5.3. No Built-in Null Safety
JSF EL < v3.0 doesn’t provide implicit null safe access, which some may find odd about a modern scripting engine.
So if person in the expression below is null, the entire expression fails with an unsightly NPE
Hello Mr, #{ELBean.person.surname}"
6. Conclusion
Kami telah mengkaji beberapa asas JSF EL, kekuatan dan batasan.
Ini sebahagian besarnya adalah bahasa skrip serba boleh dengan beberapa ruang untuk diperbaiki; ini juga gam yang mengikat pandangan JSF, ke model dan pengawal JSF.
Kod sumber yang menyertai artikel ini terdapat di GitHub.