jsp가 있는데, 테이블의 각 행에 대해 데이터베이스에있는 이미지를 표시해야합니다. 나는 Blob과 같은 이미지를 포함하여 데이터베이스로부터 모든 테이블 행 데이터를 검색하여 그것을 bean에 저장한다. 이미지가 이렇게 바이트 배열로 빈에 저장된다Servlet의 jsp 내부 이미지가 제공되지 않습니다.
photo = rs.getBlob("PHOTO");
photoByteArray = photo.getBytes(1, (int)photo.length());
은 JSP 콩의리스트를 반복하지만, 이런 서블릿 src 속성 포인트 :
<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}">
가 게재되는 아래 그림과 같은 이미지이지만 바이트 배열을 디버깅 할 때 데이터가 표시되는 것처럼 보이지 않습니다.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg");
OutputStream o = response.getOutputStream();
String photoDataStr = request.getParameter("photoData");
byte[] photoData = null;
if(photoDataStr != null) {
photoData = photoDataStr.getBytes();
}
o.write(photoData);
o.close();
}
그러나 이미지가 표시되지 않습니다. 이제 아래 그림과 같이 각 개별 이미지의 데이터베이스를 쿼리하면 이미지가 제대로 표시됩니다.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
PreparedStatement pstmt = null;
ResultSet rs = null;
Connection conn = null;
try {
if(conn == null) {
conn = open();
}
pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?");
String id = request.getParameter("id");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if (rs.next()) {
Blob b = rs.getBlob("photo");
response.setContentType("image/jpeg");
response.setContentLength((int) b.length());
InputStream is = b.getBinaryStream();
OutputStream os = response.getOutputStream();
byte buf[] = new byte[(int) b.length()];
is.read(buf);
os.write(buf);
os.close();
is.close();
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
pstmt = null;
}
//check if it's the end of the loop
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
}
누구든지 동일한 권장 사항을 제공 할 수 있다면 매우 감사하겠습니다.
@BaluC : 캐시 등을 설정하는 데 너무 많은 시간을 소비하지 않고도 빠름이 빠릅니다. –
@BalusC : OP에서 남긴 몇 가지 다른 의견을 볼 수있게되었으므로 그는 실제로 , 이미지 데이터를 HTML : 따옴표에 직접 붙여 넣으려고하면 "$ {part.photoData}는 초기 데이터베이스 호출에서 검색된 바이트 배열을 반환합니다." 그런 다음 그는 자신의 서블릿이 태그의 URL로 포함 된 바이트 배열을 추출하여 요청자에게 직접 돌려 줄 것으로 기대합니다. 나는 나의 설명에 대해 나는 꽤 분명하다고 생각했다. 그러나 다른 응답들 중 아무 것도 무슨 일이 일어나고 있는지를 알 수없는 것 같다. –
오 그는 전체 이미지를 매개 변수로 전달하려고 시도했습니다!미안 해요. 지금 보죠. 나는 그것을 이미지 식별자로 해석했다. 나는 내 말을 되 찾는다. – BalusC