前言
???? 关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐:
- ?
- struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目录下),非常全面,直接部署就可以了(很多朋友Struts2能学很好我估计还是直接从这里学来的)。
- wiki-WebWork:入了门的朋友应该都知道,strust2由webwork2和struts1.x合并起来的,但主要还是以webwork2为主,所以如果找不到Struts2的资料可以找WebWork资料看看。
- Max On Java的博客,他的博客的资料在中文的Struts2算是比较全的了,写得很详细。
- 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
<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>
<!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>
????"-//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>
???????2. 新建JFreeChartAction继承ActionSupport,生成JFreeChart对象并保存到chart中,注意这个名称是固定的。
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);
????????
????????return?SUCCESS;
????}
????public?JFreeChart?getChart()?{
????????return?chart;
????}
????public?void?setChart(JFreeChart?chart)?{
????????this.chart?=?chart;
????}
}
OK!至此代码已经全部贴完。
输入访问 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action
显示结果如下:
补充
????以上生成的图片是PNG格式的图片,如果需要自定义图片格式的话(好像只能支持JPG和PNG格式),那么自己写一个ChartResult继承自StrutsResultSupport,见代码:
?
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:
????"-//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!显示的效果是一样的,只是图片格式不一样,当然这里面你可以做更多操作!
?