欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Struts2.1.6+在convention下集成JFreeChart的配置 博客分类: JavaEE jfreechartStrutsmavenApacheXML 

程序员文章站 2024-02-21 18:17:46
...

最近太忙了,还是更新下吧。

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下,收获肯定不小哦