论坛登陆 用户名:  密 码:
设为首页  加入收藏
08年北京名校秋季招生
名牌院校免试入学宽进严出,突破考分限制,名校与你零距离,以下院校按报名先后顺序录取,24小时网上报名覆盖全国
  您现在的位置: 中国教育招生在线 >> IT >> JAVA认证 >> IT正文
用JSP+Servlet实现二进制图像的动态显示
 作者:佚名     2007-3-14 17:32:12        来源:不详  浏览次数:


 

 

 

 

 

 

 

 

数据库应用程序,特别是基于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数据。后面附加了表格修饰输出图文的部分代码。程序运行结果如下图1-6所示。



图2 JSP页面浏览数据库图文信息结果


以上WEB应用程序在Windows 2000 Server+JBuilder 7+SQL Server 2000+ Apache Tomcat 4.0环境下调试通过。


 


 

 

责任编辑:lss
  相关新闻
Spring MVC framework总体分析
JSF经典视图技术-Facelets 实例解析
JSFToolbox--用Dreamweaver开发JSF
Spring MVC framework总体分析
Spring VS. HiveMind
Jsp中的Application使用
Spring开发基础之Spring事务管理
快速上手Spring--4.安装和使用IDE
思科认证心得:OSPF经验总结
快速上手Spring--5.Bean的标志符
JSR 198 最终草案提交 统一IDE插件标准
CISCO最新CCSP认证介绍
思科认证心得:OSPF经验总结
微软新推Dynamics社区 打造Myspace商务版
快速上手Spring--5.Bean的标志符
快速上手Spring--4.安装和使用IDE
快速上手Spring--6.Singleton的使用
快速上手Spring--10.任意方法的替换
快速上手Spring--9.Lookup方法注入
快速上手Spring--8.集合对象注入
  评论
现在有100人对本文发表评论
查看所有评论
 
推  荐
 
100本成功必读热销书
热门招生
  北京文理研修学院   前进大学
  北京明园大学   北京建设大学
  北京邮电大学世纪学院   北方工商管理学院
  联想软件定向委培班   香港数码动画学院
  青年企业管理研修学院   北京华夏管理学院
热门培训
网络化办公专家培训认证 电子科技大学软件学院
软件测试工程师培训认证 北大青鸟十大授权培训
IT硬件工程师培训认证班 北京环球雅思荷兰预科
JAVA开发工程师培训 潜能时代IT服务管理培训
网络信息化工程师培训 清华大学继续教育学院
论坛精选
 
有些细节是男人也该注意的风度!最容易读错的字
某强人手机里保存的30条短信 中国十大高薪职业
最感人的十大韩剧经典台词 嫁给工程师的N个理由
爆强!只有一句话的鬼故事 转贴教你如何做妖精
 女人一定要記住的話 女人最好别嫁给最爱的男人
城市联盟
 大连 上海 天津 广州 西安 深圳  天津  青岛  大连  福州  沈阳  青海  连云港  南京  吉林  厦门  威海  辽宁  呼和浩特
Copyright © 2006   www.edu999.com   All rights reserved. 中国教育招生在线  版权所有
北京市通信管理局[2004]字第552号函    京ICP证040442号