Примечание: Это решение лучше для старых версий JSTL. Для версий выше 1.1 я рекомендую использовать fn:length(MyBean.somelist)
, как предложено Биллом Джеймсом .
Эта статья содержит более подробную информацию, включая другое возможное решение;
Проблема в том, что мы пытаемся вызвать метод размера списка (который является допустимым методом LinkedList), но это не совместимый с JavaBeans метод получения, поэтому выражение list.size-1 не может быть оценено.
Есть два пути решения этой дилеммы. Во-первых, вы можете использовать библиотеку RT Core, например:
<c_rt:out value='<%= list[list.size()-1] %>'/>
Во-вторых, если вы хотите избежать использования кода Java на страницах JSP, вы можете реализовать простой класс-оболочку, содержащий список и обеспечивающий доступ к свойству размера списка с помощью метода get, совместимого с JavaBeans. Этот компонент указан в листинге 2.25.
Проблема с методом c_rt заключается в том, что вам нужно получить переменную из запроса вручную, потому что иначе она не распознается. На этом этапе вы вкладываете много кода для того, что должно быть встроено в функциональность. Это GIANT недостаток в 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». Это может быть самый простой способ решить эту проблему.