一般系统的分析模块都比较多的运用图示的展示,这样让用户一目了然。jfeechart是用java写的开源的作图的工具。很多的模块都用到了作图,所以说一个通用的图示自动生成的工具就很方便。基于java的b/s架构的软件中写一个自定义标签来自动根据传入的数据生成图示则尤为方便。
本文则给大家一个这样的实例或设计思路,希望各位提出更好的意见。
思路:当一个request请求一个分析的action的时候,action会把分析的结果setAttribute到页面,此时封装作图所用的数据。在jsp页面中在图片的位置写上自定义的标签,自定义标签的处理类会解析标签并保存标签的信息到session中。并输出以下代码:
即该页面会请求一个路径为chart的servlet,而该servlet则运用工厂模式调用GraphFactory的静态chartFactory方法得到具体哪种图片的生成类,返回的类型是一个抽象类,实际是某一种图示的实现类,再调用该类的gender()方法得到一个JFreeChart对象,通过工具类ChartUtilities转换成图片即可。
下面是具体的代码:
沿着刚才的思路,首先必须有一个标签的tld文件,如下:
其中tableID是必填的,他也是action中保存保存到session中的数据的name。
对应的tag的解析类如下:
该类把session中存放的数据即一些配置信息封装成了一个chartBean对象放在session中,并在页面上写上一个servlet请求。
下面分别是chartBean类和servlet:
在servlet中首先调用工厂类GraphFactory得到一个所有图示的抽象类GraphGeneration,该抽象类的运用了模板方法模式,他把一些作图的公用的方法写在了自己的实现里,把具体到某一种图个性的设置写在了具体的子类里。
GraphGeneration代码如下:
GraphGeneration类的饼状图PieGraphGeneration的实现代码如下:
可以看出,他的个性代码只有很短的几行,大部分设置都写在了抽象类GraphGeneration里。
抽象的模板类GraphGeneration的gender()方法除了调用子类的chartGender(dataset)方法外,还有一个要说明的是:
作图一般分两步,首先得到数据源,即dataset,其次生成jfreechart对象。生成jfreechart对象上面已经提到过首先用工厂方法模式生成一个抽象的图片生成类,但其实际是具体的某一个图片生成类的实例。生成dataset也可以类似设计,首先调用工厂DatasetFactory的datasetFactory方法得到一个抽象类DatasetGeneration,但其实他是指向一个具体的实现类的。该类也一样,使用模板方法模式,把一些公用的方法写在自己的类中,把一些个性的内容写在子类里。
思路和部分代码都有了,大家不妨可以在自己的项目中一试。