Thanks Bear Bibeault for the reply...
I have a
java class method which returns a BufferdImage Object. Here is the code.
package chart;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.image.*;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JFrame;
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.urls.*;
import org.jfree.chart.entity.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.util.ShapeUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.*;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
public class XYChartExample2
{
BufferedImage chartImage;
public XYChartExample2() {
}
private DefaultCategoryDataset getDataset() {
// categories...
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(0.0D, "Series 1", "Jan");
defaultcategorydataset.addValue(2D, "Series 1", "Feb");
defaultcategorydataset.addValue(1.0D, "Series 1", "Mar");
defaultcategorydataset.addValue(3D, "Series 1", "Apr");
defaultcategorydataset.addValue(5D, "Series 1", "May");
defaultcategorydataset.addValue(7D, "Series 1", "Jun");
return defaultcategorydataset;
}
public BufferedImage getChartViewer() {
DefaultCategoryDataset xydataset = getDataset();
JFreeChart jfreechart = ChartFactory.createLineChart("Chart", "Month", "Values", xydataset, PlotOrientation.VERTICAL, false, false, false);
jfreechart.setBackgroundPaint(Color.cyan);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
categoryplot.setDomainGridlinePaint(Color.white);
categoryplot.setRangeGridlinePaint(Color.white);
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setSeriesShapesVisible(0, true);
lineandshaperenderer.setSeriesShape(0, ShapeUtilities.createDiamond(4F));
lineandshaperenderer.setDrawOutlines(true);
lineandshaperenderer.setUseFillPaint(true);
lineandshaperenderer.setBaseFillPaint(Color.white);
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// OPTIONAL CUSTOMISATION COMPLETED.
ChartRenderingInfo info = null;
try {
info = new ChartRenderingInfo(new StandardEntityCollection());
chartImage = jfreechart.createBufferedImage(550, 350, info);
}
catch (Exception e) {
// handel your exception here
}
return chartImage;
} }
I am extracting the BufferedImage Object in jsp in the following way.
<html>
<head>
<title>XY Chart Demo</title>
</head>
<body>
<%BufferedImage chartViewer = myChart.getChartViewer();
//System.out.println("getType() " +chartViewer.getType() );
//System.out.println("getType() " +chartViewer.toString() );
%>
<Table>
<tr>
<td align=center><img src="<%=chartViewer%>" border=0 > </td>
</tr>
</table>
</body>
</html>
My work is to generate certain number of charts dynamically and then display all the charts generated at the same time in same jsp... For
testing i have given some dummy values. Still need to implement extraction of values for databse and setting the dataset.
If i use servlet URL mechanism, i am able to write only one chart data to response outputstream... following is the procedure i followed.
Servlet ChartViewer.java /**
*
* Need to produce some chart prior to this action call in a Java bean
* Need a session attribute named "chartImage";
*
*/
package myapp.webwork.servlets;
import java.io.*;
import java.awt.image.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.keypoint.PngEncoder;
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() {
}
}
Java Class which generates a chart XYChartEample2.java /**
*
* JFreeChart version 0.9.20
* Called by Pie3DDemo.jsp
*
*/
package myapp.webwork.beans;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.image.*;
import javax.servlet.http.*;
import java.io.File;
import java.io.IOException;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JPanel;
import javax.swing.JFrame;
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.urls.*;
import org.jfree.chart.entity.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.util.ShapeUtilities;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.*;
import org.jfree.ui.*;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
public class XYChartExample2
{
// how many values are there in the chart
public static final int NUM_VALUES = 60;
public XYChartExample2() {
}
private DefaultCategoryDataset getDataset() {
// categories...
DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();
defaultcategorydataset.addValue(0.0D, "Series 1", "Jan");
defaultcategorydataset.addValue(2D, "Series 1", "Feb");
defaultcategorydataset.addValue(1.0D, "Series 1", "Mar");
defaultcategorydataset.addValue(3D, "Series 1", "Apr");
defaultcategorydataset.addValue(5D, "Series 1", "May");
defaultcategorydataset.addValue(7D, "Series 1", "Jun");
return defaultcategorydataset;
}
public
String getChartViewer(HttpServletRequest request, HttpServletResponse response) {
DefaultCategoryDataset xydataset = getDataset();
JFreeChart jfreechart = ChartFactory.createLineChart("Chart", "Month", "Values", xydataset, PlotOrientation.VERTICAL, false, false, false);
jfreechart.setBackgroundPaint(Color.cyan);
CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();
categoryplot.setBackgroundPaint(Color.lightGray);
categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
categoryplot.setDomainGridlinePaint(Color.white);
categoryplot.setRangeGridlinePaint(Color.white);
LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();
lineandshaperenderer.setSeriesShapesVisible(0, true);
// lineandshaperenderer.setSeriesShapesVisible(1, false);
// lineandshaperenderer.setSeriesShapesVisible(2, true);
// lineandshaperenderer.setSeriesLinesVisible(2, false);
lineandshaperenderer.setSeriesShape(0, ShapeUtilities.createDiamond(4F));
lineandshaperenderer.setDrawOutlines(true);
lineandshaperenderer.setUseFillPaint(true);
lineandshaperenderer.setBaseFillPaint(Color.white);
//lineandshaperenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
// categoryplot.setRenderer(lineandshaperenderer);
NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
// 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 = jfreechart.createBufferedImage(550, 350, 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, true);
// writer.flush();
}
catch (Exception e) {
// handel your exception here
}
String pathInfo = "http://";
pathInfo += request.getServerName();
int port = request.getServerPort();
pathInfo += ":"+String.valueOf(port);
pathInfo += request.getContextPath();
String chartViewer = pathInfo + "/servlet/ChartViewer";
return chartViewer;
}
}
then in jsp following to display the chart.
<%String chartViewer = myChart.getChartViewer(request, response);%>
<Table>
<tr>
<td align=center><img src="<%=chartViewer%>" border=0 usemap="#imageMap"> </td>
Please suggest me how to proceed further inorder to send back to jsp todisplay several charts generated in java class...
Thanks in advance,
susmitha.