JSF 표현 언어로 목록의 길이를 어떻게 얻습니까?


118

ArrayListJSF EL 표현식을 사용하여 길이를 어떻게 얻을 수 있습니까?

#{MyBean.somelist.length}

작동하지 않습니다.



@GBa 당신은 목록의 크기를 표시하기 위해 # {MyBean.somelist.size ()}를 사용할 수 있습니다.
Umair

c : forEach를 사용하여 목록을 반복하고 루프 본문에서 <c : set var = "nr_of_items"value = "$ {varStatus.count}"/>와 같이 변수에 개수 값을 할당 할 수도 있습니다. 어쨌든 목록을 반복 할 때 특히 유용합니다.
David Balažic 2015 년

답변:


166

예, Java API 생성위원회의 일부 천재는 특정 클래스에 size()구성원이나 length속성 이 있어도 구현하지 getSize()않거나 getLength()JSF 및 대부분의 다른 표준에 필요한 것을 원하는대로 수행 할 수 없다고 결정했기 때문입니다 .

이를 수행하는 몇 가지 방법이 있습니다.

하나 : 길이를 반환하는 함수를 Bean에 추가합니다.

MyBean 클래스에서 :
public int getSomelistLength () {return this.somelist.length; }

JSF 페이지에서 :
# {MyBean.somelistLength}

2 : Facelets를 사용하는 경우 (Oh, God, Facelets를 사용하지 않는 이유는 무엇입니까!), fn 네임 스페이스를 추가하고 length 함수를 사용할 수 있습니다.

JSF 페이지에서 :
# {fn : length (MyBean.somelist)}

2
fn은 아마도 갈 길일 것입니다. 불행히도 1.1보다 큰 JSTL 버전에서만 사용할 수 있습니다.
James McMahon

27
fn : length를 사용하면 JSP (JSF, Facelets 없음, 단계적으로 중단되기 전에 가볍게 업데이트되는 울트라 레거시 프로젝트)에서 저에게 효과적이었습니다. 사용할 적절한 taglib :<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
: 나처럼 여기 착륙 사람들을 위해, 여전히 이년 후자, 당신이 당신의 facelet에 다음 네임 스페이스를 추가 할 수 있습니다 considere있는 xmlns:fn="http://java.sun.com/jsp/jstl/functions"
데미안 MIRAS

60

당신은 size ()를 의미합니까?

#{MyBean.somelist.size()}

나를 위해 작동합니다 (Jboss EL 확장이있는 JBoss Seam 사용)


EL의 최신 사양이 크기 방법을 지원할까요? 누구든지 이것을 확인하거나 거부 할 수 있습니까?
James McMahon

2
@nemo-이 문제는 JSR245 유지 관리 릴리스에서 해결됩니다. blogs.sun.com/kchung/entry/jsr_245_mr_part_i(JEE 사양 측면에서 JEE6)
McDowell

@McDowell, 정보 주셔서 감사합니다. 문제를 해결하는 데 이렇게 오래 걸린 것이 정말 놀랍습니다.
James McMahon

감사합니다. 그것은 나에게도 효과적이었습니다. +1. 그러나 JEE 6이 널리 지원되기 전까지는 "더 표준적인"JSTL 기능을 계속 사용할 것입니다.
Hosam Aly

BTW, 아마도 JBoss에서 #{MyBean.somelist.size}(끝에 괄호없이) 말하기 위해 작동합니다 .
Hosam Aly

14

참고 : 이 솔루션은 이전 버전의 JSTL에 더 적합합니다. 1.1보다 큰 버전의 경우 Bill James가fn:length(MyBean.somelist) 제안한대로 사용 하는 것이 좋습니다 .


이 기사 에는 다른 가능한 솔루션을 포함하여 더 자세한 정보가 있습니다.

문제는 목록의 크기 메서드 (유효한 LinkedList 메서드)를 호출하려고하지만 JavaBeans 호환 getter 메서드가 아니므로 list.size-1 표현식을 평가할 수 없다는 것입니다.

이 딜레마를 해결하는 방법에는 두 가지가 있습니다. 먼저 다음과 같이 RT Core 라이브러리를 사용할 수 있습니다.

<c_rt:out value='<%= list[list.size()-1] %>'/>

둘째, JSP 페이지에서 Java 코드를 피하려면 목록을 포함하고 JavaBeans 호환 getter 메서드를 사용하여 목록의 크기 속성에 대한 액세스를 제공하는 간단한 래퍼 클래스를 구현할 수 있습니다. 해당 빈은 목록 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


예, 이것이 가장 간단한 방법입니다. JSP (레거시 시스템)와 함께 websphere6을 사용하고 있습니다. 동일한 tablib를 사용한 다음 해시가 작동하지 않았기 때문에 '해시'가 아닌 '달러 기호'를 사용했습니다. 예 : {FN : 길이 (SystemBean.list)}
JackDev

0

결국에는 EL Functor 를 사용하여 EL 언어를 확장 할 수 있습니다. 그러면 매개 변수로도 모든 Java Bean 메소드를 호출 할 수 있습니다.


-1

7 년 후에도 ... facelets 솔루션은 jsf 사용자로서 여전히 잘 작동합니다.

네임 스페이스를 다음과 같이 포함 xmlns:fn="http://java.sun.com/jsp/jstl/functions"

#{fn:length(myBean.someList)}예를 들어 아래의 jsf ui : fragment에서 사용하면 EL을 사용하십시오 .

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>

-5

다음 EL을 사용하여 길이를 얻을 수 있습니다.

# {Bean.list.size ()}


1
이것은 본질적으로 Damo의 .
Artjom B.

6
@ArtjomB로. 다른 사람이 이미 게시 한 것과 동일한 답변을 게시하는 것은 일반적으로 여기에 좋지 않습니다. 이 경우 거의 6 년 전 .
Andrew Barber
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.