package com.servlet.report;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import com.servlet.dbcp.DBCPTools;
public class JfreeChartServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String db = request.getParameter("db");
String sql = request.getParameter("sql");
String title = request.getParameter("title");
String type = request.getParameter("type");
String categoryLabel = request.getParameter("categoryLabel");
String valueLabel = request.getParameter("valueLabel");
String rowLabel = request.getParameter("rowLabel");
String columnLabel = request.getParameter("columnLabel");
String columnValue = request.getParameter("columnValue");
int width = Integer.parseInt(request.getParameter("width").toString());
int height = Integer
.parseInt(request.getParameter("height").toString());
String fileName = "";
try {
fileName = this.drawToHtml(getChart(db, sql, title, type,
categoryLabel, valueLabel, rowLabel, columnLabel,
columnValue), request.getSession(), response.getWriter(),
width, height);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String myImg = "<img id='myImg' src='/servlet/DisplayChart?filename="
+ fileName + "' usemap='#" + fileName + "' border='0'>";
response.getWriter().print(myImg);
}
public JFreeChart getChart(String db, String sql, String title,
String type, String categoryLabel, String valueLabel,
String rowLabel, String columnLabel, String columnValue)
throws SQLException {
JFreeChart chart = null;
Font myFont = new Font("黑体", Font.BOLD, 14);
if ("pie".equals(type)) {
chart = ChartFactory.createPieChart3D(title, createPieDataset(db,
sql, rowLabel, columnLabel), true, true, false);
PiePlot localPiePlot = (PiePlot) chart.getPlot();
localPiePlot.setLabelFont(myFont);
localPiePlot.setNoDataMessage("没有数据");
localPiePlot.setCircular(false);
localPiePlot.setLabelGap(0.02D);
} else if ("bar".equals(type)) {
chart = ChartFactory.createBarChart3D(title, categoryLabel,
valueLabel, createDataset(db, sql, rowLabel, columnLabel,
columnValue), PlotOrientation.VERTICAL, true, true,
false);
CategoryPlot localCategoryPlot = (CategoryPlot) chart.getPlot();
CategoryAxis domainAxis = localCategoryPlot.getDomainAxis();
// 设置水平底部列表
domainAxis.setLabelFont(myFont);
// 设置水平底部标题
domainAxis.setTickLabelFont(myFont);
domainAxis
.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
// 设置锤子标题
ValueAxis rangeAxis = localCategoryPlot.getRangeAxis();
rangeAxis.setLabelFont(myFont);
CategoryItemRenderer localCategoryItemRenderer = localCategoryPlot
.getRenderer();
localCategoryItemRenderer.setBaseItemLabelsVisible(true);
BarRenderer localBarRenderer = (BarRenderer) localCategoryItemRenderer;
localBarRenderer.setItemMargin(0.20000000000000001D);
} else if (type.equals("aear")) {
chart = ChartFactory.createStackedAreaChart(title, categoryLabel,
valueLabel, createDataset(db, sql, rowLabel, columnLabel,
columnValue), PlotOrientation.VERTICAL, true, true,
false);
chart.setBackgroundPaint(Color.white);
CategoryPlot localCategoryPlot = (CategoryPlot) chart.getPlot();
CategoryAxis localCategoryAxis = localCategoryPlot.getDomainAxis();
localCategoryAxis.setLabelFont(myFont);
// 设置水平底部标题
localCategoryAxis.setTickLabelFont(myFont);
localCategoryAxis
.setCategoryLabelPositions(CategoryLabelPositions.STANDARD);
// 设置锤子标题
ValueAxis rangeAxis = localCategoryPlot.getRangeAxis();
rangeAxis.setLabelFont(myFont);
} else if (type.equals("line")) {
chart = ChartFactory.createXYLineChart(title, categoryLabel,
valueLabel, createXYDataset(db, sql, rowLabel, columnLabel,
columnValue), PlotOrientation.VERTICAL, true, true,
false);
XYPlot localXYPlot = (XYPlot) chart.getPlot();
// 设置X轴显示汉字字体
ValueAxis domainAxis = localXYPlot.getDomainAxis();
domainAxis.setLabelFont(myFont);
XYLineAndShapeRenderer localXYLineAndShapeRenderer = (XYLineAndShapeRenderer) localXYPlot
.getRenderer();
localXYLineAndShapeRenderer.setBaseShapesVisible(true);
localXYLineAndShapeRenderer.setBaseShapesFilled(true);
// 设置Y轴显示汉字字体
NumberAxis localNumberAxis = (NumberAxis) localXYPlot
.getRangeAxis();
localNumberAxis.setLabelFont(myFont);
localNumberAxis.setStandardTickUnits(NumberAxis
.createIntegerTickUnits());
}
chart.setTitle(new TextTitle(title, new Font("黑体", Font.ITALIC, 22)));
// 设置图例的字体==为了防止中文乱码:必须设置字体
chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));
return chart;
}
public String drawToHtml(JFreeChart chart, HttpSession session,
PrintWriter out, int width, int height) {
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
String fileName = "";
try {
fileName = ServletUtilities.saveChartAsPNG(chart, width, height,
info, session);// 生成图片
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(out, fileName, info, false);
} catch (IOException e) {
e.printStackTrace();
}
out.flush();
return fileName;// 返回生成图片的文件名
}
private PieDataset createPieDataset(String db, String sql, String rowLabel,
String columnLabel) throws SQLException {
DefaultPieDataset localDefaultPieDataset = new DefaultPieDataset();
ResultSet rs = resultSetToList(sql, db);
while (rs.next()) {
localDefaultPieDataset.setValue(rs.getString(rowLabel), rs
.getDouble(columnLabel));
}
rs.close();
return localDefaultPieDataset;
}
private CategoryDataset createDataset(String db, String sql,
String rowLabel, String columnLabel, String columnValue)
throws SQLException {
DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();
ResultSet rs = resultSetToList(sql, db);
while (rs.next()) {
localDefaultCategoryDataset.addValue(rs.getDouble(columnLabel), rs.getString(rowLabel), rs
.getString(columnValue));
}
rs.close();
return localDefaultCategoryDataset;
}
private static XYDataset createXYDataset(String db, String sql,
String rowLabel, String columnLabel, String columnValue)
throws SQLException {
XYSeriesCollection localXYSeriesCollection = new XYSeriesCollection();
ResultSet rs = resultSetToList(sql, db);
XYSeries localXYSeries1 = null;
rs.next();
String temp = rs.getString(columnValue);
if (temp != null && !("").equals(temp)) {
localXYSeries1 = new XYSeries(temp);
localXYSeries1.add(rs.getDouble(rowLabel), rs
.getDouble(columnLabel));
}
while (rs.next()) {
if (rs.getString(columnValue).equals(temp)) {
localXYSeries1.add(rs.getDouble(rowLabel), rs
.getDouble(columnLabel));
} else {
localXYSeriesCollection.addSeries(localXYSeries1);
localXYSeries1 = new XYSeries(rs.getString(columnValue));
temp = rs.getString(columnValue);
localXYSeries1.add(rs.getDouble(rowLabel), rs
.getDouble(columnLabel));
}
}
if (localXYSeries1 != null) {
localXYSeriesCollection.addSeries(localXYSeries1);
}
rs.close();
return localXYSeriesCollection;
}
private static ResultSet resultSetToList(String sql, String dbName)
throws java.sql.SQLException {
Connection con = DBCPTools.getConnectionFromDBCP(dbName);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
if (rs == null)
return null;
return rs;
}
}
以上是java类
下面是展示图表jsp页面代码
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function loadFile(){
var txtFrame=document.getElementById("txtFrame").value;
var returnStr =eval( "(" + parent.workfloweditor.xmldocument.getJfreechart(txtFrame)+ ")" );
var outText=new parent.jsx3.ide.DBConn().jfreeChartServlet(returnStr,document.body.clientWidth,parent.document.body.clientHeight);//本项目用的ajax代码
document.getElementById("div1").innerHTML=outText;
}
</script>
</head>
<body οnlοad="loadFile()">
<input id="txtFrame" type="hidden" value="<%=request.getParameter("frame") %>">
<div id="div1"></div>
</body>
</html>