2008-09-25 6 views
2

저는 Hashtable < Integer, Sport>를 sportMap이라고하고, 스포츠 뒷쪽의 목록에서 sportsIds (List < Integer> sportIds)의 목록을 가지고 있습니다. Sport 개체에는 List < String> equipmentList가 있습니다. 각 스포츠 용 장비 목록을 얻기 위해 통합 EL을 사용하여 다음을 수행 할 수 있습니까?JSP 2.1에서 JSF 1.2를 사용하여 c : forEach 태그의 통합 EL 표현식에서 Hashtable을 사용할 수 있습니까?

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <c:forEach items="#{bean.sportMap[_sportId].equipmentList}" var="_eqp"> 
    <h:outputText value="#{_eqp}"></h:outputText> 
    <br/> 
    </c:forEach> 
</h:dataTable> 

이 JSP 코드를 실행하려고하면 다음과 같은 예외가 발생합니다.

 15:57:59,438 ERROR [ExceptionFilter] exception root cause 
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 
     Don't know how to iterate over supplied "items" in &lt;forEach&gt;

은 여기 내 환경

 
Server: JBossWeb/2.0.1.GA 
Servlet Specification: 2.5 
JSP version: 2.1 
JSTL version: 1.2 
Java Version: 1.5.0_14 

주 중 인쇄의 : 다음은 JSF 태그를 사용하여 작업을 수행합니다. sportId 목록에 지정된 각 스포츠에 대한 장비 목록을 인쇄합니다.

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:outputText value="#{bean.sportMap[_sportId].equipmentList}"> 
    </h:outputText> 
</h:dataTable> 

저는 c : forEach 태그를 사용하고 싶습니다. 이것이 가능한지 아는 사람 있습니까? 그렇지 않다면 누구나 제안 사항이 있습니까? 결국 나는 equipmentList.toString()에 의해 제공된 쉼표로 분리 된리스트 대신 스택리스트를 원한다. 또한 toString()을 재정의하고 싶지는 않습니다.

답변

2

JSF 1.2에서 keith30xi.myopenid.com

하지 TRUE @. java.net wiki faq에 따르면 그들은 예상대로 같이 작동해야합니다.
Q. 마 자바 서버 태그 JSTL 코어 태그와 상호 운용 얼굴 가의 Foreach이 경우, 선택

JSF 1.1 자주 묻는 질문과 때

는 여기에 각 질문에서 추출입니까?

A. forEach 태그는 JSTL 및 JavaServer에서 사용하는 전략 사이의 비 호환성으로 인해 JavaServer Faces 기술, 버전 1.0 및 1.1 태그와 함께 작동하지 않습니다. Faces 기술. 대신 dataTable 태그에서 사용하는 테이블 렌더러와 같이 자체 반복을 수행하는 렌더러를 사용할 수 있습니다. if, choose 및 when 태그는 작동하지만 이러한 태그 내에 중첩 된 JavaServer Faces 태그에는 명시적인 식별자가 있어야합니다.

이 단점은 JSF 1.2에서 수정되었습니다.

JSF 1.2 자주 묻는 질문 Q. 마 자바 서버 태그가있는 경우, 선택 할 때, JSTL 코어 태그, 대해 forEach와 상호 운용 얼굴
?

A. 예. JSP Id Consumer라고하는 JSP 2.1의 새로운 기능은 이러한 태그가 예상대로 작동 할 수있게합니다.

누구나 JSTL 핵심 태그가있는 JSF 태그를 특별히 forEach에 사용 했습니까?

-1

두 가지 문제 :

  1. 데이터 테이블은 다음과 같은 아이를 가질 수 : 헤더면, 바닥 글면, 열입니다. 다른 것은 정확하게 평가되지 않을 것입니다.
  2. JSTL 태그를 JSF 구성 요소와 섞어서 사용할 수 없습니다. JSTL 태그는 구성 요소 트리를 만들 때 평가됩니다. JSF 구성 요소는 페이지가 렌더링 될 때 평가됩니다. 따라서 c : forEach 태그는 구성 요소 트리가 생성 될 때 한 번만 평가됩니다 ("# {bean.sportIds}"가 사용 가능할 가능성이 있음).

중 하나를 당신이 원하는처럼 당신이 원하는 루프 않습니다 하나를 만들거나 콩을 리팩토링 루핑 제공하는 JSF 컴포넌트 라이브러리를 사용하므로 대신 스포츠 각 목록에 걸쳐, sportIds을 통해 루프를 루핑 스포츠에는 ID와 장비가 있습니다.

2

나는 한 번 같은 문제가 있었는데 dataTable을 사용하여 해결책을 찾지 못했습니다. 문제가있는 것은 _sportId은 dataTable 구성 요소에서만 읽을 수 있습니다.

<h:dataTable value="#{bean.sportIds}" var="_sportId" > 
    <h:dataTable value="#{bean.sportMap[_sportId].equipmentList}" var="_eqp"> 
    <h:outputText value="#{_eqp}"></h:outputText> 
    </h:dataTable> 
</h:dataTable> 

을하지만,이 경우에 당신의 각 테이블 행 내부에 인쇄 항목을 equipmentList : 당신은 루프 내에서 루프를 수행해야하는 경우

, 당신은 데이터 테이블 안에 데이터 테이블을 사용할 수 있습니다. 저에게 큰 해결책이 아니 었습니다. 그것은 작동

<table> 
    <c:forEach items="#{bean.sportIds}" var="_sportId"> 
     <tr> 
     <td> 
     <c:forEach items="#{bean.sportMap[_sportId].equipmentList" var="_eqp"> 
      <h:outputText value="#{_eqp} " /> 
     </c:forEach> 
     </td> 
     </tr> 
    </c:forEach> 
</table> 

:

내가 대신 데이터 테이블의 정상적인 HTML 테이블을 사용하기로 결정했습니다. 바인딩 및 행 매핑과 같은 특정 dataTable 기능이 필요한 경우 f : setPropertyActionListener 태그를 사용하면 쉽게 얻을 수 있습니다.

관련 문제