JfreeChart学习总结(2)

本文介绍如何利用JSP、Servlet和JavaBean技术实现动态图表的生成与展示,涵盖从数据处理到图表输出的全过程,并提供具体代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3)jsp+servlet+javabean方式
1. Create ChartViewer servlet

Java代码 
  1. public class ChartViewer extends HttpServlet {   
  2. public void init() throws ServletException {  
  3. }   
  4. //Process the HTTP Get request  
  5. public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {   
  6. // get the chart from session  
  7. HttpSession session = request.getSession();   
  8. BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");   
  9. // set the content type so the browser can see this as a picture   
  10. response.setContentType("image/png");   
  11. // send the picture   
  12. PngEncoder encoder = new PngEncoder(chartImage, false09);   
  13. response.getOutputStream().write(encoder.pngEncode());  
  14. }   
  15. //Process the HTTP Post request   
  16. public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {   
  17. doGet(request, response);   
  18. }   
  19. //Process the HTTP Put request   
  20. public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
  21. }   
  22. //Clean up resources   
  23. public void destroy() { }   
  24. }   
Java代码 复制代码
  1. public class ChartViewer extends HttpServlet {  public void init() throws ServletException { }  //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  // get the chart from session HttpSession session = request.getSession();  BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");  // set the content type so the browser can see this as a picture  response.setContentType("image/png");  // send the picture  PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);  response.getOutputStream().write(encoder.pngEncode()); }  //Process the HTTP Post request  public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  doGet(request, response);  }  //Process the HTTP Put request  public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  }  //Clean up resources  public void destroy() { }  }   
public class ChartViewer extends HttpServlet {  public void init() throws ServletException { }  //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  // get the chart from session HttpSession session = request.getSession();  BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");  // set the content type so the browser can see this as a picture  response.setContentType("image/png");  // send the picture  PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);  response.getOutputStream().write(encoder.pngEncode()); }  //Process the HTTP Post request  public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {  doGet(request, response);  }  //Process the HTTP Put request  public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  }  //Clean up resources  public void destroy() { }  } 



2. Create a servlet map in web.xml

Java代码 
  1. <?xml version="1.0" encoding="UTF-8"?>   
  2. <web-app>   
  3.  <servlet>   
  4.  <servlet-name>ChartViewer</servlet-name>   
  5.  <servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class>   
  6. </servlet>   
  7. <servlet-mapping>   
  8. <servlet-name>ChartViewer</servlet-name>   
  9. <url-pattern>/servlet/ChartViewer</url-pattern>   
  10. </servlet-mapping>   
  11. </web-app>   
Java代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  <web-app>   <servlet>   <servlet-name>ChartViewer</servlet-name>   <servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>ChartViewer</servlet-name>  <url-pattern>/servlet/ChartViewer</url-pattern>  </servlet-mapping>  </web-app>   
<?xml version="1.0" encoding="UTF-8"?>  <web-app>   <servlet>   <servlet-name>ChartViewer</servlet-name>   <servlet-class>myapp.webwork.servlets.ChartViewer</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>ChartViewer</servlet-name>  <url-pattern>/servlet/ChartViewer</url-pattern>  </servlet-mapping>  </web-app> 



3. Create a chart in a java bean (Pie3DDemo.java)

Java代码 复制代码
  1. public class Pie3DDemo {   
  2. private DefaultPieDataset getDataset() {   
  3. // categories...   
  4. String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun""Jul","Aug","Sep","Oct","Nov","Dec" };   
  5. // data...   
  6. double[] data = new double[section.length];   
  7.  for (int i = 0; i < data.length; i++) {   
  8.      data[i] = 10 + (Math.random() * 10);   
  9. }   
  10. // create the dataset...   
  11. DefaultPieDataset dataset = new DefaultPieDataset();   
  12. for (int i = 0; i < data.length; i++) {   
  13.        dataset.setValue(section[i], data[i]);   
  14. }   
  15. return dataset;   
  16. }   
  17. public String getChartViewer(HttpServletRequest request, HttpServletResponse response) {   
  18.  DefaultPieDataset dataset = getDataset();   
  19. // create the chart...   
  20.  JFreeChart chart = ChartFactory.createPie3DChart(   
  21.   "Pie3D Chart Demo",  // chart title   
  22.   dataset,             // data   
  23.   true,                // include legend   
  24.   true,   
  25.   false   
  26.  );   
  27. // set the background color for the chart...   
  28. chart.setBackgroundPaint(Color.cyan);   
  29. PiePlot plot = (PiePlot) chart.getPlot();   
  30. plot.setNoDataMessage("No data available");   
  31. // set drilldown capability...   
  32.  plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section"));   
  33. plot.setLabelGenerator(null);   
  34. // OPTIONAL CUSTOMISATION COMPLETED.   
  35. ChartRenderingInfo info = null;   
  36. HttpSession session = request.getSession();   
  37. try {   
  38. //Create RenderingInfo object   
  39.  response.setContentType("text/html");   
  40.  info = new ChartRenderingInfo(new StandardEntityCollection());   
  41.  BufferedImage chartImage = chart.createBufferedImage(640400, info);   
  42. // putting chart as BufferedImage in session,   
  43. // thus making it available for the image reading action Action.   
  44. session.setAttribute("chartImage", chartImage);   
  45. PrintWriter writer = new PrintWriter(response.getWriter());   
  46. ChartUtilities.writeImageMap(writer, "imageMap", info);   
  47. writer.flush();   
  48. catch (Exception e) { }   
  49.   
  50. String pathInfo = "http://";   
  51. pathInfo += request.getServerName();   
  52. int port = request.getServerPort();   
  53. pathInfo += ":"+String.valueOf(port);   
  54. pathInfo += request.getContextPath();   
  55. String chartViewer = pathInfo + "/servlet/ChartViewer";   
  56. return chartViewer;   
  57. }   
Java代码 复制代码
  1. public class Pie3DDemo {  private DefaultPieDataset getDataset() {  // categories...  String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" };  // data...  double[] data = new double[section.length];   for (int i = 0; i < data.length; i++) {       data[i] = 10 + (Math.random() * 10);  }  // create the dataset...  DefaultPieDataset dataset = new DefaultPieDataset();  for (int i = 0; i < data.length; i++) {         dataset.setValue(section[i], data[i]);  }  return dataset;  }  public String getChartViewer(HttpServletRequest request, HttpServletResponse response) {   DefaultPieDataset dataset = getDataset();  // create the chart...   <SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPie3DChart(    "Pie3D Chart Demo",  // chart title    dataset,             // data    true,                // include legend    true,    false   );  // set the background color for the chart...  chart.setBackgroundPaint(Color.cyan);  PiePlot plot = (PiePlot) chart.getPlot();  plot.setNoDataMessage("No data available");  // set drilldown capability...   plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section"));  plot.setLabelGenerator(null);  // OPTIONAL CUSTOMISATION COMPLETED.  ChartRenderingInfo info = null;  HttpSession session = request.getSession();  try {  //Create RenderingInfo object   response.setContentType("text/html");   info = new ChartRenderingInfo(new StandardEntityCollection());   BufferedImage chartImage = chart.createBufferedImage(640, 400, info);  // putting chart as BufferedImage in session,  // thus making it available for the image reading action Action.  session.setAttribute("chartImage", chartImage);  PrintWriter writer = new PrintWriter(response.getWriter());  ChartUtilities.writeImageMap(writer, "imageMap", info);  writer.flush();  } catch (Exception e) { }   String pathInfo = "http://";  pathInfo += request.getServerName();  int port = request.getServerPort();  pathInfo += ":"+String.valueOf(port);  pathInfo += request.getContextPath();  String chartViewer = pathInfo + "/servlet/ChartViewer";  return chartViewer;  }   
public class Pie3DDemo {  private DefaultPieDataset getDataset() {  // categories...  String[] section = new String[] { "Jan","Feb","Mar","Apr","May","Jun", "Jul","Aug","Sep","Oct","Nov","Dec" };  // data...  double[] data = new double[section.length];   for (int i = 0; i < data.length; i++) {       data[i] = 10 + (Math.random() * 10);  }  // create the dataset...  DefaultPieDataset dataset = new DefaultPieDataset();  for (int i = 0; i < data.length; i++) {         dataset.setValue(section[i], data[i]);  }  return dataset;  }  public String getChartViewer(HttpServletRequest request, HttpServletResponse response) {   DefaultPieDataset dataset = getDataset();  // create the chart...   JFreeChart chart = ChartFactory.createPie3DChart(    "Pie3D Chart Demo",  // chart title    dataset,             // data    true,                // include legend    true,    false   );  // set the background color for the chart...  chart.setBackgroundPaint(Color.cyan);  PiePlot plot = (PiePlot) chart.getPlot();  plot.setNoDataMessage("No data available");  // set drilldown capability...   plot.setURLGenerator(new StandardPieURLGenerator("Bar3DDemo.jsp","section"));  plot.setLabelGenerator(null);  // OPTIONAL CUSTOMISATION COMPLETED.  ChartRenderingInfo info = null;  HttpSession session = request.getSession();  try {  //Create RenderingInfo object   response.setContentType("text/html");   info = new ChartRenderingInfo(new StandardEntityCollection());   BufferedImage chartImage = chart.createBufferedImage(640, 400, info);  // putting chart as BufferedImage in session,  // thus making it available for the image reading action Action.  session.setAttribute("chartImage", chartImage);  PrintWriter writer = new PrintWriter(response.getWriter());  ChartUtilities.writeImageMap(writer, "imageMap", info);  writer.flush();  } catch (Exception e) { }   String pathInfo = "http://";  pathInfo += request.getServerName();  int port = request.getServerPort();  pathInfo += ":"+String.valueOf(port);  pathInfo += request.getContextPath();  String chartViewer = pathInfo + "/servlet/ChartViewer";  return chartViewer;  } 



6. 页面

Java代码 
  1.    
  2. <html>   
  3. <head>   
  4. <title>Pie Chart Demo</title>   
  5. </head>   
  6. <jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" />   
  7. <body>   
  8. <h2>Pie Chart Demo</h2>   
  9. <%String chartViewer = myChart.getChartViewer(request, response);%>   
  10. <img src="<%=chartViewer%>" border=0 usemap="#imageMap">   
  11. </body>   
  12. </html>   
Java代码 复制代码
  1. <html>  <head>  <title>Pie Chart Demo</title>  </head>  <jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" />  <body>  <h2>Pie Chart Demo</h2>  <%String chartViewer = myChart.getChartViewer(request, response);%>  <img src="<%=chartViewer%>" border=0 usemap="#imageMap">  </body>  </html>   
  <html>  <head>  <title>Pie Chart Demo</title>  </head>  <jsp:useBeanid="myChart"scope="session"class="myapp.webwork.beans.Pie3DDemo" />  <body>  <h2>Pie Chart Demo</h2>  <%String chartViewer = myChart.getChartViewer(request, response);%>  <img src="<%=chartViewer%>" border=0 usemap="#imageMap">  </body>  </html> 



4)采用工具类ChartUtil和DisplayChart(jfreechart的servlet)输出
我用了上面的几个方法输出图片,发现页面里只能输出一个图片,
不过下面的方法可以输出多个图片,而且是几种方式中最简单的一个,推荐使用。

这种方式和上面的三种比较类似,是将javabean里的生成图片的方法写的一个工具类ChartUtil里面。

1 .添加工具类ChartUtil
public class ChartUtil {
// 产生时间序列图,返回图片名称

Java代码 
  1. public  static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {   
  2.   
  3. String filename = null;   
  4.  try {   
  5.  if (session != null)   
  6.  {   
  7. ChartDeleter deleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");   
  8.  session.removeAttribute("JFreeChart_Deleter");   
  9.  session.setAttribute("JFreeChart_Deleter", deleter);   
  10. }   
  11. JFreeChart chart = ChartFactory.createPieChart3D(   
  12. title,  // chart title   
  13. dataset, // data   
  14. true,  // include legend   
  15. true,   
  16. false );   
  17. //  Write the chart image to the temporary directory   
  18. ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());   
  19. //If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.   
  20. //If the last parameter is a session object, the chart remains until session time out.   
  21. filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);   
  22. //  Write the image map to the PrintWriter   
  23.  ChartUtilities.writeImageMap(pw, filename, info,true);   
  24.  pw.flush();   
  25. catch (Exception e) {   
  26.  System.out.println("Exception - " + e.toString());   
  27.  e.printStackTrace(System.out);   
  28.  filename = "picture_error.png"; }   
  29. return filename;   
  30. }   
  31. }   
Java代码 复制代码
  1. public  static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {   String filename = null;   try {   if (session != null)   {  ChartDeleter deleter = (ChartDeleter)session.getAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter");   session.removeAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter");   session.setAttribute("<SPAN class=hilite1>JFreeChart</SPAN>_Deleter", deleter);  }  <SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPieChart3D(  title,  // chart title  dataset, // data  true,  // include legend  true,  false );  //  Write the chart image to the temporary directory  ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());  //If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.  //If the last parameter is a session object, the chart remains until session time out.  filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);  //  Write the image map to the PrintWriter   ChartUtilities.writeImageMap(pw, filename, info,true);   pw.flush();  } catch (Exception e) {   System.out.println("Exception - " + e.toString());   e.printStackTrace(System.out);   filename = "picture_error.png"; }  return filename;  }  }   
public  static String generatePieChart(DefaultPieDataset dataset,String title,int width,int height,HttpSession session, PrintWriter pw) {   String filename = null;   try {   if (session != null)   {  ChartDeleter deleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");   session.removeAttribute("JFreeChart_Deleter");   session.setAttribute("JFreeChart_Deleter", deleter);  }  JFreeChart chart = ChartFactory.createPieChart3D(  title,  // chart title  dataset, // data  true,  // include legend  true,  false );  //  Write the chart image to the temporary directory  ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());  //If the last parameter is null, the chart is a "one time"-chart and will be deleted after the first serving.  //If the last parameter is a session object, the chart remains until session time out.  filename = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);  //  Write the image map to the PrintWriter   ChartUtilities.writeImageMap(pw, filename, info,true);   pw.flush();  } catch (Exception e) {   System.out.println("Exception - " + e.toString());   e.printStackTrace(System.out);   filename = "picture_error.png"; }  return filename;  }  } 




2、在action里统计数据,设置好数据集dataset。传到页面

3、 在页面里取出
DefaultPieDataset piedataset=(DefaultPieDataset)request.getAttribute("piedataset");
// 用ChartUtil工具类产生图片

Java代码 
  1. String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,nullnew PrintWriter(out));   
  2. String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;   
Java代码 复制代码
  1. String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,nullnew PrintWriter(out));  String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p;   
String p = ChartUtil.generatePieChart(piedataset," 项目收支线图",500,300,null, new PrintWriter(out));  String p1 = request.getContextPath() + "/servlet/DisplayChart?filename=" + p; 


通过以下方式输出

Java代码 
  1. <td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>  
Java代码 复制代码
  1. <td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>  
<td><img src="<%= p1 %>" width=500 height=300 border=0 usemap="#<%= p %>"></td>



4、在web.xml中添加

Java代码 复制代码
  1. <servlet>  
  2.   <servlet-name>DisplayChart</servlet-name>  
  3.   <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>  
  4. </servlet>  
  5. <servlet-mapping>  
  6.     <servlet-name>DisplayChart</servlet-name>  
  7.     <url-pattern>/servlet/DisplayChart</url-pattern>  
  8. </servlet-mapping>  
Java代码 复制代码
  1. <servlet>   <servlet-name>DisplayChart</servlet-name>   <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet> <servlet-mapping>     <servlet-name>DisplayChart</servlet-name>     <url-pattern>/servlet/DisplayChart</url-pattern> </servlet-mapping>  
<servlet>   <servlet-name>DisplayChart</servlet-name>   <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet> <servlet-mapping>     <servlet-name>DisplayChart</servlet-name>     <url-pattern>/servlet/DisplayChart</url-pattern> </servlet-mapping>



5) ApplicationFrame 方式

Java代码 复制代码
  1. public class PieChartDemo1 extends ApplicationFrame {   
  2. public PieChartDemo1(String title) {   
  3. super(title);   
  4. setContentPane(createDemoPanel());   
  5. }   
  6. private static JFreeChart createChart(PieDataset dataset) {   
  7. JFreeChart chart = ChartFactory.createPieChart(   
  8. .......  
  9. return chart;   
  10. }   
  11.   
  12. public static JPanel createDemoPanel() {   
  13. JFreeChart chart = createChart(createDataset());   
  14. return new ChartPanel(chart);   
  15. }   
  16.   
  17. public static void main(String[] args) {   
  18. PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1");   
  19. demo.pack();   
  20. RefineryUtilities.centerFrameOnScreen(demo);   
  21. demo.setVisible(true);   
  22. }   
  23. }   
Java代码 复制代码
  1. public class PieChartDemo1 extends ApplicationFrame {  public PieChartDemo1(String title) {  super(title);  setContentPane(createDemoPanel());  }  private static <SPAN class=hilite1>JFreeChart</SPAN> createChart(PieDataset dataset) {  <SPAN class=hilite1>JFreeChart</SPAN> chart = ChartFactory.createPieChart(  ....... return chart;  }   public static JPanel createDemoPanel() {  <SPAN class=hilite1>JFreeChart</SPAN> chart = createChart(createDataset());  return new ChartPanel(chart);  }   public static void main(String[] args) {  PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1");  demo.pack();  RefineryUtilities.centerFrameOnScreen(demo);  demo.setVisible(true);  }  }   
public class PieChartDemo1 extends ApplicationFrame {  public PieChartDemo1(String title) {  super(title);  setContentPane(createDemoPanel());  }  private static JFreeChart createChart(PieDataset dataset) {  JFreeChart chart = ChartFactory.createPieChart(  ....... return chart;  }   public static JPanel createDemoPanel() {  JFreeChart chart = createChart(createDataset());  return new ChartPanel(chart);  }   public static void main(String[] args) {  PieChartDemo1 demo = new PieChartDemo1("Pie Chart Demo 1");  demo.pack();  RefineryUtilities.centerFrameOnScreen(demo);  demo.setVisible(true);  }  } 



六. 可参考资料与网址

官方网站

http://www.jfree.org/jfreechart/index.html

官方论坛

http://www.jfree.org/phpBB2/index.php

API 文档

http://www.jfree.org/jfreechart/api/gjdoc/index.html

中文API

http://blog.sina.com.cn/u/405da78d010000ap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值