ArrayList
JSF EL 표현식을 사용하여 길이를 어떻게 얻을 수 있습니까?
#{MyBean.somelist.length}
작동하지 않습니다.
ArrayList
JSF 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)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
당신은 size ()를 의미합니까?
#{MyBean.somelist.size()}
나를 위해 작동합니다 (Jboss EL 확장이있는 JBoss Seam 사용)
#{MyBean.somelist.size}
(끝에 괄호없이) 말하기 위해 작동합니다 .
참고 : 이 솔루션은 이전 버전의 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 ()}