JFreeChart应用

1.servlet
package com.logcd.servlet;

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.RenderingHints;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.Dataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.TextAnchor;
import org.jfree.util.Rotation;

public class JChartServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private static enum ChartType {
		BarChart,BarChart3D,PieChart,PieChart3D,LineChart,LineChart3D,XYLineChart
	}

	/**
	 * 处理请求
	 */
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		String type = request.getParameter("type");
		ChartType chartType = getChartType(Integer.parseInt(type)); 
		
		response.setContentType("image/jpeg");

		JFreeChart chart = createChart(getDataSet(chartType),chartType);
		setChartStyle(chart);

		ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 0.9f, chart,
				480, 350, null);
	
	}

	/**
	 * 创建图表
	 * @param dataset
	 * @param chartType
	 * @return
	 */
	public static JFreeChart createChart(Dataset dataset,ChartType chartType){
		JFreeChart chart = null;
		
		switch(chartType){
		    case BarChart:
				chart = ChartFactory.createBarChart("水果产量图",// 图表标题
						"水果种类",// X轴的显示标签
						"产量",// Y轴的显示标签
						(CategoryDataset)dataset, // 数据集
						PlotOrientation.VERTICAL, // 图表方向:水平、垂直
						true,//是否显示图例(对于简单的柱状图必须是false)
						false,
						false);//是否生成URL链接
		    break;
		    
		    case BarChart3D:
				chart = ChartFactory.createBarChart3D("水果产量图",// 图表标题
						"水果种类",// X轴的显示标签
						"产量",// Y轴的显示标签
						(CategoryDataset)dataset, // 数据集
						PlotOrientation.VERTICAL, // 图表方向:水平、垂直
						true,//是否显示图例(对于简单的柱状图必须是false)
						false,//是否启用提示
						false);//是否生成URL链接
	    	break;
            
		    case PieChart:
				chart = ChartFactory.createPieChart("水果产量图", (DefaultPieDataset)dataset, true,
						false, false);
		    break;
		    
		    case PieChart3D:
				chart = ChartFactory.createPieChart3D("水果产量图", (DefaultPieDataset)dataset, true,
						false, false);
		    break;
		    
		    case LineChart:
		    	chart = ChartFactory.createLineChart("水果产量图", "水果种类",   
		                "产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,   
		                false, false);  
		    break;
		    
		    case LineChart3D:
		    	chart = ChartFactory.createLineChart3D("水果产量图", "水果种类",   
		                "产量", (CategoryDataset)dataset, PlotOrientation.VERTICAL, true,   
		                false, false);  
		    break;
		    
		    case XYLineChart:
		    	chart = ChartFactory.createXYLineChart("苹果产量图", "月份",   
		                "产量", (XYDataset)dataset, PlotOrientation.VERTICAL, true,   
		                false, false);  
		    break;
		}
		
		return chart;
	}
	
	/**
	 * 设置chart风格
	 * 
	 * @param chart
	 */
	public static void setChartStyle(JFreeChart chart) {
		// 设置一个背景,从渐到深的倾斜
		chart.setBackgroundPaint(new GradientPaint(0.0F, 0.0F, Color.PINK,
				10000F, 0.0F, Color.YELLOW));

		chart.getTitle().setFont(new Font("SimSun", Font.BOLD, 12));// 标题的字体
		Font font = new Font("黑体", Font.TRUETYPE_FONT, 10);// 公用字体

		LegendTitle legend = (LegendTitle) chart.getLegend();// 图例
		legend.setItemFont(font);

		chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
				RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
		Plot plot = chart.getPlot();

		if (plot instanceof CategoryPlot) {
			CategoryPlot categryPlot = (CategoryPlot) chart.getPlot();// 图表层
			plot.setBackgroundAlpha(0.6f);
			plot.setForegroundAlpha(0.9F);// 设置透明度

			CategoryAxis domain_axis = categryPlot.getDomainAxis();
			domain_axis.setTickLabelFont(font);// X轴标尺字体
			domain_axis.setLabelFont(font);// X轴标题标签字体
			//横坐标数据倾斜45度 
			//domain_axis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); 

			ValueAxis value_axis = categryPlot.getRangeAxis();
			value_axis.setTickLabelFont(font);// Y轴标尺字体
			value_axis.setLabelFont(font);// Y轴标题标签字体

			// VALUE_TEXT_ANTIALIAS_OFF表示将文字的抗锯齿关闭
			chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
					RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);

			CategoryItemRenderer renderer = chart.getCategoryPlot().getRenderer();
			renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            //设置item(bar)标签值的位置是在上面还是在bar内 
			renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 
			if(renderer instanceof LineAndShapeRenderer){
				((LineAndShapeRenderer)renderer).setBaseShapesVisible(true);//显示折线图上的数据标志
			}
			if(renderer instanceof BarRenderer3D){
				((BarRenderer3D)renderer).setItemLabelAnchorOffset(10D);// 设置柱形图上的文字偏离值 
			}
			renderer.setBaseItemLabelFont(new Font("Serif", Font.PLAIN, 10));
			renderer.setBaseItemLabelsVisible(true);

		}

		if (plot instanceof PiePlot) {
			// 得到3D饼图的plot对象
			PiePlot piePlot = (PiePlot) chart.getPlot();
			plot.setBackgroundAlpha(0.6f);
			// 设置旋转角度
			piePlot.setStartAngle(290);
			// 设置旋转方向:顺时针方向
			piePlot.setDirection(Rotation.CLOCKWISE);
			// 设置透明度
			piePlot.setForegroundAlpha(0.5f);
			piePlot.setLabelFont((new Font("宋体", Font.PLAIN, 12)));

			piePlot.setLabelGenerator(new StandardPieSectionLabelGenerator(   
            "{0}:{1}({2})"));//名称、值、百分比
			//设置扇区边框不可见   
	        piePlot.setSectionOutlinesVisible(false);
            if(!(plot instanceof PiePlot3D)){
    	        //设置扇区分离显示
    	        piePlot.setExplodePercent("苹果", 0.2D);  
            }

		}
		
		if(plot instanceof XYPlot){
			 XYPlot xyPlot = (XYPlot) chart.getPlot();
			 xyPlot.setBackgroundAlpha(0.6f);
			 
			 ValueAxis domain_axis = xyPlot.getDomainAxis();
			 domain_axis.setTickLabelFont(font);
			 domain_axis.setLabelFont(font);
			 
			 ValueAxis range_axis = xyPlot.getRangeAxis();
			 range_axis.setTickLabelFont(font);
			 range_axis.setLabelFont(font);
			 
			 XYLineAndShapeRenderer renderer
		       = (XYLineAndShapeRenderer) xyPlot.getRenderer();
             renderer.setBaseShapesVisible(true);//显示数据标志
			 renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
		     renderer.setBaseItemLabelsVisible(true);
		     renderer.setBaseItemLabelFont(font);

		}
	}

	public static ChartType getChartType(Integer type){
		ChartType chartType = ChartType.PieChart;
		switch(type){
		   case 0: chartType = ChartType.BarChart;
		   break;
		   case 1: chartType = ChartType.BarChart3D;
		   break;
		   case 2: chartType = ChartType.PieChart;
		   break;
		   case 3: chartType = ChartType.PieChart3D;
		   break;
		   case 4: chartType = ChartType.LineChart;
		   break;
		   case 5: chartType = ChartType.LineChart3D;
		   break;
		   case 6: chartType = ChartType.XYLineChart;
		   break;
		}
		return chartType;
	}
	
	/**
	 * 获取一个演示用的简单数据集对象
	 * 
	 * @return
	 */
	private static Dataset getDataSet(ChartType type) {
		switch(type){
		   case BarChart : 
		   case BarChart3D:
		   case LineChart:
		   case LineChart3D:
				DefaultCategoryDataset categorydataset = new DefaultCategoryDataset();
				categorydataset.addValue(100, "北京", "苹果");
				categorydataset.addValue(70, "上海", "苹果");
				categorydataset.addValue(120, "广州", "苹果");
				categorydataset.addValue(220, "北京", "梨子");
				categorydataset.addValue(260, "上海", "梨子");
				categorydataset.addValue(300, "广州", "梨子");
				categorydataset.addValue(320, "北京", "葡萄");
				categorydataset.addValue(370, "上海", "葡萄");
				categorydataset.addValue(320, "广州", "葡萄");
				categorydataset.addValue(490, "北京", "香蕉");
				categorydataset.addValue(450, "上海", "香蕉");
				categorydataset.addValue(400, "广州", "香蕉");
				categorydataset.addValue(200, "北京", "荔枝");
				categorydataset.addValue(230, "上海", "荔枝");
				categorydataset.addValue(340, "广州", "荔枝");
				return categorydataset;
		   case PieChart:
		   case PieChart3D:
				DefaultPieDataset pieDataset = new DefaultPieDataset();
				pieDataset.setValue("苹果", 100);
				pieDataset.setValue("梨子", 200);
				pieDataset.setValue("葡萄", 300);
				pieDataset.setValue("香蕉", 400);
				pieDataset.setValue("荔枝", 500);
				return pieDataset;
		   case XYLineChart:
			   XYSeriesCollection xyDataset = new XYSeriesCollection();
			   XYSeries apple = new XYSeries("苹果");
			   for(int i=0;i<12;i++){
				   apple.add(i+1, (int)(500*Math.random()));
			   }
			   xyDataset.addSeries(apple);
			   return xyDataset;
		}
		return null;
	}

}

2.web.xml
	<servlet>
        <servlet-name>JChartServlet</servlet-name>
        <servlet-class>com.logcd.servlet.JChartServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>JChartServlet</servlet-name>
        <url-pattern>/jChartImg</url-pattern>
    </servlet-mapping>

3.html中调用
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <title>JChart Test</title> 
	<meta http-equiv="pragma" content="no-cache"> 
	<meta http-equiv="cache-control" content="no-cache"> 
	<meta http-equiv="expires" content="0">    
  </head> 
  
  <body> 
    <img src="./jChartImg?type=0"/> 
    <img src="./jChartImg?type=1"/> 
    <img src="./jChartImg?type=2"/> 
    <img src="./jChartImg?type=3"/> 
    <img src="./jChartImg?type=4"/> 
    <img src="./jChartImg?type=5"/> 
    <img src="./jChartImg?type=6"/> 
  </body> 
</html> 

你可能感兴趣的:(html,apple,UI,servlet,jfreechart)