jsp页面:
<%
String titleString="苹果(吨)销售分布统计图表";
session.setAttribute("titleString",titleString);
//String[] datastr = new String[] { "672", "766", "223", "540", "100" } ;//对应y轴数据
double[][] data = new double[][] {{ 672, 766, 250, 540, 100 }} ;//对应y轴数据
String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };//x轴系列
session.setAttribute("data",data);
//session.setAttribute("datastr",datastr);
session.setAttribute("columnKeys",columnKeys);
%>
<img src="CreateImg" border="0"/>
web.xml中增加servelet配置:
<servlet>
<servlet-name>CreateImg</servlet-name>
<servlet-class>com.tools.chart.CreateImg</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CreateImg</servlet-name>
<url-pattern>/CreateImg</url-pattern>
</servlet-mapping>
后台java文件:
package com.tools.chart;
/**
* 可以使用export JAVA_OPTS="-Djava.awt.headless=true",
*在catalina.sh中增加CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true"
*在启动Weblogic中要加上这个参数-Djava.awt.headless=true,这样才能显示出图片。
*在JDK1.4可以在代码中增加:System.setProperty("java.awt.headless", "true");
*/
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Font;
import java.text.*;
import org.jfree.chart.*;
//import org.jfree.data.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.*;
import org.jfree.data.category.*;
import org.jfree.chart.renderer.category.*;
import org.jfree.chart.title.*;
import org.jfree.data.general.DatasetUtilities;
@SuppressWarnings("serial")
public class CreateImg extends HttpServlet {
public void init(ServletConfig conf) throws ServletException
{
super.init(conf);
}
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
System.setProperty("java.awt.headless", "true");//好像针对java1.4
res.setContentType("image/jpeg");
res.setHeader("Pragma","No-cache");
res.setHeader("Cache-Control","no-cache");
res.setDateHeader("Expires", 0);
// double[][] data = new double[][] { { 672, 766, 223, 540, 126 } };
double data[][]=(double[][])req.getSession().getAttribute("data");
String[] rowKeys = { "苹果" };
//String[] columnKeys = { "北京", "上海", "广州", "成都", "深圳" };
String columnKeys[]=(String[])req.getSession().getAttribute("columnKeys");
//String datastr[]=(String[])req.getSession().getAttribute("datastr");
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
// DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// for(int i=0;i<columnKeys.length;i++)
// dataset.addValue(Double.parseDouble(datastr[i]),rowKeys[0],columnKeys[i]);
String titleString= (String)req.getSession().getAttribute("titleString");
JFreeChart chart = ChartFactory.createBarChart3D(titleString, // 图表标题
"地点", // 目录轴的显示标签
"数据", // 数值轴的显示标签
dataset, // 数据集
PlotOrientation.VERTICAL, // 图表柱子方向:水平、垂直VERTICAL
true, // 是否显示图例(对于简单的柱状图必须是false)
true, // 是否生成提示tooltip
false // 是否生成URL链接
);
Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 14);
TextTitle stt=new TextTitle("---初步分析");
stt.setFont(new Font("隶书", Font.ITALIC, 14));
chart.addSubtitle(stt);
chart.getTitle().setFont(new Font("隶书", Font.BOLD, 24));
/*
* VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭,
* 使用的关闭抗锯齿后,字体尽量选择12到14号的宋体字,这样文字最清晰好看
*/ chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); chart.setTextAntiAlias(false);
chart.setBackgroundPaint(Color.white);
// create plot
CategoryPlot plot = chart.getCategoryPlot();
// 设置横虚线可见
plot.setRangeGridlinesVisible(true);
// 虚线色彩
plot.setRangeGridlinePaint(Color.gray);
// 数据轴精度
NumberAxis vn = (NumberAxis) plot.getRangeAxis();
// vn.setAutoRangeIncludesZero(true);
DecimalFormat df = new DecimalFormat("#0.00");
vn.setNumberFormatOverride(df); // 数据轴数据标签的显示格式
// x轴设置
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(labelFont);// 轴标题
domainAxis.setTickLabelFont(labelFont);// 轴数值
// Lable(Math.PI/3.0)度倾斜
domainAxis.setCategoryLabelPositions(CategoryLabelPositions
.createUpRotationLabelPositions(Math.PI / 3.0));
domainAxis.setMaximumCategoryLabelWidthRatio(0.6f);// 横轴上的 Lable 是否完整显示
// 设置距离图片左端距离
domainAxis.setLowerMargin(0.1);
// 设置距离图片右端距离
domainAxis.setUpperMargin(0.1);
// 设置 columnKey 是否间隔显示
// domainAxis.setSkipCategoryLabelsToFit(true);
plot.setDomainAxis(domainAxis);
// 设置柱图背景色(注意,系统取色的时候要使用16位的模式来查看颜色编码,这样比较准确)
// plot.setBackgroundPaint(new Color(255, 255, 204));
// y轴设置
ValueAxis rangeAxis = plot.getRangeAxis();
// rangeAxis.setVerticalTickLabels(false);//设置坐标数字横着写
rangeAxis.setLabelFont(labelFont); //设置坐标轴别名字体
rangeAxis.setTickLabelFont(labelFont); //设置坐标数字字体
// 设置最高的一个 Item 与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
// 设置最低的一个 Item 与图片底端的距离
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
BarRenderer3D renderer = new BarRenderer3D();//柱子3维的必要条件
// 设置柱子宽度
renderer.setMaximumBarWidth(0.05);
// 设置柱子高度
renderer.setMinimumBarLength(0.2);
// 设置柱子边框颜色
renderer.setBaseOutlinePaint(Color.BLACK);
// 设置柱子边框可见
renderer.setDrawBarOutline(true);
// 设置柱的颜色
renderer.setSeriesPaint(0, new Color(153, 204, 255 ));
renderer.setSeriesPaint(1, new Color(51, 204, 204));
renderer.setSeriesPaint(2, new Color(204, 255, 255));
// 设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.0);
// 显示每个柱的数值,并修改该数值的字体属性
renderer.setIncludeBaseInRange(true);
renderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(labelFont);//柱状图柱子的字体
renderer.setLegendTextFont(0, labelFont);//图例的字体
// renderer.setItemLabelFont(labelFont);
plot.setRenderer(renderer);
// 设置柱的透明度
plot.setForegroundAlpha(1.0f);
ChartUtilities.writeChartAsPNG(res.getOutputStream(), chart, 600, 500, true, 10);//简单图片内容比jpg体积更小
// ChartUtilities.writeChartAsJPEG(res.getOutputStream(), chart, 600, 500);
}
public void doPost(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException
{
doGet(req,res);
}
}