Struts2.1.6+在convention下集成JFreeChart的配置 博客分类: JavaEE jfreechartStrutsmavenApacheXML
最近太忙了,还是更新下吧。
struts2.1增加了插件struts2-convention-plugin来实现零配置,下面就记录下在convention下如何集成JFreeChart。
说明:如果对convention的配置没有了解,我毛遂自荐下这篇文章作为参考:
http://javeye.iteye.com/blog/358744
1.添加JFreeChart
maven代码:
<dependency> <groupId>jfree</groupId> <artifactId>jfreechart</artifactId> <version>1.0.12</version> </dependency>
2.添加Struts对JFreeChart的插件支持
众所周知,Struts2要使用JFreeChart需要struts2-jfreechart-plugin插件。maven代码:
<dependency> <groupId>org.apache.struts</groupId> <artifactId>struts2-jfreechart-plugin</artifactId> <version>2.1.6</version> </dependency>
这里用的是2.1.6。
3.核心哦,集成
3.1.起冲突了
(1) 用winrar打开struts2-jfreechart-plugin-2.1.6.jar,可以看见有一个名为struts-plugin.xml的配置文件,打开该文件,可以看见如下代码:
<package name="jfreechart-default" extends="struts-default"> <result-types> <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"> <param name="height">150</param> <param name="width">200</param> </result-type> </result-types> </package>
可以看见这段代码定义了一个名为jfreechart-default的package,它继承了struts-default。
(2) 再打开struts2-convention-plugin-2.1.6.jar中的struts-plugin.xml,它定义了一个名为convention-default的 package ,同样继承了struts-default.
<package name="convention-default" extends="struts-default"> </package>
我们知道,packege可以继承一个父类的package,可是这两个玩意居然继承的是同一个package:struts-default。他俩成了兄弟关系。问题来了,如果struts要利用convention来实现零配置,则在struts.xml中需要做如下配置:
<constant name="struts.convention.default.parent.package" value="convention-default" />
这里,value的值可以使convention-default,也可以是convention-default的子类(暂且这么叫吧),也就是说,要想用convention插件,必须使用conve-default或者它的子类作为package,否则没门!完了,完了,要集成JFreeChart需要用到jfreechart-default这个package,他和convention-default是兄弟关系,可怎么揉到一起呢?
3.2 搞定冲突
想想思路吧,恩,仔细看看freechart-default这个package的定义:
<package name="jfreechart-default" extends="struts-default"> <result-types> <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"> <param name="height">150</param> <param name="width">200</param> </result-type> </result-types> </package>
其实它只是在package中定义了一个result-type,除此之外,并没有特别之处。我们知道,result type定义了返回的类型,这里定义了一个名为chart的result type,指定的类是org.apache.struts2.dispatcher.ChartResult,这个类的作用很简单,就是将JFreeChart对象的图片转换成OutputStream输出到界面,也即是所有的JFreeChart对象需要这个类的处理才能输出。另外还有两个参数:height,width,他们分别指定了输出图片的高度和高度。当然,你也可以自己实现org.apache.struts2.dispatcher.StrutsResultSupport来定义自己的ChartResult.
扯远了,来直接的,jfreechart-default不就定义了一个struts-default没有的result type吗?我把这个result type的拷贝下来,给convention-default一份就ok了。convention-default的定义已经在struts2-convention-plugin-2.1.6.jar中的struts-plugin.xml写死了,所以在struts.xml需要定义一个convention-default的子类package,在这个子类package中来增加result type:
<package name="convention-jfreechart" extends="convention-default"> <result-types> <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"> <param name="height">150</param> <param name="width">200</param> </result-type> </result-types> </package>
这样,convention-jfreechart这个package就同时有了convention-default和jfreechart-default的特性了。
然后修改
<constant name="struts.convention.default.parent.package" value="convention-jfreechart" />
说到这里,说到这里,很多人都明白完了,我还是继续罗嗦……
3.3 指定方法的返回类型
上面都说了,JFreeChart生成后,需要返回ChartResult类进行处理,以OutputStream的方式输出到界面上,所以如果某个方法的功能是生成JFreeChart的图片,则方法生成JFreeChart对象后,需要将指定该方法的返回类型为convention-jfreechart中定义的chart类型。
都知道@Result这个注释吧?那还等什么呢?
@Results( { @Result(name = "chartComplete", type="chart") }) public class JFreeChartAction extends ActionSupport { ……………… public String createpie() { 生成JFreeChart对象 return "chartComplete"; } ……………… }
上面代码的意思是,对ceatepie方法,指定生成JFreeChart对象后的返回值为“chartComplete”,而Action的头部,定义了“chartComplete”的返回类型为“chart”。
如上面的,调用/j-free-chart!createpie.action,则返回的就是生成的图片。
需要说明的是,本文未对JFreeChart本身做过多的论述,要了解JFreeChart的东东,您google下,收获肯定不小哦