2012-06-08 2 views
9

사용자가 항목 카테고리 (이미지로 표시됨) 목록을 볼 수있는 패널을 표시하려고 시도했으며 범주를 클릭하여 제품을 볼 수 있습니다 (이미지가 표시됨)ui : repeat에서 <p : graphicImage>를 DefaultStreamedContent와 함께 사용하는 방법?

항목 카테고리를 표시하려면 UI를 사용 : 지원 콩 CALSS 아래는 내 XHTML 코드

<ui:repeat id="repeat" value="#{getData.images}" var="img" varStatus="loop"> 
<h:panelGroup> 
<p:graphicImage id="img1" value="#{img}" alt="image not available" > 
</p:graphicImage> 
</h:panelGroup> 
</ui:repeat> 

와 관리 콩 코드 부분입니다 NAD 반복을

private ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
private List<StreamedContent> imageList = new ArrayList<StreamedContent>(); 

public List<StreamedContent> getImages(){ 
    for (int i = 0; i < sdh.getNumOfImages(); i++) { 
    imageID = imageIDArray.get(i); 
    ImageService imgSer = new ImageService(); 
    imgList.add(imageID); 
    imgSer.setData(imageID); 
    baos = imgSer.getImage(); 
    try { 
     imageList.add(new DefaultStreamedContent(new 
      ByteArrayInputStream(baos.toByteArray()))); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    } 
    imageNum = 0; 
    return imageList; 
} 

public StreamedContent getData() { 
    baos = imageList.get(imageNum); 
    //imageList.add(baos); 
    imageNum++; 
    return new DefaultStreamedContent(new ByteArrayInputStream(baos.toByteArray())); 
} 

이제 내 문제는 내가하지 주석 일을 할 경우 e 'imageList.add (baos)' 'getData'에서 이미지가 표시되지 않습니다. 이제는 'ui : repeat'가 어떻게 작동하는지 알고 싶습니다. 'imageList'에 이미지가 포함되어 있으므로 필요에 따라 이미지를 저장할 수 있기 때문입니다. getData 메소드에서 고정 숫자 (예 : 'imageList.get (0)')를 지정하면 동일한 이미지가 여러 번 표시됩니다. 'imageList.add (baos)'없이 'imageNum'을 넣은 것처럼 '동적 리소스 스트리밍 오류'오류가 발생합니다.

비욘 폴렉스의 제안에 지쳐서 피곤했지만 지금은 이미지가 나타나지 않습니다.

+1

당신은을 참조되지 않습니다 루프 변수 (귀하의 경우에는'img')를''안에 넣으십시오. 'getImages'는'List '를 리턴해야하고,'

'는'value = "# {img}"'를 가져야합니다. –

답변

16

<p:graphicImage>이 방법을 사용할 수 없습니다. StreamedContent 컬렉션이 아닌 고유 한 이미지 식별자 모음을 반복해야합니다. 그런 다음 고유 한 이미지 식별자는 <f:param>에서 <p:graphicImage>으로 전달되어야하며, 그러면 브라우저에 올바른 URL이 생성됩니다.

<ui:repeat value="#{data.imageIds}" var="imageId"> 
    <p:graphicImage value="#{imageStreamer.image}"> 
     <f:param name="id" value="#{imageId}" /> 
    </p:graphicImage> 
</ui:repeat> 

귀하의 #{data} Bean은 단지이 있어야합니다 관리 :

private List<Long> imageIds; // +getter 

#{imageStreamer} 별도의 응용 프로그램은 다음과 같이 기본적으로 보는 관리 빈 범위이어야한다 :

@ManagedBean 
@ApplicationScoped 
public class ImageStreamer { 

    @EJB 
    private ImageService service; 

    public StreamedContent getImage() throws IOException { 
     FacesContext context = FacesContext.getCurrentInstance(); 

     if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) { 
      // So, we're rendering the view. Return a stub StreamedContent so that it will generate right URL. 
      return new DefaultStreamedContent(); 
     } 
     else { 
      // So, browser is requesting the image. Get ID value from actual request param. 
      String id = context.getExternalContext().getRequestParameterMap().get("id"); 
      Image image = service.find(Long.valueOf(id)); 
      return new DefaultStreamedContent(new ByteArrayInputStream(image.getBytes())); 
     } 
    } 

} 
+1

hankyou BalusC 작동하지만 나는 "com.sun.faces.mgbean.ManagedBeanCreationException을 얻지 못하면 @EJB에 대해 의견을 제시해야했습니다. 관리되는 bean imageStreamer에서 자원 주입을 수행하는 중에 오류가 발생했습니다."질문이 하나 더 있습니다. 이미지가 사라지는 페이지를 새로 고침하십시오. 이유는 무엇입니까? 다시 한번 감사합니다 – user1433804

+0

당신을 진심으로 환영합니다. 글쎄, 방금 비즈니스/데이터 서비스를 위해 EJB를 사용하고 있다고 가정했습니다. DB 트랜잭션을 투명하고 쉽게 처리 할 수있는 쉽고 안전한 방법을 제공합니다. 당신이 그것을 사용하지 않는다면, 당신이 정상적으로 서비스를 얻는 방법으로하십시오. – BalusC

+0

한 번 더 질문합니다. 이미지에 클릭 이벤트가 필요한 경우 어떻게해야합니까? 나는 Ajax를 UI 안에 넣을 수 없다 : 반복한다. – user1433804

0

잘못된 ui : repeat 태그를 사용했습니다. 당신은 VAR 속성이 있지만 페이지에서 이것을 사용할 수 없습니다 : graphicImage 태그 값이 샘플 사용을 참조 attribute.Please,

 <ui:repeat value="#{yourBean.images}" var="img"> 
      <p:graphicImage value="/images/#{img}" /> 
     </ui:repeat>