2012-02-16 40 views
1

我有一個StreamedContent屬性的對象列表,我需要在<p:graphicImage>組件中顯示它。如何在ui中使用帶有StreamedContent的p:graphicImage:repeat/h:dataTable/p:dataTable?

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

但是沒有顯示。它會顯示替代文字。我看到這個其他職位Use of p:graphicImage in ui:repeat or p:dataTable,但我不明白getImages()方法。

回答

3

我不得到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> 

重複graphicImagevalue屬性是一個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())); 
} 
+2

+1浪費我的10分鐘發佈一個非常類似的答案:)唯一的區別是,我還提到'getImage()'不適用於視圖範圍的bean。這個bean必須是request/session/application作用域。一個完全獨立的應用程序範圍的bean是最好的。 – BalusC 2012-02-17 12:22:04

+1

@BalusC很高興浪費你的時間:)我不知道getImage在ViewScoped bean中不起作用,爲什麼?另外,我一直在我的項目中使用獨立的RequestScoped bean,但爲什麼ApplicationScoped更適合這種情況? – 2012-02-17 12:32:18

+2

視圖範圍的bean特定於視圖。資源請求沒有視圖的概念。請求範圍的bean將在每個請求中重新創建。但是,這個bean實例實際上並不包含任何請求範圍的狀態,對吧?所有的工作都是在getter中完成的。 – BalusC 2012-02-17 12:38:24

0

如果您嘗試使用graphicImage的複合材料部件以及內部這是一個問題......

相關問題