Як ви розумієте довжину списку мовою вираження JSF?


118

Як я можу отримати довжину ArrayListвикористання вираження JSF EL?

#{MyBean.somelist.length}

не працює.



@GBa ви можете використовувати # {MyBean.somelist.size ()} для відображення розміру списку.
Умаїр

Ви також можете використовувати c: forEach для циклічного перегляду списку і в тілі циклу присвоїти значення підрахунку змінній, наприклад: <c: set var = "nr_of_items" value = "$ {varStatus.count}" />. Корисно, особливо коли ви переглядаєте список у будь-якому випадку.
Девід Балажич

Відповіді:


166

Так, оскільки якийсь геній Комітету створення 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)}

2
fn - це, мабуть, шлях, на жаль, він доступний лише у версіях JSTL, більших за 1,1.
Джеймс Макмахон

27
Використання fn: довжина працювала для мене з голим JSP (без JSF, Facelets; ультраспадковий проект легенько оновлюється до поступового припинення). Правильний таліг для використання:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Крістофер Паркер

57
Для людей, які приїжджають сюди, як я, ще 2 роки останнього, враховуйте, що ви можете додати до своєї фасети таке простір імен: xmlns:fn="http://java.sun.com/jsp/jstl/functions"
Damien MIRAS

60

Ви маєте на увазі розмір () чи не так?

#{MyBean.somelist.size()}

працює для мене (використовуючи JBoss Seam, який має розширення Jboss EL)


Можливо, новіші характеристики EL підтримують метод розміру? Хтось може це підтвердити чи спростувати?
Джеймс Макмахон

2
@nemo - це вирішується у випуску технічного обслуговування JSR245: blogs.sun.com/kchung/entry/jsr_245_mr_part_i (з точки зору специфікацій JEE, це буде JEE6)
McDowell,

@McDowell, Дякую за інформацію, я дуже здивований, що їм знадобилося так довго, щоб вирішити проблему.
Джеймс Макмахон

Дякую. Це працювало і для мене. +1. Але поки JEE 6 не отримає широкої підтримки, я, мабуть, буду дотримуватися "більш стандартної" функції JSTL.
Хосам Алі

До речі, це, мабуть, працює в JBoss, щоб просто сказати #{MyBean.somelist.size}(без дужок в кінці).
Хосам Алі

14

Примітка. Це рішення краще для старих версій 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". Це може бути найпростіший спосіб вирішити це питання.



6
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

На екрані відображається розмір таблиці

Приклад: Table Size = 5


Так, це я знаходжу - це найпростіший спосіб зробити це. Я використовую websphere6 з JSP (застаріла система). використовував той самий табліб, а потім використовував знак "долар" на відміну від "хеш", оскільки хеш не працював. тобто: {fn: length (SystemBean.list)}
JackDev

0

Зрештою, ви можете розширити мову EL, використовуючи функцію EL Functor , що дозволить вам зателефонувати на будь-які методи Java-бобів, навіть із параметрами ...


-1

Після 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>

-5

Довжину можна отримати за допомогою наступного EL:

# {Bean.list.size ()}


1
Це по суті та сама відповідь, що і у Дамо .
Artjom B.

6
Як @ArtjomB. Пропозиції, тут взагалі недобре розміщувати, що відповідає тій самій відповіді, що і хтось уже розмістив. У цьому випадку майже шість років тому .
Ендрю Барбер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.