Bagaimana saya mendapatkan panjang dari ArrayList
ekspresi JSF EL?
#{MyBean.somelist.length}
tidak bekerja.
Bagaimana saya mendapatkan panjang dari ArrayList
ekspresi JSF EL?
#{MyBean.somelist.length}
tidak bekerja.
Jawaban:
Ya, karena beberapa jenius dalam komite pembuatan Java API memutuskan bahwa, meskipun kelas tertentu memiliki size()
anggota atau length
atribut, mereka tidak akan menerapkan getSize()
atau getLength()
yang dibutuhkan JSF dan sebagian besar standar lainnya, Anda tidak dapat melakukan apa yang Anda inginkan.
Ada beberapa cara untuk melakukan ini.
Satu: tambahkan fungsi ke Bean Anda yang mengembalikan panjang:
Di kelas MyBean: public int getSomelistLength () {return this.somelist.length; } Di halaman JSF Anda: # {MyBean.somelistLength}
Dua: Jika Anda menggunakan Facelet (Ya Tuhan, mengapa Anda tidak menggunakan Facelet!), Anda dapat menambahkan namespace fn dan menggunakan fungsi panjang
Di halaman JSF: # {fn: length (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Maksud Anda ukuran () bukan?
#{MyBean.somelist.size()}
berfungsi untuk saya (menggunakan JBoss Seam yang memiliki ekstensi Jboss EL)
#{MyBean.somelist.size}
(tanpa tanda kurung di akhir).
Catatan: Solusi ini lebih baik untuk versi JSTL yang lebih lama. Untuk versi yang lebih besar dari 1.1 saya sarankan menggunakan fn:length(MyBean.somelist)
seperti yang disarankan oleh Bill James .
Artikel ini memiliki beberapa informasi yang lebih rinci, termasuk solusi lain yang mungkin;
Masalahnya adalah kita mencoba memanggil metode ukuran daftar (yang merupakan metode LinkedList yang valid), tetapi itu bukan metode pengambil yang sesuai dengan JavaBeans, sehingga ekspresi list.size-1 tidak dapat dievaluasi.
Ada dua cara untuk mengatasi dilema ini. Pertama, Anda dapat menggunakan pustaka RT Core, seperti ini:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Kedua, jika Anda ingin menghindari kode Java di halaman JSP, Anda dapat mengimplementasikan kelas pembungkus sederhana yang berisi daftar dan menyediakan akses ke properti ukuran daftar dengan metode pengambil yang sesuai dengan JavaBeans. Kacang itu terdaftar di Listing 2.25.
Masalah dengan metode c_rt adalah Anda perlu mendapatkan variabel dari permintaan secara manual, karena metode ini tidak mengenalinya. Pada titik ini Anda memasukkan banyak kode untuk apa yang harus dibangun dalam fungsionalitas. Ini adalah cacat RAKSASA di EL.
Saya akhirnya menggunakan metode "pembungkus", inilah kelas untuk itu;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
Opsi ketiga yang belum disebutkan oleh siapa pun adalah memasukkan ukuran daftar Anda ke dalam model (dengan asumsi Anda menggunakan MVC) sebagai atribut terpisah. Jadi dalam model Anda, Anda akan memiliki "someList" dan kemudian "someListSize". Itu mungkin cara paling sederhana untuk mengatasi masalah ini.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
Di layar ini menampilkan ukuran Tabel
Contoh: Table Size = 5
Anda akhirnya dapat memperluas bahasa EL dengan menggunakan EL Functor , yang memungkinkan Anda memanggil metode kacang Java apa pun, bahkan dengan parameter ...
Setelah 7 tahun ... solusi facelet masih berfungsi dengan baik untuk saya sebagai pengguna jsf
sertakan namespace sebagai
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
dan gunakan EL sebagai
#{fn:length(myBean.someList)}
contoh jika menggunakan di jsf ui: contoh fragmen di bawah berfungsi dengan baik
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Anda bisa mendapatkan panjangnya menggunakan EL berikut:
# {Bean.list.size ()}