【问题标题】:Reading images in jsf在 jsf 中读取图像
【发布时间】:2026-02-10 02:00:01
【问题描述】:

我正在使用以下代码从数据库中读取图像,但是当我在 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>

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    你在这里犯了一个概念上的错误。在 HTML 中,图像将由带有 src 属性的 &lt;img&gt; 元素表示,该属性应指向图像的 URL。这在 JSF 中由 &lt;h:graphicImage&gt; 组件表示,其 value 属性将呈现 src 属性。它需要一个String,它又代表图像的URL。它不需要一些 blob,也不需要字节数组。

    这里基本上需要一个 servlet。您应该让图像的 URL 与图像标识符一起作为请求参数或路径信息指向该 servlet,并让 servlet 将图像的内容从数据库流式传输到响应。

    例如

    <h:dataTable value="#{bean.images}" var="image">
        <h:column><h:graphicImage value="images/#{image.id}" /></h:column>
    </h:dataTable>
    

    #{image.id} 返回唯一的图像标识符。在映射到/images/* 的 URL 模式的 servlet 中,您可以按如下方式获取它

    String imageId = request.getPathInfo().substring(1);
    

    最后使用此标识符从数据库中获取内容为InputStream,并沿着一组正确的标头将其写入响应的OutputStream

    另见:

    【讨论】: