当前位置: 首页 > 图灵资讯 > 技术篇> 用Java在Web页面上输出统计图 统计报表

用Java在Web页面上输出统计图 统计报表

来源:图灵教育
时间:2024-03-07 09:35:12
使用Java在Web页面上输出统计图 焦作水利局,河南省 聂春生

  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 程序运行结果如下图所示: