[size=x-large]实例一[/size]
前言
关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐:
1. 1. struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目录下),非常全面,直接部署就可以了(很多朋友Struts2能学很好我估计还是直接从这里学来的)。
2. wiki-WebWork:入了门的朋友应该都知道,strust2由webwork2和struts1.x合并起来的,但主要还是以webwork2为主,所以如果找不到Struts2的资料可以找WebWork资料看看。
3. Max On Java的博客,他的博客的资料在中文的Struts2算是比较全的了,写得很详细。
4.
The Code Project、Google - CodeSearch、Koders:这几个代码搜索网站在我找不到中文资料甚至英文文章的时候帮了我大忙!
关于JFreeChart入门等这里我也不打算介绍了,中文资料很多了。
--------------------------------------------------------------------
正题
下面以边帖图片和代码的方式来讲解Struts2与JFreeChart的整合。
搭建环境:首先帖一张工程的目录结构以及所需的jar包。注意:如果你不打算自己写ChartResult的话只需要引入struts2-jfreechart-plugin-2.0.6.jar(这个在struts-2.0.6-all.zip可以找到了):
1.依次帖web.xml、struts.xml、struts.properties和struts-jfreechart.xml几个配置文件的代码:
web.xml
[img]http://dl.iteye.com/upload/attachment/0070/0551/a9f12cac-4692-317e-baf6-f630efeb0adb.png[/img]
说明:这里只需要说明下struts-jfreechart.xml,这里直接调用已经写好的类ChartResult,这个类是继承自com.opensymphony.xwork2.Result,传入生成图片大小的参数width和height就可以了。
2. 新建JFreeChartAction继承ActionSupport,生成JFreeChart对象并保存到chart中,注意这个名称是固定的。
OK!至此代码已经全部贴完。
输入访问 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action
显示结果如下:
[img]http://dl.iteye.com/upload/attachment/0070/0560/6fcd2646-56ce-365a-b56a-669af591c943.png[/img]
--------------------------------------------------------------------
补充
以上生成的图片是PNG格式的图片,如果需要自定义图片格式的话(好像只能支持JPG和PNG格式),那么自己写一个ChartResult继承自StrutsResultSupport,见代码:
OK!显示的效果是一样的,只是图片格式不一样,当然这里面你可以做更多操作!
==============================================================
[size=x-large]实例二[/size]
JFreechart是JAVA平台上的一个开放的图表绘制类库。完全使用JAVA语言编写的。基本上能够很直观的解决目前所有的统计方面的需求。JFreeChart可以生成饼图(pie charts),柱状图(bar charts),散点图(scatter plots),时序图(time series),甘特图(Gantt charts)等多种图表,并且可以产生PNG和JPEG格式的输出。
JFreeChart 与Struts2整合
到JFreeChart的官网http://www.jfree.org/jfreechart/download.html下载相关的资源,找到JFreeChart的资源包jfreechart-1.0.14.zip下载并解压。
lib:文件夹里面放的就是JFreeChart的jar包,和所有的JFreeChart依赖的jar包。
Struts2并没有求全而是设计了一个灵活,可扩展的插件体系,以插件的方式,为struts2添加新的功能。在struts2下载包中的lib目录会发现这里面以struts2作为文件名开头的文件可以被分成两类,一类是struts2的核心包,Eg:struts2-core-2.3.3.jar;而其他的都叫Struts2-xxx-plugin-2.3.3.jar,很显然,后者都是Struts2的插件。
这些插件的存在形式就是普通的jar包。打开看看会发现只要是插件的jar包,其根目录下都有一个叫Struts-plugin.xml的文件,里面有这个插件相应的配置。
以struts2-jfreeChart-plugin-2.3.3.jar中的struts-plugin.xml为例:
Java代码
其实这个struts-plugin.xml实际上就是个struts.xml,至此,可以看到struts2插件的存在方式:struts2-xxx-plugin-版本号。jar
struts2插件的加载顺序和作用
在启动web容器的时候,Struts2有一个运行时配置,它会按照以下顺序加载配置文件:
struts-default.xml这个文件应该在核心包中,也就是struts2-core-版本号.jar中,通常有一个。
struts-plugin.xml这种文件应该在所有的插件包中,也就是以struts2-xxx-plugin-版本号.jar,通常会有多个。
struts.xml这个文件应该在web应用的classpath根目录下有一个。
通常情况下,插件的配置文件优先于我们的配置文件加载,因此,我们可以像引用struts-default包一样来引用struts-plugin.xml文件中的其他包。
有了上面的那个JFreeChart插件的struts-plugin.xml后,我们的<package>元素只要继承插件中的包,就可以任意使用这个包内的任意资源。如下:(注:以下代码都是工作项目中的真实代码)
Java代码
注意三点:
struts2的包在继承关系上是递归的,其配置文件可以多继承中间用“,”分割。jfreeChart-default包继承自struts-default包,因此,可以自由使用struts-default的东西。
我们的包继承了jfreeChart-default包,因此,我们可以随意使用jfreeChart-default包中的东西,<result name="success" type="chart">就是使用了jfreechart-defaultbao中定义的<result-type name="char">.
插件就是以这种声明新包,然后再新包中声明新功能的方式,来简洁的加入到应用中,而且在插件中还可以通过声明替换struts-default包中的默认行为。
把struts2-jfreeChart-plugin-2.3.3.jar,jcommon-1.0.17.jar,jfreechart-1.0.14.jar导入到项目中,就可以进行相关的开发。
在公司项目中统计这块的业务代码是我来负责,首先写了一个JfreeChartUtil类
Java代码
1.//用户统计
[img]http://dl.iteye.com/upload/attachment/0070/0569/4dedb0ce-941b-3d44-a82f-602beb386725.png[/img]
===================================================================
[size=x-large]实例三[/size]
jFreeChart与Struts2的组合:
一,加入Struts2支持
二,加入struts2-jfreechart-plugin-2.1.6.jar
注意:有的版本的此包有点小问题,此包内有一个struts-plugin.xml内容如下:
Xml代码
若该package没有继承struts-default则需要手动加上extends="struts-default"再重新用jdk打包
三,在action中生成我们的图片报表
Java代码
四,struts.xml中的配置:
注意:由于在第二步的时候将jfreechart-default包继承了struts-default故这里可以直接继承jfreechart-default
这样做的目地是result的type类型为chart,这个类型在struts-default中没有定义,是jreechart-default中定义的
故我们要引入jfreechart-default包,但又要引入struts-default,因此我们可以让jfreechart-default包继承了struts-default。
而在struts.xml中继承jfreechart-default就可以了!
================================================================
[size=x-large]实例四[/size]
struts2 + jfreechart整合:
1、配置环境:
在struts2中,默认的struts-default.xml中,并没有包含chart的result-type,它是插件的形式使用的。
把 struts2的解压包的lib里找到struts2-jfreechart-plugin-2.1.8.1.jar,拷贝到你的项目的 classpath里,
因为这个插件里的文件struts-plugin.xml里有一个chart的result-type。内容如下:
Xml代码
同时把jfreechart的库文件jfreechart-1.0.13.jar和jcommon-1.0.16.jar拷贝到你的项目的 classpath里。
2、修改web.xml,增加下面的struts2的配置:
Xml代码
3、在src目录下增加新建一个struts.xml配置文件,其主要内容如下:
Xml代码
4、写测试页面:
Html代码
5、在你的action代码里,返回一个JFreeChart对象即可:
Java代码
6、发布到应用服务器,进行测试。
http://localhost:9090/SSHDemo/jfreechart.jsp
前言
关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐:
1. 1. struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目录下),非常全面,直接部署就可以了(很多朋友Struts2能学很好我估计还是直接从这里学来的)。
2. wiki-WebWork:入了门的朋友应该都知道,strust2由webwork2和struts1.x合并起来的,但主要还是以webwork2为主,所以如果找不到Struts2的资料可以找WebWork资料看看。
3. Max On Java的博客,他的博客的资料在中文的Struts2算是比较全的了,写得很详细。
4.
The Code Project、Google - CodeSearch、Koders:这几个代码搜索网站在我找不到中文资料甚至英文文章的时候帮了我大忙!
关于JFreeChart入门等这里我也不打算介绍了,中文资料很多了。
--------------------------------------------------------------------
正题
下面以边帖图片和代码的方式来讲解Struts2与JFreeChart的整合。
搭建环境:首先帖一张工程的目录结构以及所需的jar包。注意:如果你不打算自己写ChartResult的话只需要引入struts2-jfreechart-plugin-2.0.6.jar(这个在struts-2.0.6-all.zip可以找到了):
1.依次帖web.xml、struts.xml、struts.properties和struts-jfreechart.xml几个配置文件的代码:
web.xml
[img]http://dl.iteye.com/upload/attachment/0070/0551/a9f12cac-4692-317e-baf6-f630efeb0adb.png[/img]
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-jfreechart.xml" />
</struts>
struts.properties
struts.ui.theme=simple
struts-jfreechart.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="jFreeChartDemonstration" extends="struts-default"
namespace="/jfreechart">
<result-types>
<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type>
</result-types>
<action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction">
<result type="chart">
<param name="width">400</param>
<param name="height">300</param>
</result>
</action>
</package>
</struts>
说明:这里只需要说明下struts-jfreechart.xml,这里直接调用已经写好的类ChartResult,这个类是继承自com.opensymphony.xwork2.Result,传入生成图片大小的参数width和height就可以了。
2. 新建JFreeChartAction继承ActionSupport,生成JFreeChart对象并保存到chart中,注意这个名称是固定的。
package com.tangjun.struts2;
import com.opensymphony.xwork2.ActionSupport;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
public class JFreeChartAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 5752180822913527064L;
//供ChartResult调用->ActionInvocation.getStack().findValue("chart")
private JFreeChart chart;
@Override
public String execute() throws Exception {
//设置数据
DefaultPieDataset data = new DefaultPieDataset();
data.setValue("Java", new Double(43.2));
data.setValue("Visual Basic", new Double(1.0));
data.setValue("C/C++", new Double(17.5));
data.setValue("tangjun", new Double(60.0));
//生成JFreeChart对象
chart = ChartFactory.createPieChart("Pie Chart", data, true,true, false);
/
//生成JFreeChart对象
chart = ChartFactory.createPieChart("Module Automation Case Number Statistics", data, true,true, false);
PiePlot plot = (PiePlot) chart.getPlot();
// 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1} ", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));
// 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}"));
///
return SUCCESS;
}
public JFreeChart getChart() {
return chart;
}
public void setChart(JFreeChart chart) {
this.chart = chart;
}
}
OK!至此代码已经全部贴完。
输入访问 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action
显示结果如下:
[img]http://dl.iteye.com/upload/attachment/0070/0560/6fcd2646-56ce-365a-b56a-669af591c943.png[/img]
--------------------------------------------------------------------
补充
以上生成的图片是PNG格式的图片,如果需要自定义图片格式的话(好像只能支持JPG和PNG格式),那么自己写一个ChartResult继承自StrutsResultSupport,见代码:
package com.tangjun.struts2.chartresult;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.StrutsResultSupport;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import com.opensymphony.xwork2.ActionInvocation;
public class ChartResult extends StrutsResultSupport {
/**
*
*/
private static final long serialVersionUID = 4199494785336139337L;
//图片宽度
private int width;
//图片高度
private int height;
//图片类型 jpg,png
private String imageType;
@Override
protected void doExecute(String arg0, ActionInvocation invocation) throws Exception {
JFreeChart chart =(JFreeChart) invocation.getStack().findValue("chart");
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream os = response.getOutputStream();
if("jpeg".equalsIgnoreCase(imageType) || "jpg".equalsIgnoreCase(imageType))
ChartUtilities.writeChartAsJPEG(os, chart, width, height);
else if("png".equalsIgnoreCase(imageType))
ChartUtilities.writeChartAsPNG(os, chart, width, height);
else
ChartUtilities.writeChartAsJPEG(os, chart, width, height);
os.flush();
}
public void setHeight(int height) {
this.height = height;
}
public void setWidth(int width) {
this.width = width;
}
public void setImageType(String imageType) {
this.imageType = imageType;
}
}
如此的话还需要小小的修改一下struts-jfreechart.xml:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="jFreeChartDemonstration" extends="struts-default"
namespace="/jfreechart">
<!-- 自定义返回类型 -->
<result-types>
<!--
<result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type>
-->
<result-type name="chart" class="com.tangjun.struts2.chartresult.ChartResult"></result-type>
</result-types>
<action name="JFreeChartAction" class="com.tangjun.struts2.JFreeChartAction">
<!--
<result type="chart">
<param name="width">400</param>
<param name="height">300</param>
</result>
-->
<result type="chart">
<param name="width">400</param>
<param name="height">300</param>
<param name="imageType">jpg</param>
</result>
</action>
</package>
</struts>
OK!显示的效果是一样的,只是图片格式不一样,当然这里面你可以做更多操作!
==============================================================
[size=x-large]实例二[/size]
JFreechart是JAVA平台上的一个开放的图表绘制类库。完全使用JAVA语言编写的。基本上能够很直观的解决目前所有的统计方面的需求。JFreeChart可以生成饼图(pie charts),柱状图(bar charts),散点图(scatter plots),时序图(time series),甘特图(Gantt charts)等多种图表,并且可以产生PNG和JPEG格式的输出。
JFreeChart 与Struts2整合
到JFreeChart的官网http://www.jfree.org/jfreechart/download.html下载相关的资源,找到JFreeChart的资源包jfreechart-1.0.14.zip下载并解压。
lib:文件夹里面放的就是JFreeChart的jar包,和所有的JFreeChart依赖的jar包。
Struts2并没有求全而是设计了一个灵活,可扩展的插件体系,以插件的方式,为struts2添加新的功能。在struts2下载包中的lib目录会发现这里面以struts2作为文件名开头的文件可以被分成两类,一类是struts2的核心包,Eg:struts2-core-2.3.3.jar;而其他的都叫Struts2-xxx-plugin-2.3.3.jar,很显然,后者都是Struts2的插件。
这些插件的存在形式就是普通的jar包。打开看看会发现只要是插件的jar包,其根目录下都有一个叫Struts-plugin.xml的文件,里面有这个插件相应的配置。
以struts2-jfreeChart-plugin-2.3.3.jar中的struts-plugin.xml为例:
Java代码
1.<?xml version="1.0" encoding="UTF-8" ?>
2.<struts>
3. <package name="jfreechart-default" extends="struts-default">
4. <result-types>
5. <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult" default="false">
6. <param name="height">150</param>
7. <param name="width">200</param>
8. </result-type>
9. </result-types>
10. </package>
11. </struts>
其实这个struts-plugin.xml实际上就是个struts.xml,至此,可以看到struts2插件的存在方式:struts2-xxx-plugin-版本号。jar
struts2插件的加载顺序和作用
在启动web容器的时候,Struts2有一个运行时配置,它会按照以下顺序加载配置文件:
struts-default.xml这个文件应该在核心包中,也就是struts2-core-版本号.jar中,通常有一个。
struts-plugin.xml这种文件应该在所有的插件包中,也就是以struts2-xxx-plugin-版本号.jar,通常会有多个。
struts.xml这个文件应该在web应用的classpath根目录下有一个。
通常情况下,插件的配置文件优先于我们的配置文件加载,因此,我们可以像引用struts-default包一样来引用struts-plugin.xml文件中的其他包。
有了上面的那个JFreeChart插件的struts-plugin.xml后,我们的<package>元素只要继承插件中的包,就可以任意使用这个包内的任意资源。如下:(注:以下代码都是工作项目中的真实代码)
Java代码
1.<package name="default" extends="json-default,jfreechart-default">
2.<!-- 统计查询 -->
3. <action name="jFreeChart" class="logAction" method="jFreeChart">
4. <result name="success" type ="chart" >
5. <param name ="width"> 780 </param>
6. <param name ="height"> 370 </param>
7. </result>
8. </action>
9.</package>
注意三点:
struts2的包在继承关系上是递归的,其配置文件可以多继承中间用“,”分割。jfreeChart-default包继承自struts-default包,因此,可以自由使用struts-default的东西。
我们的包继承了jfreeChart-default包,因此,我们可以随意使用jfreeChart-default包中的东西,<result name="success" type="chart">就是使用了jfreechart-defaultbao中定义的<result-type name="char">.
插件就是以这种声明新包,然后再新包中声明新功能的方式,来简洁的加入到应用中,而且在插件中还可以通过声明替换struts-default包中的默认行为。
把struts2-jfreeChart-plugin-2.3.3.jar,jcommon-1.0.17.jar,jfreechart-1.0.14.jar导入到项目中,就可以进行相关的开发。
在公司项目中统计这块的业务代码是我来负责,首先写了一个JfreeChartUtil类
Java代码
1./**
2.package com.tq.platform.util;
3.
4./**
5. * @Title: Savepath.java
6. * @Package: com.tq.platform.util
7. * @Description: TODO(JFreeChart uitl)
8. * @author: 何枫
9. * @date: 2012-5-11 下午08:52:24
10. * @version: V1.0
11. */
12.import java.awt.Color;
13.import java.awt.Font;
14.import java.awt.RenderingHints;
15.import java.io.File;
16.import java.io.FileOutputStream;
17.import org.jfree.chart.ChartFactory;
18.import org.jfree.chart.ChartUtilities;
19.import org.jfree.chart.JFreeChart;
20.import org.jfree.chart.axis.CategoryAxis;
21.import org.jfree.chart.axis.CategoryLabelPositions;
22.import org.jfree.chart.axis.NumberAxis;
23.import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
24.import org.jfree.chart.plot.CategoryPlot;
25.import org.jfree.chart.plot.PlotOrientation;
26.import org.jfree.chart.renderer.category.BarRenderer3D;
27.import org.jfree.chart.renderer.category.LineAndShapeRenderer;
28.import org.jfree.chart.title.TextTitle;
29.import org.jfree.data.category.CategoryDataset;
30.import org.jfree.data.general.DatasetUtilities;
31.
32.public class CreateLinechart {
33. /**
34. * 图片保存的根目录
35. * @param filename
36. * @return
37. */
38. public String Savepath(){
39. String path = getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
40. String testpath = path.substring(0,path.lastIndexOf("WEB-INF"));
41. String filepath = testpath+"images/";
42. String JFpath = filepath +"core/";
43. return JFpath;//Tomcat的中webapps目录下项目的images文件夹
44. }
45.
46. /**
47. * 柱状图,折线图 数据集 方法
48. */
49. public CategoryDataset getBarData( String[] rowKeys,
50. String[] columnKeys,double[][] data) {
51. return DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
52.
53. }
54. public void isChartPathExist(String chartPath) {
55. File file = new File(chartPath);
56. if (!file.exists()) {
57. file.mkdirs();
58. // log.info("CHART_PATH="+CHART_PATH+"create.");
59. }
60.
61. }
62. /**
63. *
64. * @Title: createBarChart3D
65. * @Description: TODO(柱状图样式)
66. * @param @param charTitle
67. * @param @param x
68. * @param @param y
69. * @param @param Dataset
70. * @param @param charName
71. * @param @return 设定文件
72. * @return JFreeChart 返回类型
73. * @throws
74. */
75. public JFreeChart createBarChart3D(String charTitle, String x, String y, CategoryDataset Dataset, String charName){
76. JFreeChart chart = ChartFactory.createLineChart(charTitle, x, y,
77. Dataset, PlotOrientation.VERTICAL, true, true, false);
78. chart.setTitle(new TextTitle("用户统计图", new Font("黑体", Font.ITALIC,22)));
79. CategoryPlot categoryPlot = chart.getCategoryPlot();
80. NumberAxis numberaxis = (NumberAxis) categoryPlot.getRangeAxis();
81. // 设置纵坐标的标题字体和大小
82. numberaxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 24));
83. // 设置丛坐标的坐标值的字体颜色
84. numberaxis.setLabelPaint(Color.BLACK);
85. // 设置丛坐标的坐标轴标尺颜色
86. numberaxis.setTickLabelPaint(Color.RED);
87. // 获取横坐标
88. CategoryAxis domainAxis = categoryPlot.getDomainAxis();
89. // 设置横坐标的标题字体和大小
90. domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 13));
91. // 设置横坐标的坐标值的字体颜色
92. domainAxis.setTickLabelPaint(Color.BLACK);
93. // 设置横坐标的坐标值的字体
94. domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 20));
95. // 这句代码解决了底部汉字乱码的问题
96. chart.getLegend().setItemFont(new Font("黑体", 0, 16));
97. //在柱体的上面显示数据
98. BarRenderer3D custombarrenderer3d = new BarRenderer3D();
99. //数据字体颜色
100. custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);
101. custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
102. custombarrenderer3d.setBaseItemLabelsVisible(true);
103. categoryPlot.setRenderer(custombarrenderer3d);
104. //图片路径
105. FileOutputStream fos_jpg = null;
106. try {
107. isChartPathExist(Savepath());
108. String chartName = Savepath() + charName;
109. fos_jpg = new FileOutputStream(chartName);
110.
111. // 将报表保存为JPG文件
112. ChartUtilities.writeChartAsJPEG(fos_jpg, chart,780, 370);
113.
114. } catch (Exception e) {
115. e.printStackTrace();
116. return null;
117. } finally {
118. try {
119. fos_jpg.close();
120. } catch (Exception e) {
121. e.printStackTrace();
122. }
123. }
124. return chart;
125. }
126.
127. /**
128. * 折线图样式
129. * @param chartTitle
130. * @param x
131. * @param y
132. * @param xyDataset
133. * @param charName
134. * @return
135. */
136. public JFreeChart createTimeXYChar(String chartTitle, String x, String y,
137. CategoryDataset xyDataset, String charName) {
138. JFreeChart chart = ChartFactory.createLineChart(chartTitle, x, y,
139. xyDataset, PlotOrientation.VERTICAL, true, true, false);
140. // 设置消除字体的锯齿渲染(解决中文问题)
141. chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
142. RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
143. chart.setTextAntiAlias(false);
144. chart.setBackgroundPaint(Color.RED);
145. // 设置图标题的字体重新设置title
146. Font font = new Font("宋体", Font.BOLD, 20);
147. TextTitle title = new TextTitle(chartTitle);
148. title.getBackgroundPaint();
149. //设置字体颜色
150. title.setPaint(Color.BLUE);
151. title.setFont(font);
152. chart.setTitle(title);
153. CategoryPlot plot = chart.getCategoryPlot();
154. CategoryAxis valueAxis = plot.getDomainAxis();
155. // 设置x轴上面的字体
156. valueAxis.setTickLabelFont(new Font("宋书", Font.ITALIC, 12));
157. // 设置X轴的标题文字
158. valueAxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 13));
159. //设置主标题
160. TextTitle subtitle = new TextTitle("日时间段访问量对比",new Font("宋体", Font.BOLD, 12));
161. chart.addSubtitle(subtitle);
162. NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
163. // 设置y轴上的字体
164. numberAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 13));
165. // 设置y轴上的标题字体
166. numberAxis.setLabelFont(new Font("黑体", Font.CENTER_BASELINE, 13));
167. // 设置底部的字体
168. chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
169. // 设置面板字体
170. Font labelFont = new Font("SansSerif", Font.TRUETYPE_FONT, 12);
171. chart.setBackgroundPaint(Color.WHITE);
172. CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
173. // x轴 // 分类轴网格是否可见
174. categoryplot.setDomainGridlinesVisible(true);
175. // y轴 //数据轴网格是否可见
176. categoryplot.setRangeGridlinesVisible(true);
177. categoryplot.setRangeGridlinePaint(Color.WHITE);// 虚线色彩
178. categoryplot.setDomainGridlinePaint(Color.WHITE);// 虚线色彩
179. categoryplot.setBackgroundPaint(Color.lightGray);
180. // 设置轴和面板之间的距离
181. // categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
182. CategoryAxis domainAxis = categoryplot.getDomainAxis();
183. domainAxis.setLabelFont(labelFont);// 轴标题
184. domainAxis.setTickLabelFont(labelFont);// 轴数值
185. // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(0.4));
186. domainAxis.setCategoryLabelPositions(CategoryLabelPositions.STANDARD); // 横轴上的
187. // Lable
188. // 45度倾斜
189. // 设置距离图片左端距离
190. domainAxis.setLowerMargin(0.0);
191. // 设置距离图片右端距离
192. domainAxis.setUpperMargin(0.0);
193. NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
194. numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
195. numberaxis.setAutoRangeIncludesZero(true);
196. // 获得renderer 注意这里是下嗍造型到lineandshaperenderer!!
197. LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot.getRenderer();
198. //XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) categoryplot.getRenderer();//改变曲线颜色
199. lineandshaperenderer.setBaseShapesVisible(true); // series 点(即数据点)可见
200. lineandshaperenderer.setBaseLinesVisible(true); // series 点(即数据点)间有连线可见
201. // 显示折点数据
202. lineandshaperenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
203. lineandshaperenderer.setBaseItemLabelsVisible(true);
204. //图片路径
205. FileOutputStream fos_jpg = null;
206. try {
207. isChartPathExist(Savepath());
208. String chartName = Savepath() + charName;
209. fos_jpg = new FileOutputStream(chartName);
210.
211. // 将报表保存为JPG文件
212. ChartUtilities.writeChartAsJPEG(fos_jpg, chart,780, 370);
213.
214. } catch (Exception e) {
215. e.printStackTrace();
216. return null;
217. } finally {
218. try {
219. fos_jpg.close();
220. } catch (Exception e) {
221. e.printStackTrace();
222. }
223. }
224. return chart;
225. }
226.
227.
228.}
Action方法很简单,主要是获得数据集。
Java代码
1.//用户统计
2. public String getstutasCountJFreechart(){
3. // 有序排序
4. LinkedHashMap<String, Object> parameters = new LinkedHashMap<String, Object>();
5. if (StringUtils.isNotBlank(stautsMonth)) {
6. parameters.put("stautsMonth", stautsMonth);
7. }
8. int year = Integer.parseInt(stautsMonth.substring(0, 4));
9. int month =Integer.parseInt(stautsMonth.substring(5, 7));
10. double[][] data = new double[1][5];
11. int i = 0;
12. for (Map.Entry<String, Integer> entry : manager.UserCount(parameters).entrySet()) {
13. String value = entry.getValue().toString();
14. data[0][i++] =Double.parseDouble(value);
15. }
16. /*for (int x = 0; x < data.length; x++) {
17. for (int y = 0; y < data[x].length; y++) {
18. System.out.println(data[x][y]);
19. }
20. }*/
21. String[] rowKeys = { "注册用户统计图" + " " + year +"年"+ month +"月"};
22. String[] columnKeys = { "待激活", "激活", "暂停", "黑名单", "作废" };
23.
24. try {
25. CreateLinechart demo = new CreateLinechart();
26. getResponse().setContentType("image/jpg");
27. chart = demo.createBarChart3D("", "","数量", demo.getBarData(rowKeys, columnKeys,data), "chartStatus.jpg");
28. //chart = demo.createBarChart3D("", "","数量", demo.getBarData(rowKeys, columnKeys,data), PlotOrientation.VERTICAL, true, true, true);
29. ChartUtilities.writeChartAsJPEG(getResponse().getOutputStream(), chart, 780, 370, null);
30. } catch (Exception e) {
31. e.printStackTrace();
32. }
33. return SUCCESS;
34. }
[img]http://dl.iteye.com/upload/attachment/0070/0569/4dedb0ce-941b-3d44-a82f-602beb386725.png[/img]
===================================================================
[size=x-large]实例三[/size]
jFreeChart与Struts2的组合:
一,加入Struts2支持
二,加入struts2-jfreechart-plugin-2.1.6.jar
注意:有的版本的此包有点小问题,此包内有一个struts-plugin.xml内容如下:
Xml代码
1.<struts>
2. <package name="jfreechart-default" extends="struts-default">
3.
4. <result-types>
5. <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult">
6. <param name="height">150</param>
7. <param name="width">200</param>
8. </result-type>
9. </result-types>
10. </package>
11.
12. </struts>
若该package没有继承struts-default则需要手动加上extends="struts-default"再重新用jdk打包
三,在action中生成我们的图片报表
Java代码
1./**
2. * 生成图形报表
3. *
4. * @author 张明学
5. *
6. */
7. @SuppressWarnings("serial")
8. public class ViewResultAction extends ActionSupport {
9.
10. /**
11. * 这里的JFreeChart的变量名称必须是chart(这是jfreeChart插件不足的地方)
12. */
13. private JFreeChart chart = null;
14.
15. private List<String> interest = null;
16.
17. @SuppressWarnings("unchecked")
18. @Override
19. public String execute() throws Exception {
20. ActionContext context = ActionContext.getContext();
21. Map application = context.getApplication();
22.
23. for (String inter : interest) {
24. if (application.get(inter) == null) {
25. application.put(inter, 1);
26. } else {
27. application.put(inter, (Integer) application.get(inter) + 1);
28. }
29. }
30. DefaultCategoryDataset dataset = new DefaultCategoryDataset();
31. dataset.setValue((Integer) application.get("football"), "", "足球");
32. dataset.setValue((Integer) application.get("volleyball"), "", "排球");
33. dataset.setValue((Integer) application.get("basketball"), "", "蓝球");
34. dataset.setValue((Integer) application.get("badminton"), "", "羽毛球");
35. // 设置标题样式
36. chart = ChartFactory.createBarChart3D("兴趣统计结果", "项目", "结果", dataset,
37. PlotOrientation.VERTICAL, true, false, false);
38. chart.setTitle(new TextTitle("兴趣统计结果", new Font("黑体", Font.BOLD, 22)));
39. // 报表中间部分
40. CategoryPlot plot = (CategoryPlot) chart.getPlot();
41. // 设置水平方向的样式
42. CategoryAxis categoryAxis = plot.getDomainAxis();
43. categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 20));
44. categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
45. // 设置垂直方向的样式
46. NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
47. numberAxis
48. .setLabelFont(new Font("仿宋", Font.LAYOUT_NO_LIMIT_CONTEXT, 18));
49. // 获得报表下面部分
50. // chart.getLegend();
51.
52. return SUCCESS;
53. }
54.
55. public List<String> getInterest() {
56. return interest;
57. }
58.
59. public void setInterest(List<String> interest) {
60. this.interest = interest;
61. }
62.
63. public JFreeChart getChart() {
64. return chart;
65. }
66.
67. public void setChart(JFreeChart chart) {
68. this.chart = chart;
69. }
70.
71. }
四,struts.xml中的配置:
Xml代码
1.<struts>
2. <package name="mengya" extends="jfreechart-default">
3. <action name="viewResult" class="com.mengya.action.ViewResultAction">
4. <result name="success" type="chart">
5. <!-- 指定图形报表的大小 -->
6. <param name="height">600</param>
7. <param name="width">800</param>
8. </result>
9. </action>
10. </package>
11. </struts>
注意:由于在第二步的时候将jfreechart-default包继承了struts-default故这里可以直接继承jfreechart-default
这样做的目地是result的type类型为chart,这个类型在struts-default中没有定义,是jreechart-default中定义的
故我们要引入jfreechart-default包,但又要引入struts-default,因此我们可以让jfreechart-default包继承了struts-default。
而在struts.xml中继承jfreechart-default就可以了!
================================================================
[size=x-large]实例四[/size]
struts2 + jfreechart整合:
1、配置环境:
在struts2中,默认的struts-default.xml中,并没有包含chart的result-type,它是插件的形式使用的。
把 struts2的解压包的lib里找到struts2-jfreechart-plugin-2.1.8.1.jar,拷贝到你的项目的 classpath里,
因为这个插件里的文件struts-plugin.xml里有一个chart的result-type。内容如下:
Xml代码
1.<package name="jfreechart-default" extends="struts-default">
2. <result-types>
3. <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult">
4. <param name="height">150</param>
5. <param name="width">200</param>
6. </result-type>
7. </result-types>
8. </package>
同时把jfreechart的库文件jfreechart-1.0.13.jar和jcommon-1.0.16.jar拷贝到你的项目的 classpath里。
2、修改web.xml,增加下面的struts2的配置:
Xml代码
1.<filter>
2. <filter-name>struts2</filter-name>
3. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
4. <init-param>
5. <param-name>struts.i18n.encoding</param-name>
6. <param-value>UTF-8</param-value>
7. </init-param>
8.</filter>
9.
10.<filter-mapping>
11. <filter-name>struts2</filter-name>
12. <url-pattern>/*</url-pattern>
13.</filter-mapping>
3、在src目录下增加新建一个struts.xml配置文件,其主要内容如下:
Xml代码
1.<!--
2. 关于extends继承jfreechart-default这点请大家注意
3. 因为在struts-default这个包里并没有result-type为chart的 chart
4. 定义在前面我们导入的struts2-jfreechart-plugin-2.1.8.jar 下面的struts-plugin.xml文件中
5.-->
6.<package name="jfreechart" extends="jfreechart-default">
7. <action name="jfreechart" class="org.usc.actions.JfreeChartAction">
8. <result name="success" type="chart">
9. <param name="width">600</param>
10. <param name="height">400</param>
11. </result>
12. </action>
13.</package>
4、写测试页面:
Html代码
1.<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2.<%
3.String path = request.getContextPath();
4.String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
5.%>
6.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
7.<html>
8. <head>
9. <base href="<%=basePath%>">
10. <title>jfreechart</title>
11. </head>
12. <body>
13. <img alt="jfreechart" src="jfreechart.action"/>
14. </body>
15.</html>
5、在你的action代码里,返回一个JFreeChart对象即可:
Java代码
1./**
2. * File : JfreeChartAction.java
3. * Author : zqding
4. * Date : 2010-7-27
5. * Version:
6. * Desc :
7. */
8.package org.usc.actions;
9.
10.import org.jfree.chart.ChartFactory;
11.import org.jfree.chart.JFreeChart;
12.import org.jfree.data.general.DefaultPieDataset;
13.
14.import com.opensymphony.xwork2.ActionSupport;
15.
16.public class JfreeChartAction extends ActionSupport {
17. /**
18. * 定义JFreeChart对象 大家请注意在这里JFreeChart对象名只能为chart
19. * 不能是别的, 关于这点大家可以上struts2网站上面查看一下
20. * http://struts.apache.org/2.x/docs/jfreechart-plugin.html
21. */
22. private JFreeChart chart;
23.
24. public JFreeChart getChart() {
25. return chart;
26. }
27.
28. public void setChart(JFreeChart chart) {
29. this.chart = chart;
30. }
31.
32. @Override
33. public String execute() throws Exception {
34. //设置数据
35. DefaultPieDataset data = new DefaultPieDataset();
36. data.setValue("Java", new Double(43.2));
37. data.setValue("Visual Basic", new Double(1.0));
38. data.setValue("C/C++", new Double(17.5));
39. data.setValue("Android", new Double(60.0));
40. //设置字体及生成的图片格式设置略,请参照API文档
41. //生成JFreeChart对象
42. chart = ChartFactory.createPieChart("Programme Language", data, true,true, false);
43. return SUCCESS;
44. }
45.}
6、发布到应用服务器,进行测试。
http://localhost:9090/SSHDemo/jfreechart.jsp