memorandums

日々のメモです。

授業説明用:JSP&JFreeChartでグラフを出力するサンプル

3年後期の担当授業でチームを組んでWebアプリ(JSP&Servlet)を企画&開発をしてもらっています。チームによってはグラフ出力する要求があり、授業では扱ってこなかったので、このエントリーはサンプルとして提示するためになります。一般用ではありませんので、くれぐれもご注意ください。

準備

以下、Eclipseで開発することを前提としています。プロジェクト名はJFreeChartです。ライブラリをこちらからダウンロードします。圧縮ファイルを展開して、jfreechart-1.0.19.jarとjcommon-1.0.23.jarをWebContent/WEB-INF/libにコピーします。



サンプル1(JSPのみでグラフ出力)

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"
	import="org.jfree.chart.*,org.jfree.data.category.*,org.jfree.data.general.*,org.jfree.chart.plot.*,java.io.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<img src="graph1.jpg">
	<img src="graph2.jpg">
	<img src="graph3.jpg">
	<%
		//文字化け防止用
		ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

		//円グラフ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

		//データセット
		DefaultPieDataset d1 = new DefaultPieDataset();
		d1.setValue("データ1", 50);
		d1.setValue("データ2", 20);
		d1.setValue("データ3", 30);

		//JFreeChartオブジェクトの生成
		JFreeChart chart = ChartFactory.createPieChart("ここはタイトルよ", d1,
				true, true, false);

		//画像ファイルに出力
		File file = new File(application.getRealPath("graph1.jpg"));
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 300, 300);
		} catch (IOException e) {
			e.printStackTrace();
		}

		//棒グラフ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

		//データセット
		DefaultCategoryDataset d2 = new DefaultCategoryDataset();
		d2.addValue(1.0, "データ1", "1");
		d2.addValue(2.0, "データ2", "1");
		d2.addValue(2.0, "データ1", "2");
		d2.addValue(3.0, "データ2", "2");
		d2.addValue(0.5, "データ1", "3");
		d2.addValue(1.0, "データ2", "3");

		//JFreeChartオブジェクトの生成
		chart = ChartFactory.createBarChart("ここはタイトルよ", "カテゴリー", "値", d2,
				PlotOrientation.VERTICAL, true, true, false);

		//画像ファイルに出力
		file = new File(application.getRealPath("graph2.jpg"));
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 300, 300);
		} catch (IOException e) {
			e.printStackTrace();
		}

		//折れ線グラフ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

		//JFreeChartオブジェクトの生成
		chart = ChartFactory.createLineChart("ここはタイトルよ", "カテゴリー", "値", d2,
				PlotOrientation.VERTICAL, true, true, false);

		//画像ファイルに出力
		file = new File(application.getRealPath("graph3.jpg"));
		try {
			ChartUtilities.saveChartAsJPEG(file, chart, 300, 300);
		} catch (IOException e) {
			e.printStackTrace();
		}
	%>
</body>
</html>

サンプル2(サーブレットでグラフ出力)

上記JSPサーブレットに変換しただけです。


円グラフ

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.*;
import org.jfree.data.general.*;
import java.io.*;

@WebServlet("/Pie")
public class Pie extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Pie() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");

		//文字化け防止用
		ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

		//データセット
		DefaultPieDataset d1 = new DefaultPieDataset();
		d1.setValue("データ1", 50);
		d1.setValue("データ2", 20);
		d1.setValue("データ3", 30);

		//JFreeChartオブジェクトの生成
		JFreeChart chart = ChartFactory.createPieChart("ここはタイトルよ", d1, true, true, false);

		//responseに出力
		try {
			OutputStream os = new BufferedOutputStream(response.getOutputStream());
			ChartUtilities.writeChartAsJPEG(os, chart, 300, 300);
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


棒グラフ

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.*;
import org.jfree.data.category.*;
import org.jfree.chart.plot.*;

@WebServlet("/Bar")
public class Bar extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Bar() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");

		//文字化け防止用
		ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

		//データセット
		DefaultCategoryDataset d2 = new DefaultCategoryDataset();
		d2.addValue(1.0, "データ1", "1");
		d2.addValue(2.0, "データ2", "1");
		d2.addValue(2.0, "データ1", "2");
		d2.addValue(3.0, "データ2", "2");
		d2.addValue(0.5, "データ1", "3");
		d2.addValue(1.0, "データ2", "3");

		//JFreeChartオブジェクトの生成
		JFreeChart chart = ChartFactory.createBarChart("ここはタイトルよ", "カテゴリー", "値", d2,
				PlotOrientation.VERTICAL, true, true, false);

		//responseに出力
		try {
			OutputStream os = new BufferedOutputStream(response.getOutputStream());
			ChartUtilities.writeChartAsJPEG(os, chart, 300, 300);
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


折れ線グラフ

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jfree.chart.*;
import org.jfree.data.category.*;
import org.jfree.chart.plot.*;

@WebServlet("/Line")
public class Line extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public Line() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("image/jpeg");

		//文字化け防止用
		ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());

		//データセット
		DefaultCategoryDataset d2 = new DefaultCategoryDataset();
		d2.addValue(1.0, "データ1", "1");
		d2.addValue(2.0, "データ2", "1");
		d2.addValue(2.0, "データ1", "2");
		d2.addValue(3.0, "データ2", "2");
		d2.addValue(0.5, "データ1", "3");
		d2.addValue(1.0, "データ2", "3");

		//JFreeChartオブジェクトの生成
		JFreeChart chart = ChartFactory.createLineChart("ここはタイトルよ", "カテゴリー", "値", d2,
				PlotOrientation.VERTICAL, true, true, false);

		//responseに出力
		try {
			OutputStream os = new BufferedOutputStream(response.getOutputStream());
			ChartUtilities.writeChartAsJPEG(os, chart, 300, 300);
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img src="/JFreeChart/Pie">
<img src="/JFreeChart/Bar">
<img src="/JFreeChart/Line">
</body>
</html>

以下のサイトを参考にさせていただきました。ありがとうございました。

JFreeChartを使ったグラフ作成
JfreeChart 棒グラフのサンプル
[ThinkIT] 第5回:JFreeChartでグラフ作成(前編) (1/4)
[ThinkIT] 第6回:JFreeChartでグラフ作成(後編) (1/4)
JFreeChartで生成したグラフをServletで出してみる(JFreechart 0.9.16)