簡體   English   中英

如何在ui中使用p:graphicImage和StreamedContent:repeat / h:dataTable / p:dataTable?

[英]How to use p:graphicImage with StreamedContent inside ui:repeat/h:dataTable/p:dataTable?

我有一個帶有StreamedContent屬性的對象列表,我需要在<p:graphicImage>組件中顯示它。

<ui:repeat value="#{testuser.answers}" var="imageanswers">
    <p:graphicImage value="#{imageanswers.imageAnswer}" alt="Image" width="200" height="100" />
    <br />
</ui:repeat>

但這沒有顯示出來。 它顯示alt文本。 在ui:repeat或p:dataTable中看到了另一篇文章使用p:graphicImage ,但我不理解getImages()方法。

我沒有getImages方法

getImages方法是images屬性的getter,恰好被設置為<ui:repeat>value屬性。

那么為什么它是String對象的列表呢? 我以為graphicImage組件必須具有一個StreamedContent的值?

是的,它的值必須是StreamedContent,但是你不能遍歷StreamedContents來在頁面上構建圖像列表。 原因是graphicImage Primefaces組件在HTML頁面上呈現為標准HTML <img>標記。 如果您要查看Firebug或Fiddler或其他工具的控制台輸出,您會注意到JSF頁面的請求,然后您還會注意到頁面引用的每個圖像資源的單獨請求。 必須從一系列單獨的請求中逐個加載這些圖像資源,因此ManagedBean應該如何知道哪個請求映射到哪個圖像?

這就是為什么repeat組件必須遍歷唯一的圖像id列表的原因,因為從本質上講,當它構建一個graphicImage組件時,它正在構建HTML圖像標簽,並帶有對Web服務器的引用,以標識由id標識的特定圖像。 要發送此唯一ID,他們使用<f:param> facelets標記,該標記添加標識為HTTP請求參數的唯一標識。

<ui:repeat value="#{bean.images}" var="imageID">
   <p:graphicImage value="#{bean.image}">
      <f:param name="imageID" value="#{imageID}" />
   </p:graphicImage>
</ui:repeat>

重復的graphicImagevalue屬性是一個托管的bean屬性getter,它與加載每個其他graphicImage組件所獲取的圖像的方法相同。 不同之處在於,在image屬性getter方法中,我們可以使用FacesContext來獲取作為HTTP請求參數傳遞的唯一imageID。

public StreamedContent getImage() {
     FacesContext context = FacesContext.getCurrentInstance();
     HttpServletRequest myRequest = (HttpServletRequest) context.getExternalContext().getRequest();
     String imageID = (String) myRequest.getParameter("imageID");
     return new DefaultStreamedContent(new ByteArrayInputStream(themeFacade.find(Long.parseLong(imageID)).getImage()));
} 

如果您嘗試在復合組件中使用graphicImage,則會出現問題...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM