2012-06-08 15 views
9

Ich habe versucht, ein Panel anzuzeigen, in dem Benutzer eine Liste von Elementen Kategorie sehen können (als Bilder angezeigt) und klicken sie Produkte in der Kategorie anzeigen könnenWie <p: ​​graphicImage> mit DefaultStreamedContent in einem ui zu verwenden ist: wiederholen?

Für die Anzeige der Positionstyp (Bilder angezeigt werden), i die ui verwendet: repeat nad die Stütz Bohne calss Unten ist mein xhtml Code

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

Und die Managed Bean-Code Teile

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())); 
} 

Nun mein Problem, wenn ich nicht uncomment th e 'imageList.add (baos)' in 'getData' werden die Bilder nicht angezeigt. Nun möchte ich wirklich wissen, wie das 'Ui: Repeat' funktioniert, da die 'ImageList' die Bilder enthält und ich kann das gleiche speichern, wenn in beiden der Methode erforderlich. Wenn ich eine feste Zahl (zB: 'imageList.get (0)') in der Methode 'getData' festlege, wird dasselbe Bild mehrmals angezeigt. Wo als ob ich die 'imageNum' ohne die 'imageList.add (baos)' setzen es Fehler 'Fehler beim Streaming dynamische Ressource'

Ich müde Bjorn Pollex Vorschlag und machte die notwendigen Änderungen, aber jetzt Bilder erscheinen nicht

+1

Sie verweisen nicht die loop-variable ('img' in Ihrem Fall) innerhalb Ihrer' '. Ihre 'getImages' sollten eine' List 'zurückgeben, und Ihr' 'sollte' value = "# {img}" 'haben. –

Antwort

16

Es ist nicht möglich zu sehen ist <p:graphicImage> diese Weise zu nutzen. Sie sollten lieber über eine Sammlung eindeutiger Bildbezeichner iterieren, nicht über eine Sammlung von StreamedContent. Diese eindeutigen Bildbezeichner müssen dann als <f:param> an <p:graphicImage> übergeben werden, was wiederum die richtigen URLs für den Browser erzeugt.

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

Ihre #{data} Managed Bean muss eine gerade haben:

private List<Long> imageIds; // +getter 

Die #{imageStreamer} sollte eine separate Anwendung sein Managed Bean scoped die wie folgt grundsätzlich aussehen:

@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 es funktionierte, aber ich musste kommentieren @EJB, wenn ich nicht bekomme ich com.sun.faces.mgbean.ManagedBeanCreationException: Fehler beim Ausführen der Ressourcen-Injektion auf verwalteten Bean imageStreamer "Ich habe noch eine Fragen> Wann ich Aktualisieren Sie die Seite, die Bilder verschwinden, warum ist es so. Nochmals Danke! – user1433804

+0

Gern geschehen. Nun, ich habe einfach angenommen, dass Sie EJBs für Business/Datendienste verwenden. Es bietet eine einfache und sichere Möglichkeit, DB-Transaktionen transparent zu behandeln. Wenn Sie es nicht verwenden, tun Sie einfach so, wie Sie es normalerweise tun, um den Service zu erhalten. – BalusC

+0

Noch eine Frage, wenn ich ein Klickereignis auf das Bild bekommen muss, wie mache ich es dann. Ich kann kein Ajax in das UI legen: wiederhole es. – user1433804

0

Sie haben falsch verwendet ui: tag wiederholen. Sie haben var Attribut Sie können dies aber nicht in p verwenden: graphicImage Tag-Wert attribute.Please Probenverbrauch,

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