0

要求:我想在 jsp 页面上显示图像(图像名称,图像大小,图像)的详细信息。图像以对象类型 blob 存储在数据库中。数据库表的列是 imageName(varchar2),imageSize(number),image(blob)。Jsp“显示图像”中有一个按钮。单击此按钮时,我必须以表格格式显示数据库表中的所有图像,其中包含图像名称和图像大小。摘要:单击显示图像时,我必须显示所有具有图像名称的图像,这些图像存储在 db.xml 中。

技术: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 时,我正在调用“DisplayBlob.java”的步骤,它将控制转发到 BlobRetrieval.jsp,然后单击“显示图像”按钮,我正在调用步骤 1 的函数'Displayblob.java' 再次将控制权转发给'BlobRetrieval.jsp'。由于此时在会话中设置了“imageRetrieved”值,因此控制在 if 循环中进行。在 if 循环中,我使用图像 src 标签显示图像,但无法显示其他字段“图像名称”和“图像大小”。如果数据库中存储了多个图像怎么办?那么我的代码应该是什么样子呢?我无法想象 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 中使用迭代器来显示从数据库中获取的所有图像

 <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 回答