|
|
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> |
|