用JSP+Servlet实现二进制图像的动态显示
数据库应用程序,特别是基于WEB的数据库应用程序,通常会涉及到图片信息的显示。我们知道在HTML语言当中为了显示静态的图片资料,可以利用如下标记来实现:
<img src="../image/hello.png" width="100" height="80">,而要显示动态的图片资料,就要采用相关的数据库访问技术来实现。在JSP环境编程中解决办法多种多样,通常是在数据库中 保存相应的图片资料的名称,而后在JSP中可以建立相应的数据源,利用数据库访问技术处理图片信息。在静态标记的基础上,略加修改就可以用如下的标记语言 实现动态图片资料的显示,即:<img src="../image/"+RS_photo.getString(photo_fiield) width="100" height="80">。
以上两种解决方案,主要是将所要显示的图片资料存在特定的目录下进行存取控制。如 果图片资料是存储在数据库中的二进制数据,上述方法就不能满足需要了。实际操作中,可以利用JSP+Servlet的编程模式来实现图片资料的浏览显示。 其基本思想是,用Servlet实现图片资料的后台处理,用JSP进行页面表现,具体的编程思想如下所述。
1.建立后台数据库和数据库应用程序
假定处理的是某公司的员工信息,那么我们可以建立相应的数据库及数据表对象。假定我们要存取的数据表结构如下所示:
/****** Object: Table [dbo].[employee] Script Date: 2002-7-31 21:42:10 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[employee]
GO
/****** Object: Table [dbo].[employee] Script Date: 2002-7-31 21:42:10 ******/
CREATE TABLE [dbo].[employee] (
[id] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[name] [char] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[sex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
[birthday] [datetime] NULL ,
[photo] [image] NULL ,
用JSP+Servlet实现二进制图像的动态显示 [char] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[department] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
其 中,employee表中的列photo字段用于存储员工的照片信息,则用于存储图像,其数据类型为“image”。接下来我们就可以建立应用程序,向数 据库中添加图文信息。基本的操作数据库应用程序相对简单,大家可以利用流行的多种开发工具加以实现,并向数据库中添加若干记录。图1是利用Delphi6 实现的一种可行存储image的应用解决方案。
图1 Delphi6操作数据库image列
程 序实现的关键技术是流式信息存取技术。即为了实现对Image列的存取,在程序中采用了数据流读写图片资料。其实现代码主要在数据保存和记录集移动的事件 里。程序代码在此就不再详述。可以参阅作者的文章《用Delphi6操作SQL SERVER 2000的Image列存取JPEG图象》
2.用Jbuilder7建立WEB应用程序
对 于WEB应用程序的实现方式,我们可以采用JDK 1.4 JAVA环境、Apache Tomcat 4.0和Dreamweaver MX,也可以选择Jbuilder7的集成开发环境。下面我们以Jbuilder7集成开发环境为例说明WEB应用程序的具体实现过程。
2.1 建立数据库连接池访问
启 动Jbuilder7后,新建工程readpicfromdb.jpx。在工程中建立数据库连接池对象类,主要包括一个管理类 DBConnectionManager,负责提供与多个连接池对象DBConnectionPool类之间的接口。每一个连接池对象管理一组JDBC连 接对象,每一个连接对象可以被任意数量的Servlet共享。类DBConnectionPool可以提供以下功能:
● 从连接池获取(创建)可用连接
● 把连接返回给连接池
● 在系统关闭时释放所有资源,关闭所有连接
类DBConnectionManager则用于管理多个连接池对象,它提供以下功能:
● 装载和注册JDBC驱动程序
● 根据在属性文件中定义的属性创建连接池对象
● 实现连接池名字与其实例之间的映射。
● 跟踪客户程序对连接池的引用,保证睚最后一个客户程序结束时安全地关闭所有连接池。
上述两个类的详细代码,读者可以参阅相关书籍,这里主要给出本例中用到的属性文件db.properties其代码如下所示:
**********数据库连接池属性文件db.properties***************
drivers=sun.jdbc.odbc.JdbcOdbcDriver //定义JDBC-ODBC桥驱动程序
logfile=D:\webapp\log.txt //定义日志文件存放的位置和名称
comdb.url=jdbc:odbc:graduweb //定义数据库的JDBC的URL
comdb.maxconn=10 //定义数据库的最大连接数
comdb.user=sa //指定用于该连接池的数据库帐号
comdb.password=sa //数据库相应帐号的密码
**********数据库连接池属性文件db.properties***************
最后将编译过的包含数据库连接池类的JAVA类DBConnectionManager.java 、DBConnectionManager.class以及上图的db.properties文件一并放在工程文件的WEB-INF下的classes目录下。
2.2 编写读取二进制图片的Servlet
从Jbuilder7的File菜单里选择新建Servlet,并将其命名为getphoto。该Servlet的JAVA源代码如下所示:
***************Servlet getphoto.java 的JAVA代码*************
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
public class getphoto extends HttpServlet {
private static final String CONTENT_TYPE = "image/jpeg";
/**Initialize global variables*/
public void init() throws ServletException {
}
/**Process the HTTP Get request*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//在数据库中照片的ID
String PHOTOID = null;
try {
PHOTOID = request.getParameter("photoid");
}
catch(Exception e) {
e.printStackTrace();
}
//连接数据库,自定义的数据库连接池管理类
DBConnectionManager connMgr;
connMgr = DBConnectionManager.getInstance();
Connection conn = connMgr.getConnection("comdb"); //属性文件中定义
//用来存储照片数据的缓冲区
byte [] buf=null;
//扩展名可以从数据库得到,这里直接指定为JPEG
String photoname="jpeg";
try{
//根据ID查找照片
String searchSql="select photo from employee where id ="+PHOTOID;
Statement stmt = conn.createStatement();
ResultSet RS_photo = stmt.executeQuery(searchSql);
//将图片数据读入缓冲区
if (RS_photo.next()){
buf = RS_photo.getBytes(1);
}else
{
buf = new byte[0];
}
}catch (Exception e){
//throw e;
}
finally {
connMgr.freeConnection("comdb", conn);
}
//response.setContentType(CONTENT_TYPE);
//告诉浏览器输出的是图片
response.setContentType("image/"+photoname);
//图片输出的输出流
OutputStream out = response.getOutputStream();
//将缓冲区的输入输出到页面
out.write(buf);
//输入完毕,清楚缓冲
out.flush();
}
/**Clean up resources*/
public void destroy() {
}
}
编译后的Servlet getphoto.class也会自动放置在工程文件的WEB-INF下的classes目录下。
2.3 JSP实现数据库图文信息浏览
成功建立好Servlet后,下一步要做的工作就是将原先的HTML标记:
<img src="../image/"+RS_photo.getString(photo_fiield) width="100" height="80">加以修改,替换为Servlet标记。即可以将下面的标记写于HTML或JSP中页面中
<img border="0" src="/servlet/getphoto?photoid=XXX&ts=AAAAA" >
其中XXX是图片的ID,AAAAA是时间戳,用来防止图片不刷新。如果我们要浏览数据库中的所有图文信息,可以加入适当的循环控制。在本文的示例WEB应用程序中作者加入了简单的表格控制来修饰输出的图文信息。详细的程序代码如下所示:
***************JSP页面浏览数据库图文信息代码*************
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*"
errorPage="" %>
<jsp:useBean id="comdbBean" scope="page" class="dbbean.conn"/>
//使用javabean建立页面的数据连接
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
int table_num=4; //指定表格每行显示记录的条数
ResultSet RS_photo;
strSQL="select * from employee";
RS_photo =comdbBean.executeQuery(strSQL);
out.println("<table width='75%' border='1'align='center'>");
out.println("<tr>");
while(RS_photo.next())
{
String pic01=rs.getString("id_stud");
pic01=""+pic01+"";
String employeename=rs.getString("name");
//加入表格控制
out.println("<td>");
out.println("<div align="center">");
out.println("<p>");
out.println("<a
href="inf_ employee_details.jsp?inf_employee_id=pic01">");
out.println("<img
border="0"src="../servlet/getphoto?photoid="+pic01+"&ts=AAAAA" width="100" height="120" align="absmiddle">");
out.println("</a>");
out.println("</p>");
out.println("<p>");
out.println("<a
href="inf_ employee _details.jsp?inf_employee_id=pic01">");
out.println(employeename);
out.println("</a>");
out.println("</p>");
out.println("</div>");
out.println("</td>" );
table_num++;
if((table_num%4)==0)
//如果可以被4整除,则进入下一栏,否则继续输出
{
out.println("</tr>");
out.println("<tr>");
}
}
out.println(" </table>");
}
RS_photo.close(); //关闭数据集RS_subject
%>
</body>
</html>
在上例的程序代码示例中,用javabean建立本JSP页面的数据库连接,用Servlet进行读取二进制image数据。后面附加了表格修饰输出图文的部分代码
分享到:
相关推荐
好东西\用JSP+Servlet实现二进制图像的动态显示
LONGBLOB类型能够处理大量的二进制数据,非常适合存储图像文件。 Servlet是Java编程语言中用于Web服务器的Java应用程序,它扩展了服务器的功能,可以处理HTTP请求并生成响应。在本项目中,Servlet充当了服务器端的...
// 设置响应头,表明这是一个二进制数据,如图像 response.setContentType("image/jpeg"); response.getOutputStream().write(imageData); } ``` 这样,当用户访问JSP页面时,图片会根据数据库中的数据动态加载...
当请求是获取验证码时,Servlet将生成的验证码图像以二进制流形式发送到客户端,并设置响应头`Content-Type`为图像类型,如`image/jpeg`。 4. **验证验证码** 当请求是提交验证码时,Servlet从请求参数中获取用户...
例如,我们可以创建一个`<img>`标签,其`src`属性指向Servlet的URL,Servlet则负责生成图表并返回图像的二进制流。 为了创建柱状图,我们可以使用JFreeChart的`CategoryPlot`类,设置类别轴和值轴的数据源,然后...
在JavaServer Pages (JSP) 中实现图片上传并立即显示是一项常见的需求,尤其在Web开发中,例如用户头像上传、商品图片展示等场景。这个功能涉及到文件上传、图像处理和动态网页显示等多个技术环节。以下将详细讲解...
- **保存图像**:生成的图像需要以二进制流的形式保存到响应中,或者保存到服务器的临时文件,以便在客户端显示。 4. **会话管理**: 为了验证用户输入的验证码是否正确,我们需要将生成的验证码值存储在一个地方...
提交时,需要设置`enctype`属性为`multipart/form-data`,以便能够发送二进制文件数据。 2. **Servlet处理上传**:JSP本身并不支持文件上传,所以需要配合Servlet来处理。在后台,我们创建一个Servlet,解析`...
表单需要设置`enctype="multipart/form-data"`属性,以便处理二进制数据,如图片和文件。同时,表单的`action`属性应指向处理文件上传的Servlet。 在Servlet中,我们可以使用Apache Commons FileUpload库来解析上传...
4. **响应HTTP请求**:当用户访问`checkcode.jsp`时,服务器会执行上述步骤,生成验证码图像,并将其作为HTTP响应的二进制内容返回给浏览器。同时,服务器还会将生成的验证码字符串保存在一个会话(session)变量中...
表单的`enctype`属性应设置为`multipart/form-data`,以便能够处理二进制数据(如图片文件)。 ```html <form action="upload.jsp" method="post" enctype="multipart/form-data"> 上传" /> ``` 2. **接收文件...
在Java编程领域,JSP(JavaServer Pages)和Servlet是两个关键的技术,它们主要用于构建动态Web应用程序。在"ImageTest.zip"这个压缩包中,我们重点关注的文件是"ImageTest.java",它揭示了一个利用Java的字节流来...
二维码是一种二维条形码,通过存储黑白二进制数据来表示信息。生成二维码的过程涉及编码、定位、纠错和格式化等多个步骤。常见的库如ZXing(Zebra Crossing)或qrcode4j可以帮助我们实现这些功能。这个开源代码可能...
在本文中,我们将深入探讨如何使用JSP(JavaServer Pages)来实现图片上传、等比例缩放以及裁切的功能。这个程序对于Web开发中的图像处理是至关重要的,尤其是在用户需要上传个人头像或商品图片的场景下。 首先,...
【JSP源码——[图片动画]JSP目录直读程序_jsp_mlzd.zip】是一个包含JSP(Java Server Pages)源代码的压缩文件,专为实现目录直读功能而设计,尤其适用于展示和浏览图片动画。这个程序允许用户通过Web浏览器直接查看...
表单的`enctype`属性应设置为`multipart/form-data`,因为图片文件是二进制数据。同时,我们需要使用Servlet来接收并处理这些上传的文件。在Servlet中,我们通常会使用`HttpServletRequest`的`getPart()`方法来获取...
6. `getInputStream()`:返回一个`ServletInputStream`,可以从其中读取请求主体的原始二进制数据,常用于文件上传。 7. `getParameter(String name)`:获取指定参数的单一值,通常用于处理表单提交。 8. `...
在JSP(Java Server Pages)中嵌入多媒体是一项常见的任务,尤其在开发动态网页时,为了提供丰富的用户体验,经常需要将视频、音频、图像或PDF文档等多媒体元素整合到页面中。本文将深入探讨如何在JSP中实现多媒体的...
6. **数据库存储**:除了存储在文件系统,还可以将图片的二进制数据存储在数据库中,如BLOB类型字段。这有利于管理和备份,但也可能增加数据库的负载。 7. **CDN服务**:对于大量图片的网站,可以使用内容分发网络...