配置一个serverlet然后调用jFreeChart的一个类。
之间需要的jar包包括:
jfreechart-1.0.5.jar
jcommon-1.0.9.jar
gnujaxp.jar
这些开源jar包和JDOC在jfree的主站就能下载得到:
http://www.jfree.org/index.php
但是,这个的帮助文档却是收费的所以一些相关的论坛和比较好的实例网站需要提供两个:
http://www.jfree.org/phpBB2/index.php (这个是jfree自己的论坛,主要是一些bug或者比较难以实现的东西会在这里讨论)
http://www.java2s.com/Code/Java/Chart1.htm (非常全的实例加源代码的网站)
配置文件如下,在web.xml配置文件中加入下的serverlet配置代码:
<
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 > /servletDisplayChart </ url-pattern >
</ servlet-mapping >
< servlet-name > DisplayChart </ servlet-name >
< servlet-class > org.jfree.chart.servlet.DisplayChart </ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > DisplayChart </ servlet-name >
< url-pattern > /servletDisplayChart </ url-pattern >
</ servlet-mapping >
当配置好这些文件后,就可以直接在jsp页面中作实例了(我要做的是一个一时间为X坐标,数字为Y坐标的JFREECHART):
jsp页面中需要加载的JFreeChart的包包括:
<%
...
@ page import="org.jfree.chart.ChartFactory"
%>
<% ... @ page import="org.jfree.chart.JFreeChart" %>
<% ... @ page import="org.jfree.chart.servlet.ServletUtilities" %>
<% ... @ page import="org.jfree.chart.axis.DateAxis" %>
<% ... @ page import="org.jfree.chart.axis.NumberAxis" %>
<% ... @ page import="org.jfree.chart.labels.StandardXYToolTipGenerator" %>
<% ... @ page import="org.jfree.chart.plot.XYPlot" %>
<% ... @ page import="org.jfree.chart.renderer.xy.XYLineAndShapeRenderer" %>
<% ... @ page import="org.jfree.data.time.Hour" %>
<% ... @ page import="org.jfree.data.time.TimeSeries" %>
<% ... @ page import="org.jfree.data.Range" %>
<% ... @ page import="org.jfree.data.time.TimeSeriesCollection" %>
<% ... @ page import="org.jfree.chart.JFreeChart" %>
<% ... @ page import="org.jfree.chart.servlet.ServletUtilities" %>
<% ... @ page import="org.jfree.chart.axis.DateAxis" %>
<% ... @ page import="org.jfree.chart.axis.NumberAxis" %>
<% ... @ page import="org.jfree.chart.labels.StandardXYToolTipGenerator" %>
<% ... @ page import="org.jfree.chart.plot.XYPlot" %>
<% ... @ page import="org.jfree.chart.renderer.xy.XYLineAndShapeRenderer" %>
<% ... @ page import="org.jfree.data.time.Hour" %>
<% ... @ page import="org.jfree.data.time.TimeSeries" %>
<% ... @ page import="org.jfree.data.Range" %>
<% ... @ page import="org.jfree.data.time.TimeSeriesCollection" %>
直接进入程序:
List title2List
=
(List)request.getAttribute(
"
title2List
"
);
//
图表中需要显示的几个数据线的名称
// title2List的结构实例:[日付, 体温, 最大血圧, 最小血圧, 脈拍]除了第一个是x坐标的总称,其它都是数据线的名称
List data2List = (List)request.getAttribute( " data2List " ); // 几个数据线的具体数据
/**/ /*data2List的结构实例:[[06/10, 36, 120, 60, 60], [06/11, 44, 200, 140, 140], [06/12, 36, 120, 60, 60], [06/13, 40, 100, 180, 150], [06/14, , , , ], [06/15, , , , ], [06/16, , , , ], [06/17, , , , ]]结构中第一对应的是日期,其它分别按顺序对应title2List对应的名称*/
String minDate = "" , maxDate = "" ;
// minDate,maxDate为了表格X坐标设置上下限用的
minDate = ((List)data2List.get( 0 )).get( 0 ).toString();
maxDate = ((List)data2List.get(data2List.size() - 1 )).get( 0 ).toString();
TimeSeriesCollection dataset = new TimeSeriesCollection(); // 存储各个数据线坐标数据的数据集
// 数据采集,如果title2List传递过来的有数据,那么给chart添加一个数据线节点集
if (title2List.size() != 1 ) ... {
List tempList = (List)data2List.get(0);
for(int i = 1; i < tempList.size(); i++)...{//按类别生成多个数据集
//生成一个节点集传入命名和节点和节点的最小单位这里是以小时为单位
TimeSeries series = new TimeSeries(title2List.get(i).toString(), Hour.class);
for(int j = 0; j < data2List.size(); j++)...{
List data = (List)data2List.get(j);
int year = 1982;
int month = Integer.parseInt(data.get(0).toString().substring(0,2));
int day = Integer.parseInt(data.get(0).toString().substring(3,5));
if(data.get(i).toString().length() != 0)...{
double dataValue = Double.parseDouble(data.get(i).toString());
Hour hour = new Hour(12,day,month,year);//为节点设置时间点
series.add(hour, dataValue);//添加一个节点
}
}
dataset.addSeries(series);//添加这个节点集到Chart中
}
}
// 生成图表对象
JFreeChart chart = ChartFactory.createTimeSeriesChart( " バイタル " // 图表的名称
, request.getAttribute( " x_axis " ).toString() // X坐标的名称
, request.getAttribute( " y_axis " ).toString() // Y坐标的名称
, dataset // 生成的节点集的集合
, true
, true
, false
);
// 以下是调节图表的一些属性,包括调节上下限,几个节点集对应的线的颜色,还有节点的形状
XYPlot plot = chart.getXYPlot();
// shape the point
if (title2List.size() != 1 ) ... {/**//*如果有数据,那么就让图形里的线显示节点形状和颜色。由于我的数据最多就只有4个线,所以这里只做4个线的设置*/
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
plot.setRenderer(renderer);
renderer.setSeriesPaint(0,Color.BLACK);
renderer.setSeriesPaint(1,Color.BLUE);
renderer.setSeriesPaint(2,Color.RED);
renderer.setSeriesPaint(3,Color.ORANGE);
}
// format the date and range
DateAxis axis_x = (DateAxis) plot.getDomainAxis();
axis_x.setDateFormatOverride( new SimpleDateFormat( " MM/dd " ));
int minYear = 1982 , minMon, minDay,maxYear = 1982 , maxMon, maxDay;
minMon = Integer.parseInt(minDate.substring( 0 , 2 ));
minDay = Integer.parseInt(minDate.substring( 3 , 5 ));
maxMon = Integer.parseInt(maxDate.substring( 0 , 2 ));
maxDay = Integer.parseInt(maxDate.substring( 3 , 5 ));
axis_x.setRange( new Date(minYear - 1900 ,minMon - 1 ,minDay, 0 , 0 , 0 ), new Date(maxYear - 1900 ,maxMon - 1 ,maxDay, 0 , 0 , 0 )); // x坐标线的范围
// range the range axis
NumberAxis axis_y = (NumberAxis) plot.getRangeAxis();
Range range = new Range( 0 , 225 ); // y坐标的范围
axis_y.setRange(range);
// background
chart.setBackgroundPaint(Color.WHITE); // 设置北京颜色或者也可以设置一个背景图片
// 生成Chart的字符串,serverlet解析并且生成一个图片
String filename = ServletUtilities.saveChartAsPNG(chart, 500 , 300 , null , session);
String graphURL = request.getContextPath() + " /servletDisplayChart?filename= " + filename;
// title2List的结构实例:[日付, 体温, 最大血圧, 最小血圧, 脈拍]除了第一个是x坐标的总称,其它都是数据线的名称
List data2List = (List)request.getAttribute( " data2List " ); // 几个数据线的具体数据
/**/ /*data2List的结构实例:[[06/10, 36, 120, 60, 60], [06/11, 44, 200, 140, 140], [06/12, 36, 120, 60, 60], [06/13, 40, 100, 180, 150], [06/14, , , , ], [06/15, , , , ], [06/16, , , , ], [06/17, , , , ]]结构中第一对应的是日期,其它分别按顺序对应title2List对应的名称*/
String minDate = "" , maxDate = "" ;
// minDate,maxDate为了表格X坐标设置上下限用的
minDate = ((List)data2List.get( 0 )).get( 0 ).toString();
maxDate = ((List)data2List.get(data2List.size() - 1 )).get( 0 ).toString();
TimeSeriesCollection dataset = new TimeSeriesCollection(); // 存储各个数据线坐标数据的数据集
// 数据采集,如果title2List传递过来的有数据,那么给chart添加一个数据线节点集
if (title2List.size() != 1 ) ... {
List tempList = (List)data2List.get(0);
for(int i = 1; i < tempList.size(); i++)...{//按类别生成多个数据集
//生成一个节点集传入命名和节点和节点的最小单位这里是以小时为单位
TimeSeries series = new TimeSeries(title2List.get(i).toString(), Hour.class);
for(int j = 0; j < data2List.size(); j++)...{
List data = (List)data2List.get(j);
int year = 1982;
int month = Integer.parseInt(data.get(0).toString().substring(0,2));
int day = Integer.parseInt(data.get(0).toString().substring(3,5));
if(data.get(i).toString().length() != 0)...{
double dataValue = Double.parseDouble(data.get(i).toString());
Hour hour = new Hour(12,day,month,year);//为节点设置时间点
series.add(hour, dataValue);//添加一个节点
}
}
dataset.addSeries(series);//添加这个节点集到Chart中
}
}
// 生成图表对象
JFreeChart chart = ChartFactory.createTimeSeriesChart( " バイタル " // 图表的名称
, request.getAttribute( " x_axis " ).toString() // X坐标的名称
, request.getAttribute( " y_axis " ).toString() // Y坐标的名称
, dataset // 生成的节点集的集合
, true
, true
, false
);
// 以下是调节图表的一些属性,包括调节上下限,几个节点集对应的线的颜色,还有节点的形状
XYPlot plot = chart.getXYPlot();
// shape the point
if (title2List.size() != 1 ) ... {/**//*如果有数据,那么就让图形里的线显示节点形状和颜色。由于我的数据最多就只有4个线,所以这里只做4个线的设置*/
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
plot.setRenderer(renderer);
renderer.setSeriesPaint(0,Color.BLACK);
renderer.setSeriesPaint(1,Color.BLUE);
renderer.setSeriesPaint(2,Color.RED);
renderer.setSeriesPaint(3,Color.ORANGE);
}
// format the date and range
DateAxis axis_x = (DateAxis) plot.getDomainAxis();
axis_x.setDateFormatOverride( new SimpleDateFormat( " MM/dd " ));
int minYear = 1982 , minMon, minDay,maxYear = 1982 , maxMon, maxDay;
minMon = Integer.parseInt(minDate.substring( 0 , 2 ));
minDay = Integer.parseInt(minDate.substring( 3 , 5 ));
maxMon = Integer.parseInt(maxDate.substring( 0 , 2 ));
maxDay = Integer.parseInt(maxDate.substring( 3 , 5 ));
axis_x.setRange( new Date(minYear - 1900 ,minMon - 1 ,minDay, 0 , 0 , 0 ), new Date(maxYear - 1900 ,maxMon - 1 ,maxDay, 0 , 0 , 0 )); // x坐标线的范围
// range the range axis
NumberAxis axis_y = (NumberAxis) plot.getRangeAxis();
Range range = new Range( 0 , 225 ); // y坐标的范围
axis_y.setRange(range);
// background
chart.setBackgroundPaint(Color.WHITE); // 设置北京颜色或者也可以设置一个背景图片
// 生成Chart的字符串,serverlet解析并且生成一个图片
String filename = ServletUtilities.saveChartAsPNG(chart, 500 , 300 , null , session);
String graphURL = request.getContextPath() + " /servletDisplayChart?filename= " + filename;
在页面中显示的生成的图片方法是:
<
img
src
="<%=graphURL%>"
width
=500
height
=300
border
=0
usemap
="#<%=filename%>"
>
以上,就是我这次timer遇到的jsp端的chart生成和显示。