2012-06-08 81 views
9

Estaba tratando de mostrar un panel donde el usuario puede ver una lista de categorías de artículos (se muestran como imágenes) y al hacer clic pueden ver productos dentro de la categoría (se mostrarán las imágenes)Cómo usar <p: graphicImage> con DefaultStreamedContent en un ui: ¿repetir?

Para mostrar la categoría del elemento, i se utiliza la interfaz de usuario: repetir la nad calss frijol apoyo A continuación se muestra el código 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> 

Y las partes de código de bean administrado

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

Ahora mi problema si no lo hago º uncomment e 'imageList.add (baos)' en 'getData', las imágenes no se muestran. Ahora realmente quiero saber cómo funciona el 'ui: repeat', ya que 'imageList' contiene las imágenes y puedo guardar el mismo si es necesario en cualquiera de los métodos. Si especifico un número fijo (por ejemplo, 'imageList.get (0)') en el método 'getData', la misma imagen se mostrará varias veces. Donde como si puse el 'imageNum' sin el 'imageList.add (baos)' arrojó error 'Error en la transmisión de recurso dinámico'

Me cansé de la sugerencia de Bjorn Pollex e hice los cambios necesarios, pero ahora las imágenes no aparecen

+1

No se hace referencia a la loop-variable ('img' en su caso) dentro de su' '. Su 'getImages' debería devolver' List ', y su' 'debería tener' value = "# {img}" '. –

Respuesta

16

No es posible utilizar <p:graphicImage> de esta manera. Debería iterar sobre una colección de identificadores de imagen únicos, no sobre una colección de StreamedContent. Esos identificadores de imagen únicos tienen que pasarse como <f:param> a <p:graphicImage>, lo que a su vez generará las URL correctas para el navegador.

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

Su #{data} bean gestionado debe simplemente tener una:

private List<Long> imageIds; // +getter 

El #{imageStreamer} debe ser una aplicación independiente de ámbito bean gestionado que parecen básicamente lo siguiente:

@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 funcionó pero tuve que comentar @EJB, si no obtengo "com.sun.faces.mgbean.ManagedBeanCreationException: Se produjo un error al realizar la inyección de recursos en bean manejado imageStreamer" Tengo una pregunta más> When i actualizar la página desaparecen las imágenes, ¿por qué es así. Una vez más Gracias – user1433804

+0

De nada. Bueno, solo asumí que estabas usando EJB para servicios de negocios/datos. Proporciona una forma fácil y segura de manejar de manera transparente las transacciones de DB. Si no lo está usando, simplemente haga lo que haga normalmente para obtener el servicio. – BalusC

+0

Una pregunta más, si necesito obtener un evento de clic en la imagen, ¿cómo lo hago? No puedo poner un Ajax dentro de la interfaz de usuario: repetir. – user1433804

0

Has usado la etiqueta incorrecta ui: repeat. Usted tiene el atributo var pero no se puede utilizar esto en t: valor de la etiqueta graphicImage attribute.Please ver ejemplos de uso,

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