代码如下:
<%@ page import="
 org.jfree.chart.ChartFactory,
 org.jfree.chart.JFreeChart,
 org.jfree.chart.axis.*,
 java.awt.Font,
 org.jfree.chart.plot.PlotOrientation,
 org.jfree.chart.plot.CategoryPlot,
 org.jfree.data.category.CategoryDataset,
 org.jfree.data.category.DefaultCategoryDataset,
 org.jfree.chart.ChartUtilities,
 org.jfree.chart.axis.CategoryLabelPositions,
 java.awt.Color,
 org.jfree.chart.renderer.category.*,
 org.jfree.chart.labels.StandardCategoryItemLabelGenerator,
 org.jfree.ui.TextAnchor,
 org.jfree.chart.labels.ItemLabelAnchor,
 org.jfree.chart.labels.ItemLabelPosition,
 com.guandi.hibernate.*,
 java.util.*,
 java.text.*
"%>
<%@ page language="java" contentType="image/png;charset=utf-8"%>
<%@page import="org.jfree.ui.RectangleInsets"%>
<%
if(request.getParameter("yuefen")!=null){
String yuefen =  request.getParameter("yuefen").trim();
JFreeChart chart = getChart(yuefen);
if(chart!=null){
int width= 1000 ;
int height = 500 ;
try {
ChartUtilities.writeChartAsJPEG(response.getOutputStream(), chart, width, height);
} catch (Exception e) {
System.err.print(e);
}
}else{
System.err.println("danyuan chart is null");
}
out.clear();
out = pageContext.pushBody();
}
%>
<%!
public JFreeChart getChart(String yuefen){
String title=yuefen+"右岸高线拌和系统大坝混凝土供应量";

JFreeChart chart=ChartFactory.createStackedBarChart3D(title,"","日累计混凝土供应量(m³)",getDataSet(yuefen,1),PlotOrientation.VERTICAL,true,false,false);
CategoryPlot plot=(CategoryPlot)chart.getPlot();
//纵轴
NumberAxis numberAxis =(NumberAxis)plot.getRangeAxis();
numberAxis.setLabelFont(new Font("楷体",Font.BOLD,14));
    //横轴  
CategoryAxis categoryAxis=plot.getDomainAxis();
categoryAxis.setLabelFont(new Font("宋体",Font.BOLD,10));
categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
categoryAxis.setTickLabelInsets(new RectangleInsets());

//纵轴二
DefaultCategoryDataset dataset2 = (DefaultCategoryDataset)getDataSet(yuefen,0);
ValueAxis axis2 = new NumberAxis3D("混凝土月累计强度(m³)");
axis2.setLabelFont(new Font("楷体",Font.BOLD,14));

//显示数值
StackedBarRenderer3D renderer = new StackedBarRenderer3D();
renderer.setSeriesPaint(0, new Color(0, 0, 250));
    renderer.setSeriesPaint(1, new Color(0, 250, 250));
    renderer.setSeriesPaint(2, new Color(255, 255, 0));
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setBaseItemLabelsVisible(true);
renderer.setItemLabelAnchorOffset(20.0);
//renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER));
renderer.setMinimumBarLength(0.5);
plot.setRenderer(1,renderer);

// 设定右边纵轴应用的坐标对象
plot.setRangeAxis(1, axis2);
plot.setDataset(1, dataset2);
// 映射数据集对象
plot.mapDatasetToRangeAxis(0, 1);
//设置没有数据
plot.setNoDataMessage("没有数据显示"); 
plot.setNoDataMessageFont(new Font("黑体",0,20));    
// 定义绘制属性
LineAndShapeRenderer renderer2 = new LineAndShapeRenderer();
renderer2.setSeriesPaint(0, Color.MAGENTA);
renderer2.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer2.setItemLabelAnchorOffset(5.0);
renderer2.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER));
//不突出显示数据点
renderer2.setBaseShapesVisible(false); 
// renderer2.setSeriesStroke(0, new BasicStroke(2.5f));
//显示柱状的值
//renderer2.setBaseItemLabelsVisible(true);
//renderer2.setBaseItemLabelPaint(Color.blue);
plot.setRenderer(0, renderer2);
//设置背景色
chart.setBackgroundPaint(java.awt.Color.white);
//设置透明度
// plot.setForegroundAlpha(0.9f); 
return chart;
}
private static CategoryDataset getDataSet(String yuefen,int zongzhou) {
DefaultCategoryDataset dataset=new DefaultCategoryDataset();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
int yyyy=Integer.parseInt(yuefen.substring(0,4));
int MM=Integer.parseInt(yuefen.substring(5,7));
Calendar mintime=Calendar.getInstance();
mintime.set(yyyy,MM-1,0,23,59,59);
Calendar maxtime=Calendar.getInstance();
maxtime.set(yyyy,MM,0,23,59,59);
int day=maxtime.get(Calendar.DAY_OF_MONTH);
ProductDAO pdao=new ProductDAO();
List products=pdao.findByYuefen(mintime.getTime(),maxtime.getTime());
pdao.getSession().close();
Iterator it=products.iterator();
double leijigongyingliang=0;
if(mintime!=null&&maxtime!=null){
//统计时间
int[] flag=new int[(int)day+1];
String[] timestamp=new String[(int)day+1];
int zongbiaozhi=0;
    //统计每天的记录数
for(int i=1;i<=day;i++){
    //每天的方量
   double dayfangliang1=0;
   double dayfangliang2=0;
       double dayfangliang3=0;
   //设定每天的开始时间
Calendar startdate=Calendar.getInstance();
startdate.set(yyyy,MM-1,i-1,23,59,59);
//设定每天的结束时间
Calendar endtdate=Calendar.getInstance();
endtdate.set(yyyy,MM-1,i,23,59,59);
while(it.hasNext()){
  Product product=(Product)it.next();
  //要计算拌合楼的每盘结束时间用来界定范围
Date date=product.getShengchanshijian();
Calendar time=Calendar.getInstance();
time.setTime(date);
// Short jiaozhushijian=product.getJiaobanshijian();
// time.add(Calendar.SECOND,jiaozhushijian);
//找出每一天内的记录数,算出总方量
if(time.before(endtdate)&&time.after(startdate)){
//置标值位
flag[i]+=1;
timestamp[i]=sdf.format(endtdate.getTime());
if(zongzhou==0){
  if(product.getLouhao().trim().equals("1"))
{
  //算出1#总方量
  dayfangliang1+=product.getPanfangliang();
dataset.addValue(dayfangliang1,"1#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(dayfangliang2,"2#拌合楼",sdf.format(endtdate.getTime()));
    dataset.addValue(dayfangliang3,"3#拌合楼",sdf.format(endtdate.getTime()));
}
else if(product.getLouhao().trim().equals("2"))
{
//算出2#总方量
dayfangliang2+=product.getPanfangliang();
dataset.addValue(dayfangliang1,"1#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(dayfangliang2,"2#拌合楼",sdf.format(endtdate.getTime()));
    dataset.addValue(dayfangliang3,"3#拌合楼",sdf.format(endtdate.getTime()));
} else if(product.getLouhao().trim().equals("3")){
    //算出3#总方量
    dayfangliang3+=product.getPanfangliang();
dataset.addValue(dayfangliang1,"1#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(dayfangliang2,"2#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(dayfangliang3,"3#拌合楼",sdf.format(endtdate.getTime()));
}
}
if(zongzhou==1){
leijigongyingliang+=product.getPanfangliang();
dataset.addValue(leijigongyingliang,"混凝土日累计量",sdf.format(endtdate.getTime()));
}
}
}
//对于每天内没有数据的也要写个数据,通过标志位判断
if(flag[i]==0&&zongzhou==0){
dataset.addValue(0,"1#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(0,"2#拌合楼",sdf.format(endtdate.getTime()));
dataset.addValue(0,"3#拌合楼",sdf.format(endtdate.getTime()));
timestamp[i]=sdf.format(endtdate.getTime());
}else if(flag[i]==0&&zongzhou==1){
dataset.addValue(leijigongyingliang,"混凝土日累计量",sdf.format(endtdate.getTime()));
timestamp[i]=sdf.format(endtdate.getTime());
}
//因为要多个循环,只有再来一次了
it=products.iterator();
}
    for(int i=0;i<flag.length;i++){
     zongbiaozhi+=flag[i];
    }
    if(zongbiaozhi==0){
     for(int i=1;i<timestamp.length;i++){
     //System.out.println(timestamp[i]);
     dataset.removeValue("1#拌合楼",timestamp[i]);
     dataset.removeValue("2#拌合楼",timestamp[i]);
     dataset.removeValue("3#拌合楼",timestamp[i]);
     dataset.removeValue("混凝土日累计量",timestamp[i]);
     }
    }
  //  System.out.println(zongbiaozhi);
return dataset;
}
else{
return dataset;
}
}
%>