(0)目次&概説
(1) 記事の目的
(1-1) 目的
(2) 表示方法の概要
(2-1) 表示の仕組み
(2-2) 実装の手順
(3) サンプルプログラム
(3-1) JSPのサンプルプログラム(円グラフ)
(3-2) Servletのサンプルプログラム
(3-3) データセット作成メソッドのサンプル
(3-4) JSPのサンプルプログラム(折れ線グラフ)
(1) 記事の目的
(1-1) 目的
こちらの記事「JFreeChartを使ってJavaで様々なグラフを簡単に描画する方法」の続きとして、JFreeChartで作成したチャートをクライアント側へ配信(クライアントのブラウザに表示する)方法について記述します。
(2) 表示方法の概要
(2-1) 表示の仕組み
ざっくり言うとServletでJFreeChartによるチャートの生成及び画像化(PNG画像)を実施し、そのサーブレットをJSP画面に呼び出す事で、PNG画像として画面に表示できます。
(図211)表示の仕組み(ServletとJPSの連携)

(2-2) 実装の手順
※丸数字は処理が行われる順番を表します。
(図221)

| 処理名 | 処理箇所 | 処理内容 |
| ①元データの生成 | JSP | まずはJSP側ではチャートの元となるデータをArrayList等に格納します。 |
| ②元データをセッションに保持 | JSP | 上記ArrayListデータをsetAttributeでsessionに保存する事でServlet側で取得できるようにします。 |
| ③元データの取得 | Servlet | 手順②でsessionに保存したArrayListをgetAttributeで取得します。 |
| ④データセットの作成 | Servlet | 取得したArrayListを用いてJFreeChartのデータセットを作成します(※専用メソッドを呼び出し) |
| ⑤データセットの作成処理 | Java | 取得したArrayListの情報を使ってデータセット(DefaultPieDatasetやDefaultCategoryDataset)を作る専用のメソッド(自前で用意)でデータセットの作成を行います。 |
| ⑥チャートの作成 | Servlet | JFreeChartのメソッドでチャートの作成を行います。 |
| ⑦PNG画像生成 | Servlet | チャートをPNG画像として出力します。 |
| ⑧グラフをページに表示 | JSP | <img>タグの「src属性」に上記のサーブレットを指定する事でJSPページにチャートを表示できます。 |
(3) サンプルプログラム
(3-1) JSPのサンプルプログラム(円グラフ)
JSP側ではデータセットの元となるArrayListを作成しています。今回はサンプルのため、値をベタ打ち(例:{“みかん”,”12″})していますが、本来は画面でユーザーが入力した値やDBから取得した値を表示します。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample of calling JFreeChart Servlet to generate PNG chart image</title>
</head>
<body>
JFreeChartで作ったグラフをJSP画面に表示させるプログラム<br /><br />
<%--### ①元データの作成 ###--%>
<%
String [][] input = {
{"みかん","12"},
{"バナナ","18"},
{"りんご","20"},
{"ぶどう","27"},
{"オレンジ","23"}
};
ArrayList<ArrayList<String>> ar1 = new ArrayList<ArrayList<String>>();
ArrayList<String> tmp = new ArrayList<String>();
for(int i=0; i<input.length; i++) {
tmp = new ArrayList<String>();
tmp.add(input[i][0]);
tmp.add(input[i][1]);
ar1.add(tmp);
}
//### ②元データをセッションに保持 ###
session.setAttribute("chart1", ar1);
%>
<img src="JFreeChartTest?mode=1" />
</body>
</html>
(図311)表示例

