Чтение изображений в JSF - PullRequest
1 голос
/ 07 июня 2011

Я использую следующий код для чтения изображений из базы данных, но когда я вызываю метод getter для pb в h: значение datatable для отображения изображений на странице 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 Ответ

3 голосов
/ 07 июня 2011

Вы делаете концептуальную ошибку здесь. В HTML изображения должны быть представлены элементом <img> с атрибутом src, который должен указывать на URL-адрес изображения . Это в JSF, представленном компонентом <h:graphicImage>, чей атрибут value будет отображать атрибут src. Он ожидает String, который в свою очередь представляет URL-адрес изображения . Он не ожидает ни блоба, ни байтового массива.

Вам здесь нужен сервлет. Вы должны позволить URL изображения указывать на этот сервлет вместе с идентификатором изображения в качестве параметра запроса или pathinfo и позволить сервлету передавать содержимое изображения из БД в ответ.

Е.Г.

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

, где #{image.id} возвращает уникальный идентификатор изображения. В сервлете, который сопоставлен с шаблоном URL /images/*, вы можете получить его следующим образом:

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

Наконец, используйте этот идентификатор, чтобы получить содержимое как InputStream из БД и записать его в OutputStream ответа с правильным набором заголовков.

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...