[英]How to put p:commandLink with p:graphicImage in a dynamic columns 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>
重復的graphicImage
的value
屬性是一個托管的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.