国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Java在Web頁面上輸出統計圖

2019-11-18 15:26:33
字體:
來源:轉載
供稿:網友


河南省焦作水利局 聶春生

  在Internet 和Intranet 的應用中,數據庫和Web 技術的結合是傳統MIS 系統移植到Internet(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 方法。因為各種圖表的繪制方法完全不同,故把draw 方法定義為抽象方法,有待其子類實現。
  限于篇幅,本文僅介紹實現繪制水平柱狀圖的子類Graphpost, 其主要功能是實現draw 方法。其他子類與其類似。
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() 方法中,調用類GraphPost 的draw 方法,即可實現統計圖的輸出。為把查詢結果保存在GraphPost 的數據緩沖區中供paint() 方法多次使用,需要把一個GraphPost 對象定義為applet 主類的成員。在applet 主類的init() 方法中,對GraphPost 對象初始化,并完成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");
// 注冊驅動程序
graphPost=new GraphPost(size(),30,color,0.3f);
// 初始化graphPost 對象
    }
  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);
  // 把查詢結果發送給graphPost
  rs.close();
}
catch(Exception e){
  System.out.println("/n" +“start error"
  +e.getMessage());
   }
}
public void paint(Graphics g){
 graphPost.draw(g);
  // 調用graphPost 的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 中)和JDBC 驅動程序。這方面資料很多,筆者不再贅述。本文為使用ODBC 操作FoxPro 數據庫,采用了JDBC -ODBC 橋接方式。在網絡環境下,建議使用專門的JDBC 驅動程序。
  本程序在Java WorkShop 2.0 中調試通過



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汽车| 微山县| 同德县| 玉山县| 通州市| 潜江市| 镇赉县| 正宁县| 镶黄旗| 昭通市| 五家渠市| 星子县| 临安市| 江山市| 灵寿县| 马尔康县| 白山市| 朝阳市| 浮山县| 高青县| 噶尔县| 洮南市| 宁陵县| 瓮安县| 杂多县| 青冈县| 太原市| 阳曲县| 丹江口市| 青海省| 石家庄市| 顺平县| 安新县| 满洲里市| 南昌县| 莱阳市| 咸丰县| 莱阳市| 宜兴市| 赤峰市| 邢台县|