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

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

#{MyBean.somelist.length}

작동하지 않습니다.



답변

예, 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)}


답변

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

#{MyBean.somelist.size()}

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


답변

참고 : 이 솔루션은 이전 버전의 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”가 있습니다. 이것이이 문제를 해결하는 가장 간단한 방법 일 수 있습니다.


답변

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

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

화면에 테이블 크기가 표시됩니다.

예: Table Size = 5


답변

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


답변

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>


답변

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

# {Bean.list.size ()}