2015-06-02 70 views

回答

6

這不可能直接與<h:graphicImage>。它只能指向一個URL,而不是指向byte[]InputStream。基本上,您需要確保這些字節可作爲給定URL上的HTTP響應直接使用,然後您可以在<h:graphicImage>(甚至純HTML頁面<img>)中使用這些響應。

假如你被它的ID識別,像這樣的形象:

<h:graphicImage value="/image/#{someBean.imageId}" /> 

這裏有這樣一個Servlet的開球例如:

@WebServlet("/image/*") 
public class ImageServlet extends HttpServlet { 

    @EJB 
    private ImageService service; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Long id = Long.valueOf(request.getPathInfo().substring(1)); 
     Image image = service.find(id); 
     response.setContentType(getServletContext().getMimeType(image.getName())); 
     response.setContentLength(image.getBytes().length); 
     response.getOutputStream().write(image.getBytes()); 
    } 

} 

一個更高級的靜態資源的抽象模板支持HTTP緩存的servlet可以在this answer中找到,以及數據庫服務的具體示例。

如果您恰好在JSF 2.2 + CDI環境中使用JSF實用程序庫OmniFaces,則可以改爲使用其更直觀的<o:graphicImage>

<o:graphicImage value="#{imageBean.getBytes(someBean.imageId)}" /> 

@Named 
@ApplicationScoped 
public class ImageBean { 

    @EJB 
    private ImageService service; 

    public byte[] getBytes(Long imageId) { 
     return service.getImageBytes(imageId); 
    } 

} 
+0

我只有從數據庫中沒有其他的字節數組,我使用JSF,所以我只有managedBean,你能幫助我與 – user3364181

+0

是肯定。有關兩種可能方式的啓示示例,請參閱上面的答案。只要有必要就改變它們以適應你的情況。 – BalusC

+0

@Balus請問什麼數據類型或從哪個包圖像是在Image image = service.find(id);該行上的圖像是一個字節[],一個Blob或其他東西?謝謝 – p3ace

相關問題