溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用Java在Web頁面上輸出統(tǒng)計圖

發(fā)布時間:2022-01-10 09:10:33 來源:億速云 閱讀:153 作者:iii 欄目:編程語言

這篇文章主要介紹“怎么用Java在Web頁面上輸出統(tǒng)計圖”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么用Java在Web頁面上輸出統(tǒng)計圖”文章能幫助大家解決問題。

  在Inte.NET 和Intranet 的應(yīng)用中,數(shù)據(jù)庫和Web 技術(shù)的結(jié)合是傳統(tǒng)MIS 系統(tǒng)移植到Internet(Intrant) 環(huán)境的關(guān)鍵, 已有不少廠商推出了各自的產(chǎn)品,但這些產(chǎn)品基本上是實現(xiàn)數(shù)據(jù)的html 格式輸出。在實際應(yīng)用中,我們經(jīng)常需要把數(shù)據(jù)以統(tǒng)計圖的形式表現(xiàn)出來,例如股票行情曲線圖的輸出。傳統(tǒng)的方法是把統(tǒng)計圖作為一個圖形文件放到Web 服務(wù)器的目錄中。這種做法雖然簡單,但有明顯的局限性:一是圖形文件要占用較大存儲空間;二是難以適應(yīng)靈活復(fù)雜的查詢要求;三是圖形文件隨數(shù)據(jù)庫的變化而更新,加重了服務(wù)器的負擔,也容易造成圖形和數(shù)據(jù)庫的不一致。
  顯然,要實現(xiàn)上述要求,需要兩個關(guān)鍵環(huán)節(jié):一是從數(shù)據(jù)庫中讀出數(shù)據(jù);二是根據(jù)讀出的數(shù)據(jù)在Web 頁面中繪圖。我們采用JdbC 訪問數(shù)據(jù)庫,在Web 頁面中繪圖則使用Java.awt 包中提供的Graphics 類實現(xiàn)。
  為便于表述,建立數(shù)據(jù)表如下: 

項 目

指 標

水 產(chǎn) 養(yǎng) 殖

60

工 程 管 理

89

抗 旱 防 汛

100

財 務(wù)

200

辦 公 室

350

勘 測 設(shè) 計

80

  我們的目標就是把上表用統(tǒng)計圖表現(xiàn)出來(本文用水平柱狀圖)。本文中所指數(shù)據(jù)庫均為如上形式的表,其字段1 為字符形字段,表示項目信息;字段2 為數(shù)值形字段(用浮點形讀出),表示指標數(shù)。實際應(yīng)用中,對程序稍作修改,就可使其更加靈活通用。
  為了繪制各種形式的圖表,先定義一個Graph 抽象類(注意不是Graphics): 
import java.sql. *;
import java.awt. *;
abstract class Graph{
 int height,width; // 繪圖區(qū)域的高和寬
 int maxRow=50,row=0;
 // 可容納的最大記錄數(shù)和實有記錄數(shù)
 Color color=new Color(50,50,200); // 默認繪圖顏色
 float scale;      // 比例尺
 String[] name;   // 項目名緩沖區(qū)
 float[] value;    // 指標值緩沖區(qū)
 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)
{ // 把查詢結(jié)果讀入緩沖區(qū)
  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()); }
}

// 繪制統(tǒng)計圖的抽象方法, 在子類中實現(xiàn)
}

  在這個類中,定義了圖表的一般特性,如顏色、比例尺、記錄緩沖區(qū)等,并實現(xiàn)了把查詢結(jié)果置入緩沖區(qū)的setResult 方法。因為各種圖表的繪制方法完全不同,故把draw 方法定義為抽象方法,有待其子類實現(xiàn)。
  限于篇幅,本文僅介紹實現(xiàn)繪制水平柱狀圖的子類GraPHPost, 其主要功能是實現(xiàn)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;
}
}

  對數(shù)據(jù)庫的查詢在applet 主類中用creatResultSet 方法實現(xiàn):
private static ResultSet creatResultSet
(String dStr,String sqlStr) 
/ * 根據(jù)給定的數(shù)據(jù)源和
sql 查詢語句讀取數(shù)據(jù)庫*/ {......}

  在applet 主類的paint() 方法中,調(diào)用類GraphPost 的draw 方法,即可實現(xiàn)統(tǒng)計圖的輸出。為把查詢結(jié)果保存在GraphPost 的數(shù)據(jù)緩沖區(qū)中供paint() 方法多次使用,需要把一個GraphPost 對象定義為applet 主類的成員。在applet 主類的init() 方法中,對GraphPost 對象初始化,并完成JDBC 驅(qū)動程序注冊。在applet 主類的start() 方法中,連接數(shù)據(jù)庫,執(zhí)行查詢,并把查詢結(jié)果存放到GraphPost 對象的數(shù)據(jù)緩沖區(qū)中。這樣, 在每次回到包含該applet 的頁面時, 都要重新查詢數(shù)據(jù)庫, 保證用戶閱讀到數(shù)據(jù)庫的最新信息。
  下面是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");
// 注冊驅(qū)動程序
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);
  // 從數(shù)據(jù)庫中提取數(shù)據(jù)
  graphPost.setResult(rs); 
  // 把查詢結(jié)果發(fā)送給graphPost
  rs.close();
}
catch(Exception e){
  System.out.println("n" +“start error"
 ?。玡.getMessage());
   }
}
public void paint(Graphics g){
 graphPost.draw(g); 
  // 調(diào)用graphPost 的draw 方法繪制柱狀統(tǒng)計圖
}
private static ResultSet creatResultSet(String dStr,String sqlStr) 
  throws SQLException{
  / *根據(jù)給定的數(shù)據(jù)源和sql
   查詢語句讀取數(shù)據(jù)庫*/
   String datasr=dStr;
   Connection con1=DriverManager.getConnection
("jdbc:odbc:" +datasr); // 連接數(shù)據(jù)庫
   Statement stmt1=con1.createStatement();
   return stmt1.executeQuery(sqlStr);// 執(zhí)行查詢
  }
}

關(guān)于“怎么用Java在Web頁面上輸出統(tǒng)計圖”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI