如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!
一 Jfreechart制作图表概述
1 Jfreechart概述
Jfreechart对中文支持的不太好!并且,字体也不太清楚
2 Jfreechart下载
3 Jfreechart体验
4 本系统柱状图的示例
监管单位可以统计出哪个地区的采购金额最高:
5 本系统饼图的示例
统计百分比的占用情况:
6 本系统折线图的示例
药品金额走势图:
二 jfreechart柱形图的开发和测试
1将jfreechart的jar加入本工程
jcommon-1.0.23.jar :是jfreechart公用的类库,
jfreechart-1.0.19.jar: 是jfreechart的图表类库!
把这两个文件加入到本工程中即可!
因为本工程是一个Maven工程,因此还需要在工程的pom.xml中添加maven的3坐标,如下:
坐标配置好后,再保存后,在联网的情况下会自动把这两个jar包下载到maven的仓库repositories中,如下图:
2 需求
是本系统所要实现的,如下:
3 使用jfreechart生成柱状图的编码
3.1 开发步骤
第1步:使用工具类构造一个CategoryDataset,往该dataset中填充统计数据!
dataset中填充统计数据的方式有两种:
第1种方式:定义一个二维数组的数据格式来作为填充的数据。
参考如下方法:
该方式对应需求中的图如下:
第2种方式:也可以通过jfreechart的API来进行数据的填充(常用,也是本系统中所使用的方式),
参考如下方法:
其中:第一个参数表示统计的数值,第二个参数表示统计的指标名称,第三个参数表示统计分类!
在下节的“使用jfreechart的servlet方式输出图形”的内容中会使用该方法!该方式也是本系统所使用的方式。
该方式对应需求中的图如下:
当然,数组中的数据应该是从数据库中来获取。这里只是一个测试demo
这两种方式都是通过dataset来构造数据,效果是一样的!第二种方式比较常用,因为更直观!
实际的开发中,正是通过第二种方式来从数据库中获取方式,再通过for循环来填充数据(参考下节的内容)!
第2步:使用ChartFactory.createBarChart3D()方法来生成柱状图形
第3步:输出图形
图形的输出方式有两种:
1) 通过response方式来输出(也是下节的代码测试所使用的方式),如下:
该方式简便!
2) 在session中生成图形,然后在通过jfreechart的servlet来显示图形(常用的方式,也是本系统所采用的方式,
在下节中“通过jfreechart的servlet方式来输出图形”中会讲到)
3.2 代码测试
先登录系统,然后在浏览器中输入:http://localhost/yycgproject/jfreechartest/chart1.action
会显示如图:
乱码问题在下节中会解决!因为Jfreechart对中文支持的不太好!并且,字体也不太清楚!
其实,这部分即使注释掉也可以在浏览器中正确的输出,如下代码:
其实,总共就3步,注释掉的代码只是用来对输出的图形进行优化而已!
4 通过jfreechart的servlet方式来输出图形(重点)
在上面“输出图形”一节中,使用的是第一种方式来输出的图形。
下面需要使用第2方式输出图形,并且要结合dataset的第2种构造方式来填充数据!
这也是本系统实现的方式!
第1步:在web.xml中配置jfreechart的servlet,如下:
第2步:将图形放在sesion,得到filename。
参考JfreeChart.java类中的如下方法:
在该方法中使用的是第二种方式来构造的dataset,参考源码!
然后,在该方法中使用如下的方式来将图形存入session中:
第3步:返回chart2.jsp页面,
第4步:在chart2.jsp页面中通过jfreechart的servlet来生成图形。
chart2.jsp页面参考项目中的源码,该页面最终呈现的效果是:
查询条件和图形可以在浏览器中共存!
其中的关键代码如下:
filename参数是不能变的,这是该方式所必需有的参数!
第5步,测试:
在本系统登录,如下;
在地址栏中访问url:http://localhost/yycgproject/jfreecharttest/chart2.action,
最终的结果如下图:
可以改进的地方:在采购时间的条件中可以选择在某一个时间段中的药品金额的汇总
5 jfreechart柱状图二
该柱状图与上面的柱状图的区别,就是有一个图例:红的表示内科用药,蓝色表示外科用药。
代码实现其实跟上面的开发步骤类似,步骤如下:
第1步:构造一个CategoryDataset,往该dataset中填充统计数据!
也有两种方式:
第一种方式:定义一个二维数组的数据格式来作为填充的数据,如下:
第二种方式:也可以通过jfreechart的API来进行数据的填充,如下:
三 按区域分类统计采购金额的实现
1 需求
注意:该功能必须以卫生局身份登录系统,因为该功能就是为卫生局而设计的!
根据页面中输入框中的查询条件,按区域来统计采购金额。
最终呈现的原型效果图如下:
2 dao
根据查询条件,把统计出来的结果数据填充到jfreechart的dataset中!
2.1 编写sql
按区域统计采购金额。因为根据数据库中查询出来的结果只有两个镇,所以柱状图只有两个镇,如果有3个镇,那么柱状图就显示3个镇,总之,
我们的目标是:查询出交易明细列表中的不同的区域中每个区域的采购金额!
最后,把统计出来的结果数据填充到jfreechart的dataset中
Sql语句如下:sql语句是可以优化的!
--查询出卫生室所属区域(所属镇)的名称
select yybusiness.areaname, sum(yybusiness.cgje) cgje
from (select yybusiness.*,
(select bss_sys_area.areaname
from bss_sys_area
where yybusiness.parentid = bss_sys_area.areaid) areaname
from (select yybusiness.*,
(select bss_sys_area.parentid
from bss_sys_area
where areaid = yybusiness.useryydq) parentid
from (select yybusiness.useryyid,
(select dq
from useryy
where id = yybusiness.useryyid) useryydq,
yybusiness.cgje
from (
select useryy.id useryyid,
useryy.mc useryymc,
yycgd.bm yycgdbm,
yycgd.id yycgdid,
usergys.id usergysid,
usergys.mc usergysmc,
yycgdmx.ypxxid,
ypxx.id,
ypxx.bm,
ypxx.mc,
ypxx.jx,
ypxx.gg,
ypxx.zhxs,
ypxx.scqymc,
ypxx.spmc,
ypxx.jyzt,
(select info
from dictinfo
where ypxx.jyzt = dictcode
and typecode = '003') jyztmc,
(select info
from dictinfo
where typecode = '011'
and dictcode = yycgdmx.cgzt) cgztmc,
yycgdmx.cgl,
yycgdmx.cgje,
yycgdmx.rkl,
yycgdmx.rkje,
yycgdmx.thl,
yycgdmx.thje,
yycgdmx.jsl,
yycgdmx.jsje
from yybusiness2018 yycgdmx,
yycgd2018 yycgd,
useryy,
usergys,
ypxx
where yycgdmx.yycgdid = yycgd.id
and yycgd.useryyid = useryy.id
and yycgdmx.usergysid = usergys.id
and yycgdmx.ypxxid = ypxx.id) yybusiness) yybusiness) yybusiness) yybusiness
group by areaname
该语句最终在数据库中查询出来的结果集如下:
2.2 自定义mapper映射文件
在YybusinessMapperCustom.xml中添加如下:
同时要在输出映射resultType所对应的扩展类YycgdmxCustom中添加areaname属性,如下:
2.3 自定义mapper接口
因为需要的仅仅是展示的图形,不需要分页,在YybusinessMapperCustom接口中添加一个方法即可:
3 service
因为需要的仅仅是展示的图形,不需要分页,在BusinessService接口中添加如下方法:
BusinessServiceImpl实现类中添加如下:
4 action
参考”jfreechart的servlet方式来输出图形”一节中JFreechart.java中的第2个方法中的代码!
在TjAction中添加如下方法:
5 groupbyarea.jsp页面
groupbyarea.jsp页面参考“jfreechart的servlet方式来输出图形”一节中的chart2.jsp页面。
页面所在目录如下:
页面中需要注意的地方:
第1个:添加查询事件,如下:
第2个:统计的url,如下:
6 测试
在menu.json中添加链接,如下:
必须以卫生局身份登录系统,因为该功能就是为卫生局而设计的,如下:
显示结果如下:
该页面只是显示了有采购金额的镇,而没有采购金额或者采购金额为0的镇没有显示,所以很丑陋啊,可以进行下面的优化!
7 优化
针对生成的柱状图中没有采购金额或者采购金额为0的镇,该如何在图中显示呢?
Sql语句如下:其他的自定义mapper接口和mapper映射文件自己实现.
select areainfo.areaname ,nvl(yybusiness.cgje,0) cgje from ( select bss_sys_area.areaname,0 cgje from bss_sys_area where bss_sys_area.arealevel='2' ) areainfo left join ( select yybusiness.areaname, sum(yybusiness.cgje) cgje from (select yybusiness.*, (select bss_sys_area.areaname from bss_sys_area where yybusiness.parentid = bss_sys_area.areaid) areaname from (select yybusiness.*, (select bss_sys_area.parentid from bss_sys_area where areaid = yybusiness.useryydq) parentid from (select yybusiness.useryyid, (select dq from useryy where id = yybusiness.useryyid) useryydq, yybusiness.cgje from (
select useryy.id useryyid, useryy.mc useryymc, yycgd.bm yycgdbm, yycgd.id yycgdid, usergys.id usergysid, usergys.mc usergysmc, yycgdmx.ypxxid, ypxx.id, ypxx.bm, ypxx.mc, ypxx.jx, ypxx.gg, ypxx.zhxs, ypxx.scqymc, ypxx.spmc,
ypxx.jyzt,
(select info from dictinfo where ypxx.jyzt = dictcode and typecode = '003') jyztmc, (select info from dictinfo where typecode = '011' and dictcode = yycgdmx.cgzt) cgztmc, yycgdmx.cgl, yycgdmx.cgje, yycgdmx.rkl, yycgdmx.rkje, yycgdmx.thl, yycgdmx.thje, yycgdmx.jsl, yycgdmx.jsje
from yybusiness2018 yycgdmx, yycgd2018 yycgd, useryy, usergys, ypxx where yycgdmx.yycgdid = yycgd.id and yycgd.useryyid = useryy.id and yycgdmx.usergysid = usergys.id and yycgdmx.ypxxid = ypxx.id) yybusiness) yybusiness) yybusiness) yybusiness group by yybusiness.areaname
) yybusiness on yybusiness.areaname = areainfo.areaname |