簡體   English   中英

使用分頁在數據表中的Primefaces動態圖像

[英]Primefaces dynamic image in datatable using pagination

我已經成功實現了BalusC建議的解決方案,用於在數據表中渲染動態圖像(代碼在此處發布)。 我面臨的問題是:

問題

// ImageBean - SessionScoped        
// Get image for compound
public StreamedContent scaledImageById() {
    FacesContext context = FacesContext.getCurrentInstance();

    if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
        return new DefaultStreamedContent();
    } else {
        String idStr = context.getExternalContext().
                                       getRequestParameterMap().get("id");
        StreamedContent image = scaledCompoundImageMap.
                                              get(Integer.valueOf(idStr));
        return image;
    }
}


// Controller - ViewScoped
<p:dataTable id="cTable" value="#{controller.compoundList}" var="compound">
       <p:column headerText="Structure" style="text-align:center">
          <p:graphicImage id="scaledImage" 
                          value="#{imageBean.scaledImageById()}"     
                          cache="false">
                <f:param name="id" value="#{compound.id}" />
          </p:graphicImage>
       </p:column>   
  ...

因此,當我在分頁器中訪問新頁面時,圖像顯示良好。 但是當我回到已經訪問過的頁面時,圖像不會顯示(即使scaledImageById被調用了兩次並且StreamedContent返回的很好)。

如果您在這里需要任何其他代碼,請告訴我,我們將不勝感激。 謝謝。

阿卜杜勒

在HTML方面,您具有img元素:

<img src="some_url?id=xyz"/>

如果圖像存儲在數據庫中並且從未更改(上載新圖像會在您的實體中創建新的圖像ID),則可以為圖像創建自定義servlet,從而獲得更大的靈活性和性能。

1)創建servlet並將其綁定到“ some_url”

2)在servlet中,從數據庫(或其他任何東西)讀取圖像

3)設置標頭,最重要的內容類型和內容長度以及緩存標頭

4)將內容寫入輸出流

加號的是,如果您具有恆定的圖像URL和良好的緩存策略,則瀏覽器將從緩存中獲取圖像-不必每次都調用Bean。

暫無
暫無

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

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