`
wanglihu
  • 浏览: 918442 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江
社区版块
存档分类

jFreeChart连接oracle数据库数据实现顺序图,饼形图和柱状图

阅读更多
首先:准备jFreeChart.jar包,并加到/WEB-INF/lib目录下。
其次:在web.xml配置文件中加入下列东东:
<!-- 配置jFreeChart -->
<servlet>
        <servlet-name>DisplayChart</servlet-name>
        <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
    </servlet>
<servlet-mapping>
        <servlet-name>DisplayChart</servlet-name>
        <url-pattern>/servlet/DisplayChart</url-pattern>
    </servlet-mapping>
第三:建立数据表:
总结报告(zjbg)
表结构描述
描述 名称 类型           可空          备注(P为主键)
报告编号 zjbgid Number(10)      Not null           P
执行时间 Zxsj Date        Not null
发送数量 fssl Number(10) Null
失效数量 sxsl Number(10) Null
备注 bz Varchar2(1000) Null
第四:现在的要求是要查询出从执行起始时间到中终止时间段内每日的失效率;
先写一个查询界面select.jsp如下:
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<html>
<script language="javascript" src="js/PopupCalendar.js"></script>
<script>
var oCalendarChs=new PopupCalendar("oCalendarChs"); //初始化控件时,请给出实例名称:oCalendarChs
oCalendarChs.weekDaySting=new Array("日","一","二","三","四","五","六");
oCalendarChs.monthSting=new Array("一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月");
oCalendarChs.oBtnTodayTitle="今天";
oCalendarChs.oBtnCancelTitle="取消";
oCalendarChs.Init();
</script>
<script type="text/javascript">
  function click_Submit(){
var tem1 = document.zjbgForm.startTime.value;
var tem2 = document.zjbgForm.endTime.value;
    if(tem1==""){
      alert("请输入起始时间");
      return ;
    }if(tem2==""){
      alert("请输入终止时间");
      return ;
    }
    if(compareDate(tem1,tem2)==1){ 
            alert(tem1+"-"+tem2+":起始时间要小于等于终止时间");
    return false;  
    }else{
       document.zjbgForm.submit();
   return true;
}
}
function compareDate(beginip1,endip){
var beginip=beginip1;
if(beginip!="" && endip!=""){
var bgn=beginip;
var end=endip;
if(bgn==end)
return 0;
var tmpnum1="";
var tmpnum2="";
//判断起始date1小于等于终止date2
for(var i=0;i<4;i++){
var index1=bgn.indexOf("-");
var index2=end.indexOf("-");
    var  tmp1;
var  tmp2;
if(-1!=index1){
tmp1 = bgn.substring(0,index1);
tmp2 = end.substring(0,index2);
bgn=bgn.substring(index1+1,bgn.length);
end=end.substring(index2+1,end.length);
}else{
tmp1=bgn.substring(0,bgn.length);
tmp2=end.substring(0,end.length);
        }
tmpnum1=tmpnum1+tmp1;
tmpnum2=tmpnum2+tmp2;
}
if(1==compInteger(tmpnum1,tmpnum2)){
return 1;
}
   }
    if(beginip!="" && endip==""){
   return 1;
  }
   if(beginip=="" && endip!=""){
   return 1;
   }
return 0;
}  
function  compInteger(strValue1, strValue2){
    var  nValue1, nValue2 ;
      //判断第一个参数的有效性
      if (fucCheckNUM(strValue1) == 0)
        return -1 ;
//判断第二个参数的有效性
      if (fucCheckNUM(strValue2) == 0)
            return -2 ;
      //转换后比较
      nValue1 = parseInt(strValue1) ;
      nValue2 = parseInt(strValue2) ;
      if (nValue1 == nValue2){
        return 0 ;
        }
        if (nValue1 < nValue2){
         return 2 ;
        }
        if (nValue1 > nValue2){
        return 1 ;
        }
}
function fucCheckNUM(NUM){
    var i,j,strTemp;
    strTemp="0123456789.";
    if ( NUM.length == 0) return 0;
    for (i=0;i<NUM.length;i++){
    j = strTemp.indexOf(NUM.charAt(i));
    if (j==-1){
    return 0;
    }
    }
    return 1;
}
  </script>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>时间查询页面</title>
</head>
<body>
<html:form action="/zjbgTimeSeriesChart.do" method="post">
<table width="100%" border="0" align="center" bgcolor="98B6E8"
style='font-size: 12px'>
<tr>
<td height="25" colspan="3" background="images/btbjs.gif">
<div align="center" class="t0bt">
<strong>总结报告</strong>
</div>
</td>
</tr>
<tr bgcolor="#EFF6FE" class="t01">
<td>
执行时间范围:
</td>
<td bgcolor="#FFFFFF">
<html:text property="startTime" readonly="true"
onclick='getDateString(this,oCalendarChs)' />
-
<html:text property="endTime" readonly="true"
onclick='getDateString(this,oCalendarChs)' />
</td>
<td bgcolor="#FFFFFF">
<img src="images/search.gif" style="cursor: hand;" border="0"
onclick="click_Submit()">
<IMG src="images/reset.gif" style="cursor: hand;" border="0"
onClick="zjbgForm.reset()">
</td>
</tr>
</table>
</html:form>
</body>
</html>
第五:在struts-config.xml配置文件中加入:
<!-- 配置总结报告zjbgForm-->
<form-bean name="zjbgForm"
         type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="zjbgId" type="java.lang.Integer" />
<form-property name="startTime" type="java.lang.String" />
<form-property name="endTime" type="java.lang.String" />
         <form-property name="fssl" type="java.lang.Integer" />
         <form-property name="sxsl" type="java.lang.Integer" />
         <form-property name="bz" type="java.lang.String" />
</form-bean>

<action path="/zjbgTimeSeriesChart"
             type="com.wanglihu.action.ZjbgTimeSeriesChartAction"
             name="zjbgForm"
             scope="request">   
         <forward name="chartForward"   path="/report/chart.jsp"/>         
     </action>
第六:建立com.wanglihu.action.ZjbgTimeSeriesChartAction.java类
public class ZjbgTimeSeriesChartAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
String status="chartForward";
String  startTime=request.getParameter("startTime");
String  endTime=request.getParameter("endTime");
ZjbgDAO  zjbgDao=new ZjbgDAO();
int sjjgs=zjbgDao.getTimesjByStartOrEndTime(startTime, endTime);
List<Zjbg> list=new ArrayList<Zjbg>();
if(sjjgs<0&&sjjgs>31){
System.out.println("您只能查询间隔一个月的失效数据!");
}
//时间向后退
for(int i=0;i<=sjjgs;i++){
//从起始执行时间每增加一天得到的时间-SQL
String sql="select to_date('"+startTime+"','yyyy-mm-dd')+"+i+" as zxsj from dual";
//从起始执行时间每增加一天得到的时间
String zxsj=zjbgDao.getZxsjBySql(sql);
//查询某一天具体时间内总失效数量和发送数量,以及失效率
Zjbg zjbg=zjbgDao.getZjbgByTime(zxsj);
list.add(zjbg);
}
request.setAttribute("ZJBGLIST", list);
request.setAttribute("STARTTIME", startTime);
request.setAttribute("ENDTIME", endTime);
return mapping.findForward(status);
}
}
第七:新建Zjbg.java
public class Zjbg {
private double sxl;
private int sxsl;
private int fssl;
private String zxsj;
public double getSxl() {
return sxl;
}
public void setSxl(double sxl) {
this.sxl = sxl;
}
public int getSxsl() {
return sxsl;
}
public void setSxsl(int sxsl) {
this.sxsl = sxsl;
}
public int getFssl() {
return fssl;
}
public void setFssl(int fssl) {
this.fssl = fssl;
}
public String getZxsj() {
return zxsj;
}
public void setZxsj(String zxsj) {
this.zxsj = zxsj;
}
}
第八:新建ZjbgDAO.java
/**
* 查询两个日期之差多少个整数天
*/
public int getTimesjByStartOrEndTime(String startTime, String endTime) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
int sjjgs = 0;
String sql = "select trunc(to_date('" + endTime
+ "','yyyy-mm-dd hh24:mi:ss'))-trunc(to_date('" + startTime
+ "','yyyy-mm-dd hh24:mi:ss')) as sjjgs from dual";
try {
con = DBconn.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
sjjgs = rs.getInt("sjjgs");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (Exception e) {
}
}
return sjjgs;
}

/**
* 根据sql语句的参数查询某一时间第二天为哪一天并转换为String类型返回
*/
public String getZxsjBySql(String sql) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String zxsj = null;
try {
con = DBconn.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
while (rs.next()) {
zxsj = rs.getDate("zxsj").toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (Exception e) {
}
}
return zxsj;
}

/**
* 查询某一天具体时间内总失效数量和发送数量,以及失效率
*/
public Rwbg getZjbgByTime(String zxsj) {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Zjbg zjbg= new Zjbg();
String sql = "select sum(sxsl) as sxsl ,sum(fssl) as fssl from zjbg where to_char(zxsj,'yyyy-mm-dd')='"
+ zxsj + "'";
try {
con = DataBase.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
zjbg.setZxsj(zxsj);
zjbg.setSxsl(rs.getInt("sxsl"));
zjbg.setFssl(rs.getInt("fssl"));
if (rs.getInt("fssl") != 0) {
          zjbg.setSxl((double) rs.getInt("sxsl")/ rs.getInt("fssl"));
}
} else {
zjbg.setZxsj(zxsj);
zjbg.setSxsl(0);
zjbg.setFssl(0);
zjbg.setSxl(0);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (Exception e) {
}
}
return zjbg;
}
}
最后,新建/report/chart.jsp生成曲线图如下:
<%@ page contentType="text/html;charset=GBK"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>

<%@ page import="java.awt.*,java.text.SimpleDateFormat,javax.swing.JPanel,org.jfree.chart.ChartFactory,org.jfree.chart.ChartPanel,org.jfree.chart.JFreeChart,org.jfree.chart.axis.DateAxis,org.jfree.chart.plot.XYPlot,org.jfree.chart.renderer.xy.XYItemRenderer,org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,org.jfree.data.time.*,org.jfree.data.time.TimeSeries,org.jfree.data.time.TimeSeriesCollection,org.jfree.data.xy.XYDataset"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities,org.jfree.chart.axis.NumberAxis,org.jfree.chart.axis.ValueAxis"%>
<%@ page import="org.jfree.chart.axis.DateTickUnit"%>
<%@ page import = "org.jfree.ui.RectangleInsets,org.jfree.chart.title.TextTitle,java.text.NumberFormat"%>
<%@ page import = "java.util.ArrayList,com.wanglihu.vo.Zjbg,java.util.List,com.wanglihu.dao.ZjbgDAO,org.jfree.chart.labels.StandardPieToolTipGenerator,org.jfree.chart.axis.DateTickMarkPosition,java.sql.*,java.util.Iterator,java.util.Date,org.jfree.chart.title.LegendTitle,org.jfree.chart.axis.NumberTickUnit"%>
<%
List<Zjbg> list=(ArrayList)request.getAttribute("ZJBGLIST");
if(list!=null&&list.size()>0){ %>
<%
String startTime=(String)request.getAttribute("STARTTIME");
String endTime=(String)request.getAttribute("ENDTIME");
int startyears=Integer.parseInt(startTime.substring(0,4));
int startmonths=Integer.parseInt(startTime.substring(5,7));
int startdays=Integer.parseInt(startTime.substring(8,10));
String startYearAndMonthAndDay=startyears+"年"+startmonths+"月"+startdays+"日";
int endyears=Integer.parseInt(endTime.substring(0,4));
int endmonths=Integer.parseInt(endTime.substring(5,7));
int enddays=Integer.parseInt(endTime.substring(8,10));
String endYearAndMonthAndDay=endyears+"年"+endmonths+"月"+enddays+"日";
Iterator<Zjbg> iterator=list.iterator();
//设置曲线
TimeSeries mytimeseries = new TimeSeries("失效率",Day.class);
//从数据库中取值,数据和时间
while(iterator.hasNext()){
double sxl=0D;
Zjbg zjbg=iterator.next();
String zxsj=zjbg.getZxsj();
sxl=zjbg.getSxl();
//从yyyy-MM-dd
int year=Integer.parseInt(zxsj.substring(0,4));
int month=Integer.parseInt(zxsj.substring(5,7));
int day=Integer.parseInt(zxsj.substring(8,10));
mytimeseries.add(new Day(day,month,year),sxl);
}
//连接曲线
TimeSeriesCollection dataset = new TimeSeriesCollection();
dataset.addSeries(mytimeseries);
//x轴上的刻度点默认为时间段,设为true时代表的是时间点
dataset.setDomainIsPointsInTime(true);
String domain="("+startYearAndMonthAndDay+"-->"+endYearAndMonthAndDay+")"+"失效率之曲线图";
//设置曲线图
XYDataset xydataset = (XYDataset) dataset;
JFreeChart chart = ChartFactory.createTimeSeriesChart("",           //图表标题
  "报告执行时间", //目录轴的显示标签
  "失效率",      //数值轴的显示标签
  xydataset,    //数据集
  true,         //是否显示图例
  true,         //是否生成工具
  false );      //是否生成url链接
//设置图表对象的标题
chart.setTitle(new TextTitle(domain,new Font("幼圆",Font.PLAIN,24)));
//设置曲线图背景色
chart.setBackgroundPaint(Color.DARK_GRAY);//.decode("#98B6E8")
//取得统计图表的第一个图例
LegendTitle legend=chart.getLegend(0);
//修改图例的字体
legend.setItemFont(new Font("方正舒体",Font.HANGING_BASELINE,14));
//取得时间顺序图的Plot对象,即来得到所有数据点的集合
XYPlot plot = (XYPlot) chart.getPlot();
//取得X轴
DateAxis  categoryAxis =(DateAxis)plot.getDomainAxis();
//是否显示正向箭头
categoryAxis.setPositiveArrowVisible(true);
//x轴单位间隔为1天
categoryAxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));
//设置横轴显示标签的字体,坐标轴标题字体
categoryAxis.setLabelFont(new Font("隶书",Font.BOLD,18));
SimpleDateFormat format1 = new SimpleDateFormat("dd日");
//设置x轴数据单位以×月×日方式显示
categoryAxis.setDateFormatOverride(format1);
//取得Y轴
NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
//设置纵轴显示标签的字体
numberAxis.setLabelFont(new Font("隶书",Font.BOLD,18));
//y轴单位间隔为2%
numberAxis.setTickUnit(new NumberTickUnit(0.02D));
//是否显示正向箭头
numberAxis.setPositiveArrowVisible(true);
//设置y轴以百分比方式显示
NumberFormat format =NumberFormat.getPercentInstance();
numberAxis.setNumberFormatOverride(format);
//数据轴上的显示最小值5%
numberAxis.setLowerBound(-0.050D);


XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();
//设置曲线是否显示数据点
xylineandshaperenderer.setBaseShapesVisible(false);
//设置第一条曲线数据点填充为红色,如果一个图表有多条曲线可分别设置
xylineandshaperenderer.setSeriesFillPaint(0, Color.YELLOW);
//设置网格背景颜色
plot.setBackgroundPaint(Color.black);
//设置网格竖线颜色
plot.setDomainGridlinePaint(Color.green);
//设置网格横线颜色
plot.setRangeGridlinePaint(Color.green);
//设置曲线图与xy轴的距离,即曲线与xy轴贴近的距离
plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 0D));
String filename = ServletUtilities.saveChartAsPNG(chart, 820, 520, null, session);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;

%>

<img src="<%= graphURL %>" border=0 usemap="#<%= filename %>">
<%} %>

之此,没有将DataBase.java的类贴上来,这是一个完成与数据库连接的类,每个人可以根据自己的实际情况设计此类,另外,本人将本实例所用到的PopupCalendar.js文件和jFreeChart.jar等jar包提供给读者下载使用。
分享到:
评论
3 楼 wanghonghui023 2011-02-28  
麻烦楼主,发我一份,我想模拟跑一下,amama_110@yahoo.com.cn  谢啦
2 楼 vzhchv0010 2009-07-16  
麻烦您也给我发一份吧,我想琢磨下从数据库通过框架最后到页面的过程,麻烦您PopupCalendar.js发下这个,或者一个完整的小例子给我可以么?我的邮箱是jinli212133@yahoo.com.cn 先谢谢你了.
1 楼 fanning 2008-11-17  
PopupCalendar.js没发出来吗,能给我邮箱发一份吗,我邮箱是fanning1983@163.com,多谢啊多谢

相关推荐

    jfreechart柱状图、饼形图、折线图源码

    JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的2D图表,包括柱状图、饼形图和折线图。在这个压缩包文件中,包含的是基于JFreeChart库的源码示例,用于帮助理解和应用这些图表类型。下面我们将深入...

    Jfreechart连接接数据库.doc

    在使用JFreeChart进行数据可视化时,连接数据库是获取数据并生成图表的关键步骤。JFreeChart是一个强大的Java库,能够创建各种类型的图表,包括柱状图、折线图、饼图等。以下是如何使用JFreeChart连接MySQL数据库并...

    jfreechart时序图 连接数据库实例

    本实例展示了如何结合JFreeChart和数据库,实现实时或历史数据的时间序列图。通过理解JFreeChart的API和JDBC的工作原理,开发者可以创建出更加复杂的可视化应用,更好地理解和解释数据的变化趋势。对于初学者,这是...

    JFreeChart 饼图、柱状图 例 (含数据库)

    JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的图表,包括饼图、柱状图等,并且能够与数据库进行交互,为数据分析和可视化提供便利。在这个MyEclipse项目中,你将找到如何利用JFreeChart来实现这些...

    JFreeChart画图 饼状图 单组柱状图 多组柱状图 堆积柱状图 折线图

    JFreeChart 饼状图 柱状图 柱状图 堆积柱状图 折线图 这个是我特地开发的一个用JFreeChart开发的用来画图的项目,已经开发成形了各种项目的各种需求的项目,并且自己可以拓展,根据需求修改代码,完成项目的需要。 ...

    jfreechart实现柱状图排序

    根据提供的信息,我们可以总结出以下关于...综上所述,虽然 JFreeChart 可能没有直接提供柱状图排序的功能,但通过自定义数据处理和图表创建过程,完全可以实现这一需求。这种灵活性也是 JFreeChart 的一大优势所在。

    jfreechart 堆栈柱状图跟折线图结合拼接

    jfreechart 堆栈柱状图跟折线图结合拼接 jar包请戳http://download.csdn.net/detail/a156435646/7424707

    利用JFreeChart 实现柱状图,饼图,时序图,折线图等

    在Java编程环境中,JFreeChart库是一个非常强大的工具,它允许开发者轻松地创建各种图表,如柱状图、饼图、时序图和折线图等。这些图表在数据分析、报表展示以及各种可视化应用中非常常见。下面我们将详细介绍如何...

    jfreechart 生成折线图,饼图,柱状图,堆栈柱状图

    JFreeChart是一个流行的Java库,用于生成各种类型的图表,包括折线图、饼图和柱状图,甚至堆栈柱状图。这个压缩包中的"CreateChartServiceImpl.java"文件很可能包含了一个实现这些功能的服务类。 首先,我们要理解...

    jfreechart数据库连接.pdf

    【JFreeChart数据库连接】是关于使用JFreeChart库与Oracle数据库进行交互,展示数据库数据的图表化方法。JFreeChart是一个用Java编写的开源库,它提供了丰富的图表类型,如饼图、条形图、面积图、折线图、柱状图、...

    jfreechart 绘制横向立体柱状图

    利用jfreechart绘制的横向立体柱状图,横坐标是数值,纵坐标是数据分类,需要提前引入jfreechart包文件到工程里,才不会报错

    JFreeChart动态加载柱状图

    JFreeChart创建柱状图,之前网上很多都是创建柱状图的,静态的。数据更新之后柱状图随之改变,代码实现详见附件代码。所需要的jar包是jfreechart-1.0.13.jar,gnujaxp.jar,jcommon-1.0.16.jar

    饼形图、柱形图实例 jfreechart (Java)

    在Java编程环境中,JFreeChart库是一个非常强大的工具,它允许开发者创建各种类型的图表,包括饼形图和柱形图,这些图表广泛应用于数据分析、报表生成以及可视化展示。本实例将详细探讨如何利用JFreeChart在Java项目...

    柱状图 圆饼图 曲线图 struts2.0 jfreechart

    JFreeChart则是一个强大的Java图表库,能够生成多种类型的图表,包括柱状图、圆饼图和曲线图,非常适合在数据可视化应用中使用。在Struts2.0中集成JFreeChart,可以为Web应用程序添加丰富的图形展示功能,让数据以...

    java制作jfreechart柱状图 饼状图 折线图

    Java中的JFreeChart库是一个强大的工具,用于生成各种类型的图表,包括柱状图、饼状图和折线图。在本教程中,我们将深入探讨如何使用JFreeChart创建这些图表,以及如何用随机生成的数据作为数据源。 首先,...

    JFreeChart生成3D饼状图及柱状图

    JFreeChart是一款强大的Java图表库,它允许开发者创建多种类型的2D和3D图表,包括折线图、柱状图、饼状图、散点图等,并且支持自定义样式和颜色,使得数据可视化变得更加直观和生动。在这个特定的场景中,我们将关注...

    jfreechart柱状图

    JFreeChart 是一个流行的开源 Java 图形库,它提供了丰富的图表类型,包括柱状图、饼图、线图、散点图等,广泛应用于数据分析、报告生成以及可视化应用中。这个压缩包提供的源代码示例,展示了如何使用 JFreeChart ...

Global site tag (gtag.js) - Google Analytics