2014-04-06 18 views
0

인증 된 사용자의 이미지를 데이터베이스에 업로드하고 이전에 서블릿을 통해 동적으로 업로드 한 모든 이미지를 표시하는 작은 애플리케이션을 만들고 있습니다.서블릿을 통해 jsp 페이지에 이미지 표시

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<jsp:include page="/RetrieveImagesServlet.do"></jsp:include> 
</head> 

이 페이지 요청에 사용자 이미지를 설정하고 잘 작동 :

은이 코드를 사용하여 데이터베이스에서 페이지로드에서 이미지를 검색 할 수 있습니다.

이제 테이블 형식으로 이미지 데이터를 표시하려면 jstl을 사용하십시오. 사용자 이미지 객체는 byte[] 형식의 이미지를 포함하므로 서블릿을 호출하여 아래 이미지 파일을 인쇄합니다.

<c:forEach var="imageDto" items="${requestScope.userImages}"> 
       <tr> 
        <td><c:out value="${imageDto.getSerialNumber()}"></c:out></td> 
        <td><c:out value="${imageDto.getImageName() }"></c:out></td> 
        <td><c:out value="${imageDto.getImageSize()}"></c:out></td> 
        <td> 
         <c:set var="imageDto" scope="request" value="${imageDto}"></c:set> 
         <jsp:include page="/ImageDisplayServlet.do"></jsp:include> 
         <c:remove var="imageDto" scope="request" /></td> 
        <td></td> 
       </tr> 
      </c:forEach> 

위의 코드에 포함 된 라인 <jsp:include page="/ImageDisplayServlet.do"></jsp:include> 참고 ImageName를 인쇄 할 수 있지만, 나는 호출 서블릿의 이미지를 얻을 수 있어요

response.setContentType("image/jpeg"); 
    final ImageDto imageDto = (ImageDto) request.getAttribute("imageDto"); 
    System.out.println(imageDto.getImageName()); 
    final OutputStream outputStream=response.getOutputStream(); 
    outputStream.write(imageDto.getImageFile()); 
    outputStream.close(); 

아래의 코드를 포함하는 표시하는 서블릿을 호출 final OutputStream outputStream=response.getOutputStream();에 illegalStateException을 발생시킵니다.

제발 내가 어디가 잘못되었는지 안내하고 jsp 파일에 이미지를 표시 할 수 있습니까?

답변

0

브라우저와 HTTP의 작동 방식을 이해하지 못했습니다. HTML 페이지를로드 할 때 HTTP 요청을합니다. 요청에 대한 응답은 HTML 코드가 포함 된 페이지입니다. 예를 들어

<img src="someImage.png" /> 

브라우저는 HTML을 다음, 해석 img 태그가 있음을보고하고 someImage.png에 제 2의 다른 요청을 전송한다. 이 두 번째 요청에 대한 응답은 이미지의 바이트입니다.

첫 번째 요청에 대한 응답으로 이미지의 바이트 인 을 보내려고합니다. 그건 안돼. JSP에 의해 생성 된 HTML 페이지는 이미지의 바이트를 응답에 보낼 서블릿을 가리키는 img 태그를 포함해야합니다. 예를 들면 다음과 같습니다.

<img src="ImageDisplayServlet.do?imageId=${imageDto.id}" /> 
+0

예 이제 나는 당신이 말한 것처럼 그것을 이해합니다. 그러나 처음으로 이미지 용 데이터베이스를 방문한 경우 모든 이미지 데이터를 반환해야하며 데이터베이스에서 이미지를 가져 오기 위해 각 이미지 ID로 돌아갈 필요가 없습니다. 어떤 방법이 있든 이미 모든 이미지를 가져 왔을 때 이미지를 가져 오기 위해 각 이미지 ID에 대해 데이터베이스에 도달해야합니다. – theSilentOne

+0

첫 번째 쿼리는 모든 이미지 바이트를로드해서는 안됩니다.이 시점에서 바이트를 사용하면 캐시에 저장하지 않고 다음 요청을 기다리지 만 코드가 상태를 유지하게됩니다. 캐시를 삭제할시기를 알지 못합니다.) –

관련 문제