2012-07-27 3 views
0

요구 사항 : jsp 페이지에 이미지의 세부 정보 (이미지 이름, 이미지 크기, 이미지)를 표시하고 싶습니다. 이미지는 객체 유형이 blob 인 데이터베이스에 저장됩니다. 데이터베이스 테이블의 열은 imageName (varchar2), imageSize (number), image (blob)입니다. Jsp '이미지 표시'에는 버튼이 있습니다. 여기를 클릭하면 이미지 이름과 이미지 크기가 표 형식으로 된 데이터베이스 테이블의 모든 이미지를 표시해야합니다. 요약 : 쇼 이미지 클릭시 DB에 저장된 이미지 이름을 가진 모든 이미지를 표시해야합니다.Jsp의 모든 이미지를 이름과 크기로 표시

기술 : struts2, JSP, JDBC

내가 무슨 짓을 : 나는

<%@page import="java.sql.Blob"%> 
<%@page import="java.io.OutputStream"%> 
<%@page import="java.sql.SQLException"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib prefix="s" uri="/struts-tags" %> 
<!DOCTYPE html> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Esp Page</title> 
    <script type="text/javascript"> 
     function showImage() 
     { 
      document.imgFrm.action="step1Image"; 
      document.imgFrm.submit(); 
     } 
    </script> 
</head> 
<body>  
    <s:form name="imgFrm"> 
     <input type="button" name="b" value="ShowImage" onclick="showImage()"/> 
    <% System.out.println("[BlobRetrieval.jsp] session value "+session.getAttribute("imageRetrieved")+" if null then dont show images");%> 
     <% 
     if(session.getAttribute("imageRetrieved")!=null) 
     { 
     %> 
     <br></br> 
     <table id="myDiv" name="myDiv" style="color: #0900C4; font: Helvetica 12pt;border: 1px solid black; height: auto;"> 
      <tr> 
       <td>Image name</td> 
       <td> <img src="DisplayBlob.jsp"> </img></td> 
      </tr> 
     </table> 
     <% 
     } 
    else 
    { 
System.out.println("[BlobRetrieval.jsp]Session value is null"); 
    } 
%> 
    </s:form> 
</body> 
</html> 
이미지 이름과 크기를 보여줄 수 JSP하지만

BlobRetrieval.jsp에 이미지를 볼 수 있어요

DisplayBlob.jsp

<%@ page import="java.sql.*"%> 

<%@ page import="java.io.*"%> 

<% Blob image = null; 

java.sql.Connection con = null; 

byte[ ] imgData = null ; 

java.sql.Statement stmt = null; 

java.sql.ResultSet rs = null; 

try { 



    con = java.sql.DriverManager.getConnection("jdbc:oracle:thin:@ip:port:sid","schemaName", "password"); 

stmt = con.createStatement(); 

rs = stmt.executeQuery("SELECT fileobj,fileName,fileSize FROM DISPLAYBLOB"); 

if (rs.next()) { 

image = rs.getBlob(1); 

imgData = image.getBytes(1,(int)image.length()); 

} else { 

out.println("Display Blob Example"); 

out.println("image not found for given id>"); 

return; 

} 

// display the image 

response.setContentType("image/gif"); 

OutputStream o = response.getOutputStream(); 

o.write(imgData); 

o.flush(); 

o.close(); 
} catch (Exception e) { 

out.println("Unable To Display image"); 

out.println("Image Display Error=" + e.getMessage()); 

return; 

} finally { 

try { 

rs.close(); 

stmt.close(); 

con.close(); 

} catch (SQLException e) { 

e.printStackTrace(); 

} 

} 

%> 

struts.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
"http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
<constant name="struts.devMode" value="true" /> 
<package name="struts2" extends="struts-default" namespace="/"> 
    <action name="*Image" class="example.DisplayBlob" method="{1}"> 
     <result name="input">BlobRetrieval.jsp</result> 
    </action> 
</package> 
<constant name="struts.action.excludePattern" value="/*.servlet"/> 
</struts> 

DisplayBlob.java

package example; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionSupport; 
import java.util.Map; 
public class DisplayBlob extends ActionSupport { 
public String step() throws Exception 
{ 
    Map session = (Map)ActionContext.getContext().getSession(); 
    session.clear(); 
    System.out.print("[DisplayBlob] step "); 
    return "input"; 
} 
public String step1() throws Exception 
{ 
    Map session = (Map)ActionContext.getContext().getSession(); 
    System.out.print("[DisplayBlob] step1 "); 
    session.put("imageRetrieved", "imageRetrieved"); 
    return "input"; 
} 
} 

