我不得到getImages方法
的getImages
方法對於images
屬性恰好被設置爲<ui:repeat>
的value
屬性,吸氣。
那麼爲什麼它是一個String對象的列表?我認爲graphicImage
組件的值必須是StreamedContent?
是的,它的值必須是一個StreamedContent,但不能通過StreamedContents循環來在頁面上構建圖像列表。之所以這樣做,是因爲Primefaces組件在HTML頁面上呈現爲標準HTML <img>
標記。如果您要查看Firebug或Fiddler或其他工具的控制檯輸出,您將注意到JSF頁面的請求,然後您還會注意到頁面引用的每個圖像資源的單獨請求。這些圖像資源必須從一系列單獨的請求中逐一加載,那麼ManagedBean應該如何知道哪個請求映射到哪個圖像?
這就是重複組件必須遍歷唯一圖像ID列表的原因,因爲實質上,當它構建一個graphicImage組件時,它將構建一個HTML圖像標記,並引用特定圖像的網絡服務器,由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
屬性是一個managed bean屬性getter並且它是用於裝載每隔一個graphicImage
組件獲取圖像的方法相同。不同的是,在image
屬性獲取方法中,我們可以使用FacesContext
來獲取作爲HTTP請求參數傳遞的唯一圖像ID。
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()));
}
+1浪費我的10分鐘發佈一個非常類似的答案:)唯一的區別是,我還提到'getImage()'不適用於視圖範圍的bean。這個bean必須是request/session/application作用域。一個完全獨立的應用程序範圍的bean是最好的。 – BalusC 2012-02-17 12:22:04
@BalusC很高興浪費你的時間:)我不知道getImage在ViewScoped bean中不起作用,爲什麼?另外,我一直在我的項目中使用獨立的RequestScoped bean,但爲什麼ApplicationScoped更適合這種情況? – 2012-02-17 12:32:18
視圖範圍的bean特定於視圖。資源請求沒有視圖的概念。請求範圍的bean將在每個請求中重新創建。但是,這個bean實例實際上並不包含任何請求範圍的狀態,對吧?所有的工作都是在getter中完成的。 – BalusC 2012-02-17 12:38:24