在jsf中读取图像

时间:2011-06-07 17:18:43

标签: jsf jsf-2

我正在使用以下代码从数据库中读取图像但是当我在h:datatable值中调用pb的getter方法在jsf页面上显示图像时,我得到错误“oracle.sql.BLOB无法转换为java.lang .String“。有什么想法吗?

Java类有pb属性。

用于阅读图像的Java代码:

public List<ImageBean> getPb() throws Exception {
int i = 0;
List<ImageBean> pb= new ArrayList<ImageBean>(); 
String url = "jdbc:oracle:thin:@localhost:1521:globldb3";
String username = "scott";
String password = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url, username, password);
String sql = "SELECT name,image FROM save_image";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet resultSet = pstmt.executeQuery();
while (resultSet.next()) {
 String n =resultSet.getString(1);
 File image = new File("D:\\java3.JPG");
 FileOutputStream fos = new FileOutputStream(image);
 byte[] buffer = new byte[1];
 InputStream is = resultSet.getBinaryStream(2);
 while (is.read(buffer) > 0) {
  fos.write(buffer);
 }
 pb.add(i,new ImageBean(n,resultSet.getBlob(2)));       
 i++;
 fos.close();
 }
conn.close();   
return pb;0
}  

JSF页面: -

<h:dataTable  styleClass="panelGridColums" value="#{tableBean.pb}" var="i" border="1" >
<h:column>
    <f:facet name="header">Id</f:facet>
    <h:graphicImage value="#{i.pimage}" />
</h:column>
</h:dataTable>

1 个答案:

答案 0 :(得分:3)

你在这里犯了一个概念上的错误。在HTML中,图片由<img>元素表示,其src属性应指向图片的网址。这是由<h:graphicImage>组件表示的JSF,其value属性将呈现src属性。它需要String,而<h:dataTable value="#{bean.images}" var="image"> <h:column><h:graphicImage value="images/#{image.id}" /></h:column> </h:dataTable> 代表图片的网址。它不期望一些blob,也不期望一个字节数组。

你基本上需要一个servlet。您应该让图像的URL指向该servlet以及图像标识符作为请求参数或pathinfo,并让servlet将图像的内容从数据库流式传输到响应。

E.g。

#{image.id}

其中/images/*返回唯一图像标识符。在映射到String imageId = request.getPathInfo().substring(1); 的URL模式的servlet中,您可以按如下方式获取它

InputStream

最后使用此标识符从数据库中获取OutputStream的内容,并沿着正确的标题集将其写入响应的{{1}}。

另见: