JSP 2.1과 함께 JSF 1.2를 사용하여 AC : Foreach 태그의 통합 EL 표현식에서 해시 테이블을 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/136696

  •  02-07-2019
  •  | 
  •  

문제

해시 가능이 있습니다u003CInteger, Sport> SportMap 및 SportIDS 목록 (목록u003CInteger> 내 뒷면 콩에서 sportids). 스포츠 객체에는 목록이 있습니다u003CString> 장비 목록. Unified EL을 사용하여 각 스포츠에 대한 장비 목록을 얻을 수 있습니까?

<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 ()을 무시하고 싶지 않습니다).

도움이 되었습니까?

해결책

@keith30xi.myopenid.com

JSF 1.2에서는 사실이 아닙니다. 에 따르면 Java.net Wiki FAQ 그들은 예상대로 함께 일해야합니다.

다음은 각 FAQ의 추출물입니다.

JSF 1.1 FAQ
Q. Javaserver가 태그가 JSTL 코어 태그와 상호 운용되는 경우, foreach, if, 선택 및시기?

A. Foreach 태그는 JSTL과 Javaserver Faces 기술 사이의 비 호환성으로 인해 Javaserver Faces 기술, 버전 1.0 및 1.1 태그와 함께 작동하지 않습니다. 대신, 자체 반복을 수행하는 DataTable Tag에서 사용하는 테이블 렌더러와 같은 렌더러를 사용할 수 있습니다. IF, 선택 및 태그가 작동하지만 Javaserver는이 태그 내에 중첩 된 태그에 직면하여 명시 적 식별자가 있어야합니다.

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

JSF 1.2 FAQ
Q. Javaserver가 태그가 JSTL 코어 태그와 상호 운용되는 경우, foreach, if, 선택 및시기?

A. 예. JSP ID 소비자라고하는 JSP 2.1의 새로운 기능을 통해 이러한 태그는 예상대로 작동 할 수 있습니다.

JSTL 코어 태그와 함께 JSF 태그를 특별히 Foreach로 사용한 사람이 있습니까?

다른 팁

한 번도 같은 문제가 있었고 DataTable을 사용하여 솔루션을 찾을 수 없었습니다. 문제는 var입니다 _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>

그러나이 경우 각 장비 목록 항목은 테이블 행 안에 인쇄됩니다. 그것은 저를 훌륭한 해결책이 아니 었습니다.

데이터 가능 대신 일반 HTML 테이블을 사용하기로 결정했습니다.

<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>

효과가있다. 바인딩 및 행 매핑과 같은 특정 데이터 가능한 기능이 필요한 경우 F : setPropertyactionListener 꼬리표.

두 가지 문제 :

  1. DataTable에는 헤더 패싯, 바닥 글면, 열. 다른 것은 올바르게 평가되지 않을 것입니다.
  2. JSTL 태그는 JSF 구성 요소와 연결할 수 없습니다. JSTL 태그는 구성 요소 트리가 생성 될 때 평가됩니다. JSF 구성 요소는 페이지가 렌더링되면 평가됩니다. 따라서 C : Foreach 태그는 구성 요소 트리가 만들어지면 한 번만 평가됩니다.

원하는대로 루핑을 제공하는 JSF 구성 요소 라이브러리를 사용하거나 원하는 루프를하는 것을 빌드하거나 콩을 리팩터링하여 SportID를 반복하는 대신 각 스포츠가 ID와 장비가있는 스포츠 목록을 통한 루프 .

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top