2013-02-05 48 views
2

我使用JBoss AS7,JSF2,MySQL,EJB和JPA为我的公司创建了一个Java EE应用程序。在JSF视图中显示BLOB类型

我在我的JSF视图中有一个dataTable,其中包含从我的数据库中检索到的数据。在这些数据中,我有一个BLOB列,它可以包含任何文件类型,如图像,PDF,文本。

我想在每一行中打开一个链接,在新窗口中打开文件。

  1. 如何将BLOB类型转换为字节?
  2. 我该怎么做这类工作?

回答

2

如何将BLOB类型转换为字节?

只要把@Lob注释你的JPA @Entitybyte[]财产。


我怎样才能做到这方面的工作?

您需要让JSF在表中生成所需的链接,并将实体ID作为请求参数。

<h:dataTable value="#{bean.entities}" var="entity"> 
    <h:column> 
     <h:outputLink value="#{request.contextPath}/fileservlet?id=#{entity.id}" target="_blank">#{entity.filename}</h:outputLink> 
    <h:column> 
</h:dataTable> 

然后创建一个简单file servlet哪些流的byte[]doGet()响应(明显参数的验证和异常处理中省略)。

@WebServlet("/fileservlet") 
public class FileServlet extends HttpServlet { 

    @EJB 
    private EntityService service; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     Entity entity = service.find(request.getParameter("id")); 
     response.setContentType(entity.getContentType()); 
     response.setContentLength(entity.getContent().length); 
     response.setHeader("Content-Disposition", "inline;filename=\"" + URLEncoder.encode(entity.getFilename(), "UTF-8") + "\""); 
     response.getOutputStream().write(entity.getContent()); 
    } 

} 

其中getContent()返回@Lob byte[]属性。

+0

好的,谢谢BalusC。我也找到了你的链接:http://balusc.blogspot.fr/2007/07/fileservlet.html – pims42

+0

不客气。该链接涉及“普通JDBC”,而不是JPA/EJB。 – BalusC

+0

是的,但我把你的代码做我想做的。 – pims42