Да, так как некоторый гений в комитете по созданию API Java решил, что, даже при том, что определенные классы имеют size()
участники или length
атрибуты, они не реализуют getSize()
или getLength()
, которого требуют JSF и большинство других стандартов, Вы не можете сделать то, что Вы хотите.
существует пара способов сделать это.
Один: добавьте функцию к своему Бобу, который возвращает длину:
In class MyBean: public int getSomelistLength() { return this.somelist.length; } In your JSF page: #{MyBean.somelistLength}
Два: Если Вы используете Facelets (О, Бог, почему не Вы использование Facelets!), можно добавить fn пространство имен и использовать функцию длины
In JSF page: #{ fn:length(MyBean.somelist) }
Вы имеете в виду размер () не так ли?
#{MyBean.somelist.size()}
работы для меня (использующий Шов JBoss, который имеет расширения Jboss EL)
Можно в конечном счете расширить язык EL при помощи EL Functor , который позволит Вам называть любые бобовые методы Java, даже с параметрами...
Примечание: Это решение лучше для старых версий JSTL. Для версий выше 1.1 я рекомендую использовать fn: length (MyBean.somelist)
, как было предложено Биллом Джеймсом .
Эта статья содержит некоторую более подробную информацию, включая другую возможное решение;
Проблема в том, что мы пытаемся вызвать метод размера списка (который является допустимым методом LinkedList), но он не совместим с JavaBeans-совместимым методом получения, поэтому выражение list.size-1 не может быть вычислено.
Есть два способа решить эту дилемму. Во-первых, вы можете использовать библиотеку RT Core, например:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Во-вторых, если вы хотите избежать кода Java на своих страницах JSP, вы можете реализовать простой класс-оболочку, который содержит список и предоставляет доступ к списку ' s size с помощью метода получения, совместимого с JavaBeans. Этот bean-компонент указан в Листинге 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». Это может быть самый простой способ решить эту проблему.
Проблема с методом 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". Это может быть самый простой способ решить эту проблему.
Проблема с методом 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". Это может быть самый простой способ решить эту проблему.
Это ГИГАНСКАЯ ошибка в 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". Это может быть самый простой способ решить эту проблему.
Это ГИГАНСКАЯ ошибка в 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". Это может быть самый простой способ решить эту проблему.