0

要件:jspページに画像(imageName,imagesize,image)の詳細を表示したい。画像は、オブジェクト タイプ blob でデータベースに保存されます。データベース テーブルの列は、imageName(varchar2)、imageSize(number)、image(blob) です。Jspの「画像を表示」にボタンがあります。これをクリックすると、データベーステーブル内のすべての画像を、画像名と画像サイズを表形式で表示する必要があります。要約:画像の表示をクリックすると、データベースに保存されている画像名を持つすべての画像を表示する必要があります。

テクノロジー: struts2、jsp、jdbc

私がやったこと:jspで画像を見ることはできますが、画像の名前とサイズを表示することはできません

BlobRetrieval.jsp

<%@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>

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:port/contextRoot/stepImage にアクセスしています。この URL にアクセスすると、制御を BlobRetrieval.jsp に転送する「DisplayBlob.java」のステップ ファーンションを呼び出します。次に、「画像を表示」ボタンをクリックすると、step1 の関数を呼び出します。 「BlobRetrieval.jsp」に制御を再び転送している「Displayblob.java」の。この時点で「imageRetrieved」値がセッションに設定されているため、制御は if ループに入ります。if ループで、画像 src タグを使用して画像を表示していますが、他のフィールド「画像名」と「画像サイズ」を表示できません。db に複数の画像が保存されている場合はどうなりますか。次に、私のコードはどのように見えるでしょうか? imagename が db からどのように取得されるかを考えることができませんか? イベント(ユーザーの介入)なしで、すべてのimageNamesを画像とともに表示する方法。

4

1 に答える 1

2

ここで言及したいことはほとんどありませんが、作業をコーディングした方法で問題は解決しますが、将来的にはコードの変更とメンテナンスは本当に悪夢になるでしょう.

あなたの問題に関して、UIに表示する必要があるプロパティを持つDTO/Beanを作成することをお勧めします

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

}

データベース接続コードを JSP コードから移動し、データベースとの接続のConnectionManager作成/確立を担当するクラスに移動することを強くお勧めします。SQL クエリを実行し、結果を javalist に表示する他のクラスを作成します。

アクションクラスで、データベースに保存されているすべての画像のリストをリストとして返すクラスを呼び出し、そのリストを次のようなJSPに送信できます

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 で、ユ​​ーザーが [すべての画像を表示] ボタンをクリックすると、 のshowAllImagesメソッドを呼び出す必要がありShowImageActionます。JSP でイテレータを使用して、DB からフェッチされるすべての画像を表示します

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

画像を表示するために、各画像の一意の ID を保存し、クリックするとその ID をアクションに渡し、ID に基づいて画像を取得できます。

画像を表示するには、次のような Struts2ストリームの結果タイプを使用できます

 <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> 
于 2012-07-27T11:46:32.700 に答える