우선 난 URL의 IP 액세스하고 포트/컨텍스트 루트/stepImage 을 난 BlobRetrieval로 제어를 전달하는 'DisplayBlob.java'의 단계 furntion를 호출하고,이 URL에 액세스하는 .jsp를 클릭 한 다음 'show images'버튼을 클릭하면 'Displayblob.java'의 step1 함수가 호출되어 다시 'BlobRetrieval.jsp'로 제어를 전달합니다. 이 시점에서 'imageRetrieved'값은 세션에서 설정되므로 제어는 if 루프에서 진행됩니다. if 루프에서 이미지 src 태그를 사용하여 이미지를 표시하고 있지만 다른 필드 '이미지 이름'및 '이미지 크기'를 표시 할 수 없습니다. db에 하나 이상의 이미지가 저장되면 어떻게 될까요? 그러면 내 코드는 어떻게 생겼을까요? imagename이 db에서 어떻게 생겨날 것인가를 생각할 수 없습니까? 어떤 이벤트 (사용자 invervaention)없이 내가 어떻게 모든 imageNames 이미지와 함께 표시한다.

답변

2

여기서 언급하고 싶은 몇 가지 사항은 작업 내용을 코딩 한 방식으로 문제가 해결되지만 향후 코드 변경 사항은 실제로 악몽이 될 것이라는 점입니다.

문제를 Regardiing 난 당신이 내가 강력하게 당신이 당신의 JSP 코드에서 데이터베이스 연결 코드를 이동하고 이동하는 것이 좋습니다 당신은 UI

public class ImageBean{ 
private String imageName; 
private int imageSize 
    // any other field you want to 
    //there getter and setters 

} 

에 표시해야하는 특성을 가진 DTO/bean을 작성하는 것이 좋습니다 데이터베이스와의 연결/생성을 담당해야하는 클래스 인 ConnectionManager에게. SQL 쿼리를 실행해야하는 다른 클래스를 생성하여 javalist에 결과를 제공합니다.

액션 클래스에서는 데이터베이스에 저장된 모든 이미지의 목록을 목록으로 반환하는 클래스를 호출하고 해당 목록을 다시 보낼 수 있습니다. 당신에

public class ShowImageAction extends ActionSupport{ 

    private List<ImageBean> imageList; 
    // getter setters for this 

    public String showAllImages() throws Exception{ 
     imageList=ConnectionManager.getConnection.executeQuery("fetch all images from DB");  
    } 
} 

같은 JSP 뭔가 JSP로 할 때 모든 이미지 버튼은 ShowImageActionshowAllImages 메소드를 호출 할 필요가 쇼에 사용자가 클릭.모든 이미지는 이미지를 표시하기위한 DB

<s:iterator value="imageList" status="imgObject"> 
    <s:property value="imageName" /> 
    <s:property value="imageSize" /> 
</s:iterator> 

에서 반입되고 표시하기 위해 JSP에서 반복자를 사용하여 각 이미지의 고유 ID를 저장하고 ID를 액션에 해당 ID를 전달할 수 있습니다 클릭 및 기반시 할 수 있습니다 이미지를 가져옵니다. 당신은 응답을 Umesh..Thankx @

<result name="selectedImage" type="stream"> 
       <param name="contentType">image/jpg</param> 
       <param name="inputName">imageStream</param> 
       <param 
name="contentDisposition">filename="image.jpg"</param> 
       <param name="bufferSize">1024</param> 
      </result> 
+0

처럼 Struts2 stream result 유형을 사용할 수 있습니다 이미지를 보여주는

! 나는 당신의 모든 제안을 돌봐 줄 것이다 ... "이미지를 보여주기 위해 각 이미지의 고유 한 ID를 저장할 수 있으며, 클릭하면 해당 ID를 액션에 전달할 수 있고 ID를 기반으로 이미지를 가져올 수 있습니다."클릭이없고, 그게 내 문제 야. 클릭하지 않고 어떻게 모든 이미지를 표시 할 수 있습니다 ... 하나 soltion 먼저 모든 imageName retieve 및 ArrayList .... 저장된 다음이 레이 목록을 반복하고 iterating 동안 각 imageName databaase 및 blob 검색 다시 데이터베이스에 액세스) ... 나는 struts2의 스트림 결과를 이해할 수 없다. – user752590

+1

@ user752590 구체적으로 무엇이 필요합니까? [stream result docs] (http://struts.apache.org/2.x/docs/stream-result.html)에는 설정이 표시됩니다. 쇼케이스 애플리케이션의 예제는'struts-filedownload' 부분에 있습니다. –

관련 문제