`
liyanboss
  • 浏览: 140345 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

在struts2中使用JFreeChart

阅读更多
继续上一篇的 在struts2中使用JasperReports,这篇是如何在web页面上输出chart(图表)。

1、在struts2中,默认的struts-default.xml中,并没有包含chart的result-type,它是插件的形式使用的。把 struts2的解压包的lib里找到struts2-jfreechart-plugin-2.0.11.jar,拷贝到你的项目的 classpath里,同时在struts.xml里面增加一个chart的result-type。
<result-types>
	<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"/>
</result-types>
<action name="ListAllFruit4Bar2" class="chart.ListAllFruit4Bar2Action">
	<result name="success" type="chart">
		<param name="chart">chart</param>
		<param name="height">400</param>
		<param name="width">700</param>
	</result>
</action>
<action name="ListAllFruit4Pie2" class="chart.ListAllFruit4Pie2Action">
	<result name="success" type="chart">
		<param name="chart">chart</param>
		<param name="height">400</param>
		<param name="width">700</param>
	</result>
</action>

2、需要再添加jfreechart-1.0.9.jar和jcommon-1.0.12.jar(JasperReports和JFreeChart都需要的)到你的classpath里面。
3、在你的action代码里,返回一个JFreeChart对象即可。
ListAllFruit4Bar2Action代码:
package chart;

import org.jfree.chart.JFreeChart;

import com.opensymphony.xwork2.ActionSupport;

public class ListAllFruit4Bar2Action extends ActionSupport {
	private static final long serialVersionUID = 1L;
    private JFreeChart chart;
	
	@Override
	public String execute() throws Exception {
		chart = FruitService.createBarChart();
		return SUCCESS;
	}
	
	public JFreeChart getChart() {
		return chart;
	}
}

ListAllFruit4Pie2Action代码:
package chart;

import org.jfree.chart.JFreeChart;

import com.opensymphony.xwork2.ActionSupport;

public class ListAllFruit4Pie2Action extends ActionSupport {
	private static final long serialVersionUID = 1L;
    private JFreeChart chart;
	
	@Override
	public String execute() throws Exception {
		chart = FruitService.createPaiChart();
		return SUCCESS;
	}
	
	public JFreeChart getChart() {
		return chart;
	}
}


FruitService代码:
package chart;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

public class FruitService {

	public static JFreeChart createBarChart() {
		CategoryDataset dataset = getDataSet2();
		JFreeChart chart = ChartFactory.createBarChart3D(
				"水果产量图", // 图表标题
				"水果", // 目录轴的显示标签
				"产量", // 数值轴的显示标签
				dataset, // 数据集
				PlotOrientation.VERTICAL, // 图表方向:水平、垂直
				true, 	// 是否显示图例(对于简单的柱状图必须是false)
				true, 	// 是否生成工具
				true 	// 是否生成URL链接
				);
		return chart;
	}

	private static CategoryDataset getDataSet2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, "北京", "苹果");
		dataset.addValue(100, "上海", "苹果");
		dataset.addValue(100, "广州", "苹果");
		dataset.addValue(200, "北京", "梨子");
		dataset.addValue(200, "上海", "梨子");
		dataset.addValue(200, "广州", "梨子");
		dataset.addValue(300, "北京", "葡萄");
		dataset.addValue(300, "上海", "葡萄");
		dataset.addValue(300, "广州", "葡萄");
		dataset.addValue(400, "北京", "香蕉");
		dataset.addValue(400, "上海", "香蕉");
		dataset.addValue(400, "广州", "香蕉");
		dataset.addValue(500, "北京", "荔枝");
		dataset.addValue(500, "上海", "荔枝");
		dataset.addValue(500, "广州", "荔枝");
		return dataset;
	}
     
    public static JFreeChart createPaiChart() {
		DefaultPieDataset data = getDataSet();
		JFreeChart chart = ChartFactory.createPieChart3D("水果产量图",  // 图表标题
		data, 
		true, // 是否显示图例
		false,
		false
		);
		PiePlot plot = (PiePlot) chart.getPlot();
		resetPiePlot(plot);
		return chart;
	}
	
	private static void resetPiePlot(PiePlot plot) {
		String unitSytle = "{0}={1}({2})";
		
		plot.setNoDataMessage("无对应的数据,请重新查询。");
		plot.setNoDataMessagePaint(Color.red);
		
		//指定 section 轮廓线的厚度(OutlinePaint不能为null)
		plot.setOutlineStroke(new BasicStroke(0));
		
		//设置第一个 section 的开始位置,默认是12点钟方向
		plot.setStartAngle(90);			

		plot.setToolTipGenerator(new StandardPieToolTipGenerator(unitSytle,
				NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
		
		//指定图片的透明度
		plot.setForegroundAlpha(0.65f);
		
		//引出标签显示样式
		plot.setLabelGenerator(new StandardPieSectionLabelGenerator(unitSytle,
				NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
			
		//图例显示样式
		plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator(unitSytle,
				NumberFormat.getNumberInstance(),
				new DecimalFormat("0.00%")));
	}

	private static DefaultPieDataset getDataSet() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue("苹果",100);
		dataset.setValue("梨子",200);
		dataset.setValue("葡萄",300);
		dataset.setValue("香蕉",400);
		dataset.setValue("荔枝",500);
		return dataset;
	}

}

4、同时在jsp页面里显示--柱图和饼图。
增加一个ListAllFruit4BarAndPie的action:
<action name="ListAllFruit4BarAndPie" class="">
	<result name="success" type="dispatcher">/WEB-INF/chart/ListAllFruit4BarAndPie.jsp</result>
</action>

ListAllFruit4BarAndPie.jsp代码:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
    <title>ListAllFruit4BarAndPie</title>
</head>
<body>
	<center><h2>使用柱图和饼图列取所有水果产量</h2></center>
	柱图:<img src="chart/ListAllFruit4Bar2.action"><br/>
	饼图:<img src="chart/ListAllFruit4Pie2.action">
</body>
</html>


            
生成的HTML的效果图如下:


下面是除了依赖的jar以外的所有源代码,share出来,欢迎下载。
分享到:
评论
9 楼 yuchensuifeng 2012-05-02  
谢谢分享!刚学这个,现在去试试!
8 楼 wrrwhn 2011-08-23  
Caused by: There is no result type defined for type 'chart' mapped with name 'success'.  Did you mean 'chart'? - result - file:/D:/Program%20Files/Apache%20Software%20Foundation/Tomcat%206.0/webapps/WareStore/WEB-INF/classes/struts.xml:59:40

你好,在使用你的方法中,出现了此种情况,请问你是否还有印象,此种情况是哪里出错吗?
7 楼 wu_yaowen 2010-01-13  
<action name="ListAllFruit4Bar2" class="chart.ListAllFruit4Bar2Action">  
     <result name="success" type="chart">  
         <param name="chart">chart</param>  
         <param name="height">400</param>  
         <param name="width">700</param>  
     </result>  
 </action>  
 <action name="ListAllFruit4Pie2" class="chart.ListAllFruit4Pie2Action">  
     <result name="success" type="chart">  
         <param name="chart">chart</param>  
         <param name="height">400</param>  
         <param name="width">700</param>  
     </result>  
 </action>  


这里是错的哈,         <param name="chart">chart</param> 
应该为         <param name="value">chart</param> 
后面的chart为你action中定义的域变量,比如piechart或什么什么的
6 楼 liyanboss 2009-05-27  
zhouwendong006 写道

为什么最后的Java代码 &lt;action&nbsp;name="ListAllFruit4BarAndPie"&nbsp;class=""&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;name="success"&nbsp;type="dispatcher"&gt;/WEB-INF/chart/ListAllFruit4BarAndPie.jsp&lt;/result&gt;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp;&lt;action name="ListAllFruit4BarAndPie" class=""&gt;
&lt;result name="success" type="dispatcher"&gt;/WEB-INF/chart/ListAllFruit4BarAndPie.jsp&lt;/result&gt;
&lt;/action&gt;中的class的值为空呢?


最后一个是List Action,默认是直接返回SUCCESS,使用空的Action,其实是默认使用了ActionSupport
5 楼 zhouwendong006 2009-05-20  
为什么最后的
<action name="ListAllFruit4BarAndPie" class="">
	<result name="success" type="dispatcher">/WEB-INF/chart/ListAllFruit4BarAndPie.jsp</result>
</action>

中的class的值为空呢?
4 楼 yehaoren 2009-03-13  
你好,我想问下,#  plot.setToolTipGenerator(new StandardPieToolTipGenerator(unitSytle, 
#                 NumberFormat.getNumberInstance(), 
#                 new DecimalFormat("0.00%"))); 
这段代码是不是生成鼠标提示的,你的例子里,提示好像显示不出来啊
3 楼 w469 2009-03-02  
谢谢!!!!!
对我帮助很大!
2 楼 shaqiang32 2008-09-28  
李大哥,我是小刘啊,居然在javaeye都能碰到,,,这个好像是你上次教我的那个报表程序?
1 楼 liukidd 2008-05-04  
如果数据量大,这种方法可行吗?

相关推荐

Global site tag (gtag.js) - Google Analytics