Як я можу отримати довжину ArrayList
використання вираження JSF EL?
#{MyBean.somelist.length}
не працює.
Як я можу отримати довжину ArrayList
використання вираження JSF EL?
#{MyBean.somelist.length}
не працює.
Відповіді:
Так, оскільки якийсь геній Комітету створення Java API вирішив, що, хоча певні класи мають size()
членів або length
атрибутів, вони не будуть реалізовуватись getSize()
або getLength()
які вимагають JSF та більшість інших стандартів, ви не можете робити те, що хочете.
Є кілька способів зробити це.
Перший: додайте функцію до вашого Bean, яка повертає довжину:
У класі MyBean: public int getSomelistLength () {return this.somelist.length; } На вашій сторінці JSF: # {MyBean.somelistLength}
Двоє: Якщо ви використовуєте Facelets (О, Боже, чому ви не використовуєте Facelet!), Ви можете додати простір імен fn і використовувати функцію довжини
На сторінці JSF: # {fn: довжина (MyBean.somelist)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Ви маєте на увазі розмір () чи не так?
#{MyBean.somelist.size()}
працює для мене (використовуючи JBoss Seam, який має розширення Jboss EL)
#{MyBean.somelist.size}
(без дужок в кінці).
Примітка. Це рішення краще для старих версій JSTL. Для версій, що перевищують 1,1, я рекомендую використовувати, fn:length(MyBean.somelist)
як пропонував Білл Джеймс .
Ця стаття містить деяку більш детальну інформацію, включаючи інше можливе рішення;
Проблема полягає в тому, що ми намагаємося викликати метод розміру списку (що є дійсним методом LinkedList), але це не метод, що відповідає JavaBeans, і тому вираз list.size-1 не може бути оцінений.
Існує два способи вирішити цю дилему. По-перше, ви можете використовувати бібліотеку RT Core, наприклад:
<c_rt:out value='<%= list[list.size()-1] %>'/>
По-друге, якщо ви хочете уникнути коду Java на своїх сторінках JSP, ви можете реалізувати простий клас обгортки, що містить список і забезпечує доступ до властивості розміру списку методом getter-сумісного JavaBeans. Цей боб перерахований у Лістингу 2.25.
Проблема методу c_rt полягає в тому, що вам потрібно отримати змінну від запиту вручну, оскільки вона не розпізнає її в іншому випадку. У цей момент ви вводите багато коду для того, що має бути вбудовано у функціонал. Це ГІАНТ- вада в EL.
Я закінчив, використовуючи метод "обгортки", ось клас для цього;
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
Третій варіант, про який ще ніхто не згадував, - це ввести розмір списку у модель (якщо ви використовуєте MVC) як окремий атрибут. Отже, у вашій моделі у вас був би "someList", а потім "someListSize". Це може бути найпростіший спосіб вирішити це питання.
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
На екрані відображається розмір таблиці
Приклад: Table Size = 5
Зрештою, ви можете розширити мову EL, використовуючи функцію EL Functor , що дозволить вам зателефонувати на будь-які методи Java-бобів, навіть із параметрами ...
Після 7 років ... рішення фейслета все ще працює для мене як користувача jsf
включити простір імен як
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
і використовувати EL як,
#{fn:length(myBean.someList)}
наприклад, якщо використання в jsf ui: фрагмент нижче прикладу працює чудово
<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
<!-- Do something here-->
</ui:fragment>
Довжину можна отримати за допомогою наступного EL:
# {Bean.list.size ()}