- PR -

JFreeChartでサーブレットからグラフを出力

1
投稿者投稿内容
みじ
会議室デビュー日: 2004/05/22
投稿数: 9
投稿日時: 2006-09-22 03:26
いつもお世話になっています。

JFreeChartでサーブレットからグラフ(レーダーチャート)を出力させたいのですが、
うまくいきません。

●環境
WindowsXP
JDK5.0
Tomcat5.5
Eclipse3.1+sysdeo Tomcatプラグイン
JFreeChart1.0.2

●サーブレットソースコード
コード:
 import javax.servlet.*;
 import javax.servlet.http.*;
 import java.io.*;
 import org.jfree.chart.*;
 import org.jfree.chart.plot.*;
 import org.jfree.data.category.*;
 import org.jfree.chart.servlet.*;

 public class Sample extends HttpServlet {

   public void doGet(
       HttpServletRequest request, 
       HttpServletResponse response
   ){
   try{
     DefaultCategoryDataset ds = new DefaultCategoryDataset();
     ds.addValue(4, "sample", "a");
     ds.addValue(5, "sample", "b");
     ds.addValue(6, "sample", "c");
     ds.addValue(7, "sample", "d");
     ds.addValue(8, "sample", "e");

     SpiderWebPlot sp = new SpiderWebPlot(ds);
     sp.setMaxValue(10.0);
   
     JFreeChart chart = new JFreeChart(
         "test", JFreeChart.DEFAULT_TITLE_FONT, sp, true
     );
     String fileName = ServletUtilities.saveChartAsPNG(chart,600,400,null);
     PrintWriter out = response.getWriter();
     out.println("<img src=\\"/sample/displayChart?filename=\\""+fileName+"\\"><br>");
   }catch(Exception e){
     e.printStackTrace();
   }
  }
}


※web.xmlに「/displayChart」という名前で「org.jfree.chart.servlet.DisplayChart」サーブレットをマッピングしています。
※上記コードで「¥」マークが2つ続いているところは、本当は一つです。(1個しか書いていないのに、プレビューすると2つになリます・・・)

●状況
上記サーブレットにアクセスすると、ブラウザ上で画像のリンク切れと同じ赤い×が表示される。
例外が発生しており、「javax.servlet.ServletException: Chart image not found」がDisplayChartクラスの153行で発生している

●確認事項
・JFreeChartに必要なjfreechart-1.0.2.jarとjcommon-1.0.5.jarはビルドパスを通しています。
・上記サーブレットにアクセス後、TOMCAT_HOMEのtempフォルダ内には「jfreechart-onetime-XXXXX.png」(XXXXXは毎回異なる数値)と言うファイルが作成されており、開くときちんとグラフが表示されます。
・例外が発生している箇所が、DisplayChartクラスのソースを見ると、
 1.ChartDeleterクラスのisChartAvailable(グラフの画像ファイル名)を呼び出し、そのファイルが削除対象のリストに入っているか?(ここはよくわかってません・・・)
 2.ファイル名の先頭が「public」から始まっているか?
 3.ファイル名が一時ファイルを表すファイル名(「jfreechart-onetime-」)から始まっているかどうか?
上記のうち、いずれかがtrueであれば、ServletUtilitiesクラスのsendTempFileメソッドを使ってグラフを出力するようにしているところです。
つまり、上記1〜3すべてfalseのため、ServletExceptionが発生しています。
しかし、1〜3が本当にfalseかを調べるために、上記サーブレット内でDisplayChartクラスと同じソースコードをコピペして実行させると、3に関してはtrueとなっています。

正直お手上げ状態です・・・。
参考ページも少なく、どうしたらいいのかわかりません。
何か参考になるものをご存知の方がいらっしゃいましたら、ぜひ教えて下さい。
よろしくお願いいたします。
みじ
会議室デビュー日: 2004/05/22
投稿数: 9
投稿日時: 2006-09-22 08:17
自己レスです。あっさり解決しました・・・。

ダブルコーテーションが一つ多かったです・・・。
コード:
out.println("<img src=\"/sample/displayChart?filename="+fileName+"\"><br>");


にしたら、うまくいきました。
お騒がせしました。
1

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