ArrayList
JSF EL ifadesi kullanarak bir uzunluğunu nasıl elde ederim ?
#{MyBean.somelist.length}
çalışmıyor.
ArrayList
JSF EL ifadesi kullanarak bir uzunluğunu nasıl elde ederim ?
#{MyBean.somelist.length}
çalışmıyor.
Yanıtlar:
Evet, Java API oluşturma komitesindeki bazı dahiler, bazı sınıfların size()
üyeleri veya length
öznitelikleri olmasına rağmen , uygulamayacaklarına getSize()
veya getLength()
hangi JSF ve diğer standartların gerektirdiğine karar verdiğinden , istediğinizi yapamazsınız.
Bunu yapmanın birkaç yolu var.
Bir: Bean'inize uzunluğu döndüren bir işlev ekleyin:
Sınıfta MyBean: public int getSomelistLength () {this.somelist.length döndür; } JSF sayfanızda: # {MyBean.somelistLength}
İki: Facelets kullanıyorsanız (Tanrım, neden Facelets kullanmıyorsunuz!), Fn ad alanını ekleyebilir ve uzunluk işlevini kullanabilirsiniz.
JSF sayfasında: # {fn: length (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Boyut () demek istiyorsun, değil mi?
#{MyBean.somelist.size()}
benim için çalışıyor (Jboss EL uzantılarına sahip JBoss Seam kullanarak)
#{MyBean.somelist.size}
(sonunda parantez olmadan).
Not: Bu çözüm, JSTL'nin eski sürümleri için daha iyidir. 1.1'den büyük sürümler için Bill Jamesfn:length(MyBean.somelist)
tarafından önerildiği gibi kullanmanızı tavsiye ederim .
Bu makale , başka bir olası çözüm dahil olmak üzere bazı daha ayrıntılı bilgiler içerir;
Sorun şu ki, listenin boyut yöntemini (geçerli bir LinkedList yöntemidir) çağırmaya çalışıyoruz, ancak bu JavaBeans uyumlu bir alıcı yöntemi değil, bu nedenle list.size-1 ifadesi değerlendirilemez.
Bu ikilemi ele almanın iki yolu vardır. İlk olarak, RT Core kitaplığını şu şekilde kullanabilirsiniz:
<c_rt:out value='<%= list[list.size()-1] %>'/>
İkinci olarak, JSP sayfalarınızda Java kodundan kaçınmak istiyorsanız, bir liste içeren ve JavaBeans uyumlu bir alıcı yöntemiyle listenin size özelliğine erişim sağlayan basit bir sarmalayıcı sınıf uygulayabilirsiniz. Bu fasulye Liste 2.25'te listelenmiştir.
C_rt yöntemiyle ilgili sorun, değişkeni istekten manuel olarak almanız gerekmesidir, çünkü başka türlü tanımaz. Bu noktada, işlevsellik içinde inşa edilmesi gerekenler için çok fazla kod koyuyorsunuz. Bu, EL'deki DEV bir kusurdur.
Sonunda "sarmalayıcı" yöntemini kullandım, işte bunun için sınıf;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
Henüz kimsenin bahsetmediği üçüncü bir seçenek, liste boyutunuzu modele ayrı bir özellik olarak (MVC kullandığınızı varsayarak) koymaktır. Yani modelinizde "someList" ve ardından "someListSize" olacaktır. Bu sorunu çözmenin en basit yolu bu olabilir.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
Ekranda Tablo boyutunu görüntüler
Misal: Table Size = 5
Sonunda , parametrelerle bile herhangi bir Java fasulyesi yöntemini çağırmanıza izin veren EL Functor'u kullanarak EL dilini genişletebilirsiniz ...
7 yıldan sonra ... facelets çözümü, bir jsf kullanıcısı olarak benim için hala iyi çalışıyor
ad alanını şu şekilde dahil et
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
ve
#{fn:length(myBean.someList)}
örneğin, jsf ui: parçasının aşağıdaki örnekte kullanılması iyi çalışıyorsa, EL'yi kullanın
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Aşağıdaki EL'yi kullanarak uzunluğu alabilirsiniz:
# {Bean.list.size ()}