(3-2) Servletのサンプルプログラム
ServletはJSPから呼ばれた際にdoGetメソッドが実行されます。このサーブレットは円グラフ・折れ線グラフ共用で作成しており、doGetメソッドではJSPから呼び出し時の引数(mode)を受取り、mode=1なら円グラフを、mode=2なら折れ線グラフを表示します。
package jfreechart;
import jfreechart.JFreeChartFunctions;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYSeriesCollection;
@WebServlet("/JFreeChartTest")
public class IT0090_JFreeChartDrawServlet extends HttpServlet {
JFreeChartFunctions jfc = new JFreeChartFunctions();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String mode = request.getParameter("mode");
if(mode.equals("1")) {
drawPieChart(request,response);
}else if(mode.equals("2")) {
drawLineGraph(request,response);
}
}
//##(1) Pie Chart/円グラフ //
protected void drawPieChart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/png");
//### ③元データの取得 ###
ArrayList<ArrayList> ar1 = (ArrayList<ArrayList>) request.getSession().getAttribute("chart1");
//### ④データセットの作成 ###
DefaultPieDataset ds_pie = jfc.createDS_PieChart(ar1);
//### ⑥チャートの作成 ###
JFreeChart chart=ChartFactory.createPieChart3D("好きなフルーツは?", ds_pie,true,false,false);
chart.setBackgroundPaint(ChartColor.WHITE);
//### ⑦PNG画像生成 ###
ServletOutputStream objSos=response.getOutputStream();
ImageIO.write(chart.createBufferedImage(600, 400), "png", objSos);
}
//##(2) Line Chart/折れ線グラフ //
protected void drawLineGraph(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("image/png");
//### ③元データの取得 ###
ArrayList<ArrayList> ar = (ArrayList<ArrayList>) request.getSession().getAttribute("chart1");
//### ④データセットの作成 ###
ArrayList ar1 = new ArrayList();
ArrayList ar2 = new ArrayList();
ArrayList ar3 = new ArrayList();
for(int i=0; i<ar.size(); i++) {
ar1.add(Integer.parseInt(ar.get(i).get(0)));
ar2.add(ar.get(i).get(1));
ar3.add(ar.get(i).get(2));
}
DefaultCategoryDataset ds_cat = jfc.createDS_LineChart(ar1,ar2,ar3);
//### ⑥チャートの作成 ###
JFreeChart chart=ChartFactory.createLineChart("お菓子の売上数", "月", "売れた数", ds_cat, PlotOrientation.VERTICAL, true, false, false);
//### ⑦PNG画像生成 ###
ServletOutputStream objSos=response.getOutputStream();
ChartUtilities.writeChartAsJPEG(objSos, chart, 600, 400);
}
サーブレットを単体で呼び出すと、以下のようにPNG画像がブラウザに表示されます。
(図321)実行例

(3-3) データセット作成メソッドのサンプル
今回のHelloWorldではデータセット作成メソッドを自作で用意しました。
・円グラフの場合 →「DefaultPieDataset」クラスのインスタンスに対してsetValueでデータセットを追加。
・折れ線グラフの場合 →「DefaultCategoryDataset」のaddValueメソッドでデータセットを追加。
package jfreechart;
import java.util.ArrayList;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class JFreeChartFunctions {
//(1) Create Dataset for "createPieChart3D"
public DefaultPieDataset createDS_PieChart(ArrayList<ArrayList> ar1) {
//### ⑤データセットの作成処理 ###
DefaultPieDataset defpie = new DefaultPieDataset();
for(int i=0; i<ar1.size(); i++) {
defpie.setValue(ar1.get(i).get(0),Integer.parseInt(ar1.get(i).get(1)));
}
return defpie;
}
//(2) Create DataSet for "createLineChart"
public DefaultCategoryDataset createDS_LineChart(ArrayList key1, ArrayList key2, ArrayList key3) {
//### ⑤データセットの作成処理 ###
DefaultCategoryDataset defcat = new DefaultCategoryDataset();
for(int i=0; i<key1.size(); i++) {
defcat.addValue(key1.get(i), key2.get(i), key3.get(i));
}
return defcat;
}
}
(3-4) JSPのサンプルプログラム(折れ線グラフ)
(3-1)で紹介しているプログラムの折れ線グラフバージョンです。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Sample of calling JFreeChart Servlet to generate PNG chart image</title>
</head><body>
JFreeChartで作ったグラフをJSP画面に表示させるプログラム<br /><br />
<%--### ①元データの作成 ###--%>
<%
String [][] input = {
{"120","チョコ","3月"},
{"130","チョコ","4月"},
{"140","チョコ","5月"},
{"150","クッキー","3月"},
{"120","クッキー","4月"},
{"130","クッキー","5月"},
{"250","グミ","3月"},
{"190","グミ","4月"},
{"210","グミ","5月"},
};
ArrayList<ArrayList<String>> ar1 = new ArrayList<ArrayList<String>>();
ArrayList<String> tmp = new ArrayList<String>();
for(int i=0; i<input.length; i++) {
tmp = new ArrayList<String>();
tmp.add(input[i][0]);
tmp.add(input[i][1]);
tmp.add(input[i][2]);
ar1.add(tmp);
}
//### ②元データをセッションに保持 ###
session.setAttribute("chart1", ar1);
%>
<img src="JFreeChartTest?mode=2" />
</body>
</html>
(図341)表示例
