2012-06-08 5 views
9

Próbowałem wyświetlić panel, w którym użytkownik może zobaczyć listę kategorii przedmiotów (wyświetlanych jako obrazy), a po kliknięciu mogą wyświetlać produkty w tej kategorii (będą wyświetlane obrazy)Jak korzystać z <p: graphicImage> z DefaultStreamedContent w interfejsie użytkownika: repeat?

Do wyświetlania kategorii przedmiotów, użył ui: repeat nad podtrzymujące fasola calss Poniżej jest mój kodu 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> 

I zarządzanej części Code Bean

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

teraz mój problem, jeśli nie mam znak komentarza th e 'imageList.add (baos)' w 'getData', obrazy nie są wyświetlane. Teraz naprawdę chcę wiedzieć, jak działa "ui: repeat", ponieważ "imageList" zawiera obrazy i mogę je zapisać, jeśli jest to wymagane w jednej z metod. Jeśli określę stałą liczbę (np. "ImageList.get (0)") w metodzie "getData", to ten sam obraz jest wyświetlany wiele razy. Gdzie tak, jakbym wstawił "imageNum" bez "imageList.add (baos)" to spowodował błąd "Błąd w strumieniowym zasobie dynamicznym"

Zmęczony sugestią Bjorn Pollex i wprowadziłem niezbędne zmiany, ale teraz obrazy nie pojawiają się

+1

Nie jesteś odwołanie do zmienna pętli ('img' w twoim przypadku) wewnątrz twojego' '. Twój 'getImages' powinien zwrócić' List ', a twoje' 'powinno mieć' value = "# {img}" '. –

Odpowiedz

16

Nie jest możliwe użycie <p:graphicImage> ten sposób. Powinieneś raczej powtórzyć kolekcję unikalnych identyfikatorów obrazów, a nie kolekcję StreamedContent. Te unikatowe identyfikatory obrazu należy następnie przekazać jako <f:param> do <p:graphicImage>, które z kolei wygenerują właściwe adresy URL przeglądarki.

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

Twój #{data} udało fasola musi tylko mieć:

private List<Long> imageIds; // +getter 

#{imageStreamer} powinien być osobny wniosek o zakresie zarządzanego fasoli, które wyglądają w zasadzie tak:

@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 działało, ale musiałem skomentować @EJB, jeśli nie dostanę "com.sun.faces.mbbean.ManagedBeanCreationException: Wystąpił błąd podczas wykonywania iniekcji zasobów na zarządzanej fasoli imageStreamer" Mam jeszcze jedno pytanie> Kiedy odśwież stronę, z której obrazy znikają, dlaczego tak jest. Jeszcze raz Thankyou – user1433804

+0

Nie ma za co. Cóż, właśnie założyłem, że używasz EJB do usług biznesowych/danych. Zapewnia łatwy i bezpieczny sposób transparentnego przetwarzania transakcji DB. Jeśli go nie używasz, po prostu rób tak, jak zwykle, aby uzyskać usługę. – BalusC

+0

Jeszcze jedno pytanie, jeśli potrzebuję uzyskać zdarzenie click na obrazie, to jak mam to zrobić. Nie mogę umieścić Ajaxa wewnątrz interfejsu: powtórz. – user1433804

0

Użyto niewłaściwego ui: powtórz tag. Masz atrybut var ale nie można użyć w p: graphicImage wartość tag attribute.Please zobaczyć przykładową użytkowania,

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