要求:我想在 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。