Internet 和Intranet 在数据库和Web的应用中, 传统MISS技术的结合是传统MIS 移植到Internetet(Intrant) 环境的关键, 许多制造商已经推出了自己的产品,但这些产品基本上是实现数据的html 格式输出。在实际应用中,我们经常需要以统计图的形式显示数据,如股票市场曲线图的输出。传统的方法是将统计图作为图形文件放入Web 在服务器目录中。虽然这种做法很简单,但它有明显的局限性:一是图形文件占用更大的存储空间;二是难以适应灵活复杂的查询要求;第三,图形文件随数据库的变化而更新,增加了服务器的负担,也容易导致图形与数据库的不一致。 显然,要实现上述要求,需要两个关键环节:一是从数据库中读取数据;二是根据读取的数据在Web上 在页面上绘图。我们使用JDBC 在Web访问数据库 使用Java.awt Graphics包中提供的 类实现。 为了便于表达,建立了以下数据表:
项 目
指 标
水 产 养 殖
60
工 程 管 理
89
抗 旱 防 汛
100
财 务
200
办 公 室
350
勘 测 设 计
80
我们的目标是用统计图表示上表(本文采用水平柱状图)。本文所指的数据库均为上述表格,其字段1 表示项目信息的字符形字段;字段2 表示数值形字段(用浮点形读取)的指标数。在实际应用中,稍加修改程序就能使程序更加灵活通用。 为了绘制各种形式的图表,首先定义Graph 抽象(注意不是Graphics):import java.sql. *;import java.awt. *;abstract class Graph{ int height,width; // 绘图区域的高和宽 int maxRow=50,row=0; // 可容纳的最大记录数和实际记录数 Color color=new Color(50,50,200); // 默认绘图颜色 float scale; // 比例尺 String[] name; // 项目名称缓冲区 float[] value; // 指标值缓冲区 public Graph(Dimension d,int maxRows,Color fColor){ height=d.height; width=d.width; name=new String[maxRows]; value=new float[maxRows]; color=fColor; } public void setResult(ResultSet result){ // 将查询结果读入缓冲区 try{row=0; while(result.next() &&row<maxRow){name[row]=result.getString(1);value[row]=result.getFloat(2);row + +;}}catch(Exception ex){System.out.println(“\n failure!" +ex.getMessage()); }}// 绘制统计图的抽象方法, 在子类中实现} 在此类中,定义了图表的一般特征,如颜色、比例尺、记录缓冲区等,并实现了将查询结果放入缓冲区的setresult 方法。" +ex.getMessage()); }}// 绘制统计图的抽象方法, 在子类中实现} 在此类中,定义了图表的一般特征,如颜色、比例尺、记录缓冲区等,并实现了将查询结果放入缓冲区的setresult 方法。由于各种图表的绘制方法完全不同,draw 该方法被定义为抽象方法,需要其子类的实现。 由于篇幅有限,本文仅介绍实现水平柱状图绘制的子类GraphPost, 实现draww的主要功能 方法。其它子类似于它。import java.sql.*;import java.awt.*;public class GraphPost extends Graph{ float interval=0; ///柱间空白在柱宽(含柱间空白) 中所占比例,0<interval0) interval=ival; } void draw(Graphics g){FontMetrics fontMetrics=g.getFontMetrics();try{ Color bgColor=new Color(255,255,255); g.setColor(bgColor); g.fillRect(0,0,width,height); //填充背景色 g.setColor(color); int maxLen=0; float maxValue=0; for (int i=0;imaxLen) maxLen=fontMetrics.stringWidth(name[i]); if (value[i]>maxValue) maxValue=value[i]; } xMargin=maxLen+10;// yMargin=fontMetrics.getHeight()+10; int cHeight=fontMetrics.getHeight(); int step=getStep(maxValue); ///计算x坐标刻度单位 scale=(width-xMargin)/maxValue; eHight=(height-yMargin)/row; g.drawRect(xMargin-1,0,width-xMargin,height -yMargin); ///绘制图形外框 for(int i=1;i*step10){ mo=mo*10; st=(int)(value/10)/mo; } return (st+1)*mo;}} 在applet中查询数据库 creatresultset主类 方法实现:private static ResultSet creatResultSet(String dStr,String sqlStr)/ * 根据给定的数据源和sql 查询句子读取数据库*/ {...} applet 主类的paint() 在调用类GraphPostt方法中 的draw 统计图的输出可以通过方法实现。GraphPostt保存查询结果 paint()供应在数据缓冲区 多次使用方法,需要使用GraphPostt 对象被定义为applet 主类的成员。GraphPostt保存查询结果 paint()供应在数据缓冲区 多次使用方法,需要使用GraphPostt 对象被定义为applet 主要成员。applet 主类的init() GraphPostt方法 对象初始化,JDBC完成 注册驱动程序。applet start()主要类别 在方法中,连接数据库,执行查询,并将查询结果存储在GraphPost中 在对象的数据缓冲区。这样, 每次回到包含applet的应用程序 的页面时, 都要重新查询数据库, 确保用户阅读数据库的最新信息。 以下是applet 主类代码:import java.applet.Applet;import java.sql. *;import java.awt. *;public class WebGraph extends Applet { GraphPost graphPost;public void init() { try{ Color color=new Color(20,20,230); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");// graphPostttt注册驱动程序=new GraphPost(size(),30,color,0.3f);// gra图灵ostt初始化 对象 } catch(Exception e){ System.out.println("\n" +“init error" +e.getMessage()); } } public void start(){ try{ ResultSet rs; String dSourName="FoxPro Files"; String sqlStr="SELECT *FROM TEST"; rs=creatResultSet(dSourName,sqlStr); // 从数据库中提取数据 graphPost.setResult(rs); // 将查询结果发送给graphPostt rs.close();}catch(Exception e){ System.out.println("\n" +“start error" +e.getMessage()); }}public void paint(Graphics g){ graphPost.draw(g); // gra图灵ostt调用gra图灵ostt 的draw 方法绘制柱状统计图}private static ResultSet creatResultSet(String dStr,String sqlStr) throws SQLException{ / *根据给定的数据源和sql 查询句子读取数据库*/ String datasr=dStr; Connection con1=DriverManager.getConnection("jdbc:odbc:" +datasr); // 连接数据库 Statement stmt1=con1.createStatement(); return stmt1.executeQuery(sqlStr);// 执行查询 }} 正确使用JDBC,JDBC需要安装 JDK1.1.1 中)和JDBC 驱动程序。这方面有很多资料,作者就不赘述了。这方面有很多资料,作者就不赘述了。本文使用ODBC 操作FoxPro 使用JDBC的数据库 -ODBC 桥接方式。在网络环境中,建议使用特殊的JDBC 驱动程序。 这个程序在Java WorkShop 2.0 程序运行结果如下图所示: