【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷


   JSP/サーブレット編

サーブレットでグラフを描く(JFreeChart活用)

山田祥寛
2004/10/19

 JFreeChartは、チャート画像の生成に特化した高機能なライブラリ群です。もちろん、J2SEにはJava 2Dと呼ばれる画像生成用のAPIが用意されていますから、JFreeChartのようなライブラリを使わなくても最低限の画像描画を行うことは可能ですが、棒グラフのような比較的単純なチャートを作成するにも、あらかじめ座標の計算などを綿密に行わなければならず、煩雑なコーディングを強いられることになるはずです。

 しかし、JFreeChartを利用することで、グラフの基となるデータセットを引き渡すだけで、棒グラフや円グラフ、バブルチャート、レーダチャート、株価チャートのようなさまざまなチャート図を、簡単に作成することができます。基本的な描画機能はすべてJFreeChartが肩代わりしてくれますから、プログラマが座標計算のような低レベルな部分に思いを至らす必要もありません。また、一度作成したチャートを(例えば)棒グラフから円グラフに切り替えたいと思った場合にも、クラスやメソッドを入れ替えるだけですので、比較的簡単に対応できます。皆さんも、これを機会にビジュアルなチャートを使った効果的なページを作成してみてはいかがでしょう。

■解説

(1)JFreeChartライブラリをインストールする

 JFreeChartを利用するに当たっては、あらかじめライブラリをインストールしておく必要があります。JFreeChartライブラリは、以下のサイトからダウンロードしてください。

 ダウンロードファイルjfreechart-X.X.X.zip(X.X.Xはバージョン番号)を解凍すると、各種ファイルが展開されますので、解凍したフォルダ直下にあるjfreechart-X.X.X.jar、libフォルダ配下のjcommon-X.X.X.jarを、それぞれアプリケーションルート配下の「/WEB-INF/lib」フォルダにコピーしてください。

(2)サーブレットクラスを定義する

 本稿では、配列値としてあらかじめ渡されたアクセスログ・データを基に、円グラフを作成してみることにしましょう。当然、配列値を読み取っている個所は、一般的にはデータベースサーバなどから動的に値を取得すると良いでしょう。

ChartServlet.java
package to.msn.wings.javatips;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.data.DefaultPieDataset;

public class ChartServlet extends HttpServlet {
  public void doGet(HttpServletRequest request
                  , HttpServletResponse response)
    throws ServletException, IOException {

    // グラフ生成用の元データを用意
    String[][] aryDat={
      {"書籍紹介","150000"},
      {"Q&A掲示板","55500"},
      {"関連サイト","75000"},
      {"レンタルサーバ","83100"},
      {"RSSフィード","22500"}
    };

    // 円グラフの基となるデータセットを用意
    DefaultPieDataset objDpd=new DefaultPieDataset();

    // データセットに項目名と値のを順にセット
    for(int i=0;i<aryDat.length;i++){
      objDpd.setValue(aryDat[i][0],Integer.parseInt(aryDat[i][1]));
    }


    // 3次元円グラフを生成(第1引数からグラフタイトル、
    // データセット、判例を表示するか、ツールチップを
    // 表示するか、URLを動的に生成するかを指定)

    JFreeChart objCht=ChartFactory.createPieChart3D(
      "サイトアクセスログ",objDpd,true,false,false);

    // バイナリ出力ストリームにJPEG形式で画像を出力
    
// 600×400ピクセル)
    response.setContentType("image/jpeg");
    ServletOutputStream objSos=response.getOutputStream();
    ChartUtilities.writeChartAsJPEG(objSos,objCht,600,400);

  }
}

(3)デプロイメント・ディスクリプタにサーブレットクラスを登録する

 本サーブレットクラスを実行するに当たっては、あらかじめデプロイメント・ディスクリプタ(web.xml)に対して、サーブレットの登録を行っておく必要があります。<url-pattern>要素に「/chart.jpg」のように指定しておくことで、サーブレットクラスをあたかも静的なJPEGファイルであるかのように見せることができます(「基礎から学ぶサーブレット/JSP 第11回 JSPとサーブレットの違いを明らかにする」(Java Solution)も併せて参照してください)。

web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  …中略…
  <servlet>
    <servlet-name>ChartServlet</servlet-name>
    <servlet-class>to.msn.wings.javatips.ChartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ChartServlet</servlet-name>
    <url-pattern>/chart.jpg</url-pattern>
  </servlet-mapping>
  …中略…
</web-app>

 このコードの実行結果は、以下のようになります。

実行結果

 ロジックの詳細な流れについては、コード内のコメントを参照いただくとして、ここではJFreeChartを利用したコーディングの大まかな流れを押さえてみてください。

  1. データセットの生成(赤字部分)
  2. チャート図の生成(黄字部分)
  3. JPEG画像としてクライアントの出力(緑字部分)

 これは、円グラフ以外のチャートを作成する場合にも共通の流れです。この流れさえ理解してしまえば、後は使用するクラスを置き換えるだけで、さまざまなチャート図が作れてしまうはずです。JFreeChartライブラリに属する一連のクラスについては、以下のURLを参考にしてみてください。

「Java TIPS」


ホワイトペーパーTechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  TomcatやJBossなどAPサーバ環境に関する
情報を集約! “業務”用APサーバ大百科

New!
  一気に解説! 最新のクラスタストレージ
「RAIDを超えたストレージ基準」……など

New!
  クラウド的ユーザー体験の変化は脅威か?
仮想化技術を使いこなす運用管理術を紹介

New!

  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?