JSF ifade dilinde bir listenin uzunluğunu nasıl elde edersiniz?


118

ArrayListJSF EL ifadesi kullanarak bir uzunluğunu nasıl elde ederim ?

#{MyBean.somelist.length}

çalışmıyor.



@GBa, liste boyutunu görüntülemek için # {MyBean.somelist.size ()} kullanabilirsiniz.
Umeyr

Listede döngü yapmak için c: forEach'i de kullanabilirsiniz ve döngü gövdesinde count değerini bir değişkene atayabilirsiniz, örneğin: <c: set var = "nr_of_items" value = "$ {varStatus.count}" />. Özellikle yine de listenin üzerinden geçerken kullanışlıdır.
David Balažic

Yanıtlar:


166

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)}

2
fn muhtemelen gitmek için yoldur, maalesef yalnızca 1.1'den sonraki JSTL sürümlerinde mevcuttur.
James McMahon

27
Fn: uzunluk kullanımı çıplak JSP ile benim için çalıştı (JSF, Facelets yok; ultra eski proje aşamalı olarak kaldırılmadan önce hafifçe güncelleniyor). Kullanılacak uygun taglib:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
Benim gibi buraya inen insanlar için, hala 2 yıl sonra, yüzünüze aşağıdaki ad alanını ekleyebileceğinizi düşünün: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

60

Boyut () demek istiyorsun, değil mi?

#{MyBean.somelist.size()}

benim için çalışıyor (Jboss EL uzantılarına sahip JBoss Seam kullanarak)


Belki EL'nin daha yeni özellikleri boyut yöntemini destekliyor? Birisi bunu onaylayabilir yada reddedebilir mi?
James McMahon

2
@nemo - bu bir JSR245 bakım sürümünde ele alınmaktadır: blogs.sun.com/kchung/entry/jsr_245_mr_part_i (JEE teknik özellikleri açısından, bu JEE6 olacak)
McDowell

@McDowell, Bilgi için teşekkürler, sorunu çözmenin bu kadar uzun sürmesine gerçekten şaşırdım.
James McMahon

Teşekkür ederim. Benim için de çalıştı. +1. Ancak JEE 6 yaygın olarak desteklenene kadar, muhtemelen "daha standart" JSTL işlevine bağlı kalacağım.
Hosam Aly

BTW, muhtemelen JBoss'ta sadece söylemek için çalışır #{MyBean.somelist.size}(sonunda parantez olmadan).
Hosam Aly

14

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.



6
<%@ 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


Evet bulduğum bu, bunu yapmanın en basit yolu. JSP (eski sistem) ile websphere6 kullanıyorum. hash çalışmadığı için aynı tablib'i kullandı ve sonra 'hash' yerine 'dolar işaretini' kullanın. yani: {fn: length (
SystemBean.list

0

Sonunda , parametrelerle bile herhangi bir Java fasulyesi yöntemini çağırmanıza izin veren EL Functor'u kullanarak EL dilini genişletebilirsiniz ...


-1

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>

-5

Aşağıdaki EL'yi kullanarak uzunluğu alabilirsiniz:

# {Bean.list.size ()}


1
Bu aslında Damo'nun verdiği cevapla aynı .
Artjom B.

6
@ArtjomB. gösteriyor ki, başka birisinin zaten gönderdiği yanıtla aynı cevabı burada yayınlamak genellikle iyi değildir. Bu durumda, neredeyse altı yıl önce .
Andrew Barber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.