Jak uzyskać długość ArrayList
przy użyciu wyrażenia JSF EL?
#{MyBean.somelist.length}
nie działa.
Jak uzyskać długość ArrayList
przy użyciu wyrażenia JSF EL?
#{MyBean.somelist.length}
nie działa.
Odpowiedzi:
Tak, ponieważ jakiś geniusz z komitetu tworzenia Java API zdecydował, że nawet jeśli niektóre klasy mają size()
członków lub length
atrybuty, nie będą implementować getSize()
lub getLength()
które JSF i większość innych standardów wymaga, nie możesz robić tego, co chcesz.
Można to zrobić na kilka sposobów.
Po pierwsze: dodaj funkcję do swojego Beana, która zwraca długość:
W klasie MyBean: public int getSomelistLength () {return this.somelist.length; } Na Twojej stronie JSF: # {MyBean.somelistLength}
Po drugie: jeśli używasz Facelets (O Boże, dlaczego nie używasz Faceletów!), Możesz dodać przestrzeń nazw fn i użyć funkcji length
Na stronie 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"
Masz na myśli rozmiar (), prawda?
#{MyBean.somelist.size()}
działa dla mnie (używając JBoss Seam, który ma rozszerzenia Jboss EL)
#{MyBean.somelist.size}
(bez nawiasów na końcu).
Uwaga: to rozwiązanie jest lepsze dla starszych wersji JSTL. W przypadku wersji powyżej 1.1 polecam używanie fn:length(MyBean.somelist)
zgodnie z sugestią Billa Jamesa .
Ten artykuł zawiera bardziej szczegółowe informacje, w tym inne możliwe rozwiązanie;
Problem polega na tym, że próbujemy wywołać metodę rozmiaru listy (która jest poprawną metodą LinkedList), ale nie jest to metoda pobierająca zgodna z JavaBeans, więc wyrażenie list.size-1 nie może zostać ocenione.
Istnieją dwa sposoby rozwiązania tego dylematu. Po pierwsze, możesz użyć biblioteki RT Core, na przykład:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Po drugie, jeśli chcesz uniknąć kodu Java na stronach JSP, możesz zaimplementować prostą klasę opakowującą, która zawiera listę i zapewnia dostęp do właściwości size listy za pomocą metody pobierającej zgodnej z JavaBeans. Ta fasola jest wymieniona na liście 2.25.
Problem z metodą c_rt polega na tym, że musisz ręcznie pobrać zmienną z żądania, ponieważ inaczej jej nie rozpoznaje. W tym momencie umieszczasz dużo kodu dla tego, co powinno być wbudowane w funkcjonalność. To jest OGROMNA wada EL.
Skończyło się na użyciu metody „wrapper”, oto klasa do tego;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
Trzecią opcją, o której nikt jeszcze nie wspomniał, jest umieszczenie rozmiaru listy w modelu (zakładając, że używasz MVC) jako oddzielnego atrybutu. Więc w swoim modelu powinieneś mieć „someList”, a następnie „someListSize”. To może być najprostszy sposób rozwiązania tego problemu.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
Na ekranie wyświetla rozmiar tabeli
Przykład: Table Size = 5
Możesz ostatecznie rozszerzyć język EL, używając EL Functor , który pozwoli ci wywołać dowolne metody Java Bean, nawet z parametrami ...
Po 7 latach ... rozwiązanie facelets nadal działa dobrze dla mnie jako użytkownika jsf
uwzględnij przestrzeń nazw jako
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
i użyj EL tak, jak
#{fn:length(myBean.someList)}
na przykład jeśli używasz w jsf ui: fragment poniższego przykładu działa dobrze
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Możesz uzyskać długość za pomocą następującego EL:
# {Bean.list.size ()}