- 浏览: 702030 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- 系统架构设计 (16)
- java collection framework (2)
- java分布式 (4)
- java多线程 (0)
- 故障处理及调优 (16)
- 软件开发过程及管理 (28)
- OS (5)
- 常用算法 (3)
- design pattern (8)
- transaction (7)
- java apps (48)
- corejava (7)
- java and DB (10)
- cache (0)
- webservice (14)
- web前端 (25)
- 报表 (4)
- 日志系统设计 (3)
- Oracle (4)
- mysql (11)
- xml (11)
- 数据源配置管理 (3)
- 企业数据存储 (4)
- php (2)
- 测试 (1)
最新评论
-
orangebook:
对于初学者来说,这样编写可能会误导,理解更烦锁。
观察者模式(发布-订阅) -
liudajiang:
呵呵 startThreads(rand ...
实践缩小Java synchronized 粒度 -
zengwenbo5566:
谢谢博主,学习了
解决getOutputStream() has already been called for this response -
u011335423:
大神厉害啊 可以了
解决getOutputStream() has already been called for this response -
xiang37:
...
解决getOutputStream() has already been called for this response
最近项目中报表数据的图表展示采用了FusionCharts,功能需求如下:
1.提供在线flash图表展示。
2.根据周期性报表的数据,生成静态html文件,提供用户订阅。
功能实现思路:
1.对于提供在线flash图表展示,主要参考了FusionCharts的文档示例,具体实现可见下面实例。注意一点:
因为生成xml文件会增加磁盘IO操作,会降低图表生成功能的整体性能,所以对于用户请求返回页面呈现chart的需求,采取不生成xml数据文件的方式。在default.jsp中包含PieData.jsp,由PieData.jsp生成数据流,在default.jsp中输出渲染为swf图表。
2.根据需求从DB中获取所需数据。
2.1生成data.xml数据文件.
2.2生成html文件,组装显示所需的文件,例如:FusionCharts.js,对应的swf等。
2.3生成需求规定的文件目录结构,将html及相关文件分别放到指定的位置。
由于FusionCharts的示例中太多的逻辑采用了jsp来获取或者生成,所以对它进行了简单的封装,目的是方便项目组其他人对FusionCharts的使用。
效果图:
示例:
1.FusionCharts图表展示
采用了jsp中生成data.xml的方式。
default.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="org.apache.commons.logging.Log"%> <%@page import="org.apache.commons.logging.LogFactory"%> <%@page import="com.test.FusionChartUtil"%> <%@page import="com.test.FusionChartsDTO"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ include file = "../Includes/FusionCharts.jsp" %> <HTML> <HEAD> <TITLE>3D饼图</TITLE> <link rel="stylesheet" type="text/css" href="<%=path%>/css/st/css.css" /> <link rel="stylesheet" type="text/css" href="<%=path%>/css/st/home.css" /> <SCRIPT LANGUAGE="Javascript" SRC="<%=basePath%>FusionCharts/FusionCharts.js"></SCRIPT> <style type="text/css"> <!-- body { font-family: Arial, Helvetica, sans-serif; font-size: 12px; } .text{ font-family: Arial, Helvetica, sans-serif; font-size: 12px; } --> </style> </HEAD> <BODY> <CENTER> <h2>查询表TAB_OMIN_ST_G_SDATAAREA_H</h2> <% Log logger = LogFactory.getLog(getClass()); String animate = (String)request.getAttribute("animate"); String dataPath = path +"/jsp/st/bs/DB_dataURL/PieData.jsp?animate="+ animate; String swfPath = path +"/FusionCharts/Pie3D.swf"; logger.info("^^^^^^^^^^^^^^^^^^^^^^^^^ dataPath = "+ dataPath); FusionChartsDTO fusionCharts = new FusionChartsDTO(); fusionCharts.setStrDataURL(dataPath); fusionCharts.setAddNoCacheStr("false"); fusionCharts.setResponse(response); fusionCharts.setSwfURL(swfPath); fusionCharts.setDataURL("dataPath"); fusionCharts.setChartId("FactorySum"); fusionCharts.setChartWidth(600); fusionCharts.setChartHeight(300); fusionCharts.setDebugMode(false); fusionCharts.setRegisterWithJS(false); String chartCode = FusionChartUtil.genChart(fusionCharts); out.print(chartCode); out.print("<p><p>"); out.print((String)request.getAttribute("tableData")); %> <BR> <BR> </CENTER> </BODY> </HTML>
PieData.jsp
参考FusionCharts的jsp示例
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <%@ page import="java.io.*"%> <%@ page import="com.test.PieChartXmlDataProvider"%> <% String strXML=""; //Default.jsp has passed us a property animate. We request that. String animateChart; animateChart = request.getParameter("animate"); //Set default value of 1 if(null==animateChart||animateChart.equals("")){ animateChart = "1"; } String strQuery = "select I_CITY_NAME,sum(I_FACTSTA_TIMES) as FACTSTA_TIMES from tab_omin_st_g_sdataarea_h group by I_CITY_NAME"; strXML = new PieChartXmlDataProvider().getXmlData(animateChart,strQuery,"dataURL"); //logger.info("^^^^^^^^^^^^^^^^^^^^^^^^^ pieData strXML = "+ strXML); //Set Proper output content-type //解决中文乱码问题 response.setContentType( "text/xml; charset=UTF-8" ); OutputStream outs = response.getOutputStream(); outs.write( new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF} ); outs.write(strXML.getBytes("UTF-8")); outs.flush(); outs.close(); outs = null; response.flushBuffer(); out.clear(); out = pageContext.pushBody(); %>
PieChartXmlDataProvider.java
数据查询类,返回组装数据的<chart/>标签
public class PieChartXmlDataProvider extends AbsChartXmlDataProvider{ private static Logger logger = Logger.getLogger(PieChartXmlDataProvider.class); public String getXmlData(String animateChart,String sql,String getDataType){ String cityName = ""; String rightRate = ""; StringBuffer dataBuffer = new StringBuffer(""); dataBuffer.append("<chart caption='example' subCaption='Sum I_RIGHT_RATE by city' pieSliceDepth='30' " + "showBorder='1' formatNumberScale='0' numberSuffix=' Units'"); if(getDataType.equals(BsConstants.DATA_TYPE_DATA_URL)){ dataBuffer.append("animation=' " + animateChart + "'>"); }else if(getDataType.equals(BsConstants.DATA_TYPE_DATA_XML)){ dataBuffer.append(">"); } try{ DAO dao = BF.getDAO(); List<Map> rsList = dao.executeQuery(sql,"查询数据"); for (Map map : rsList) { cityName = (String)map.get("I_CITY_NAME"); rightRate = ((BigDecimal)map.get("FACTSTA_TIMES")).toString(); //logger.info("^^^^^^^^^^^^^^^^^^^^^^^^^ cityName = "+ cityName); //logger.info("^^^^^^^^^^^^^^^^^^^^^^^^^ rightRate = "+ rightRate); dataBuffer.append("<set label='" + cityName + "' value='" +rightRate+ "' />"); } dataBuffer.append("</chart>"); logger.info("^^^^^^^^^^^^^^^^^^^^^^^^^ pieData strXML = "+ dataBuffer.toString()); }catch (Exception e) { e.printStackTrace(); } return dataBuffer.toString(); } }
FusionChartUtil.java
生成html文件util类
import javax.servlet.http.HttpServletResponse; public class FusionChartUtil { /** * 生成FusionCharts图 * @param fusionCharts * @return */ public static String genChart(FusionChartsDTO fusionCharts) { String strDataURL = fusionCharts.getStrDataURL() == null ? "" : fusionCharts.getStrDataURL(); String addNoCacheStr = fusionCharts.getAddNoCacheStr() == null ? "" : fusionCharts.getAddNoCacheStr(); String swfPath = fusionCharts.getSwfURL() == null ? "" : fusionCharts.getSwfURL(); String strXML = fusionCharts.getDataXML() == null ? "" : fusionCharts.getDataXML(); String chartId = fusionCharts.getChartId() == null ? "" : fusionCharts.getChartId(); int chartWidth = fusionCharts.getChartWidth() <= 0 ? 600 : fusionCharts.getChartWidth(); int chartHeight = fusionCharts.getChartHeight() <= 0 ? 300 : fusionCharts.getChartHeight(); String encodeDataURL = encodeDataURL(strDataURL,addNoCacheStr,fusionCharts.getResponse()); return createChart(swfPath,encodeDataURL,strXML,chartId,chartWidth,chartHeight, fusionCharts.isDebugMode(),fusionCharts.isRegisterWithJS()); } /** * Encodes the dataURL before it's served to FusionCharts. * If you have parameters in your dataURL, you necessarily need to encode it. * @param strDataURL - dataURL to be fed to chart * @param addNoCacheStr - Whether to add aditional string to URL to disable caching of data * @return */ public static String encodeDataURL(String strDataURL, String addNoCacheStr, HttpServletResponse response) { String encodedURL = strDataURL; //Add the no-cache string if required if (addNoCacheStr.equals("true")) { /*We add ?FCCurrTime=xxyyzz If the dataURL already contains a ?, we add &FCCurrTime=xxyyzz We send the date separated with '_', instead of the usual ':' as FusionCharts cannot handle : in URLs */ java.util.Calendar nowCal = java.util.Calendar.getInstance(); java.util.Date now = nowCal.getTime(); java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat( "MM/dd/yyyy HH_mm_ss a"); String strNow = sdf.format(now); if (strDataURL.indexOf("?") > 0) { encodedURL = strDataURL + "&FCCurrTime=" + strNow; } else { strDataURL = strDataURL + "?FCCurrTime=" + strNow; } encodedURL = response.encodeURL(strDataURL); } return encodedURL; } /** * Creates the Chart HTML+Javascript to create the FusionCharts object with the given parameters. * This method uses JavaScript to overcome the IE browser problem with SWF wherein you have to 'Click to activate' the control * @param chartSWF - SWF File Name (and Path) of the chart which you intend to plot * @param strURL - If you intend to use dataURL method for this chart, pass the URL as this parameter. Else, set it to "" (in case of dataXML method) * @param strXML - If you intend to use dataXML method for this chart, pass the XML data as this parameter. Else, set it to "" (in case of dataURL method) * @param chartId - Id for the chart, using which it will be recognized in the HTML page. Each chart on the page needs to have a unique Id. * @param chartWidth - Intended width for the chart (in pixels) * @param chartHeight - Intended height for the chart (in pixels) * @param debugMode - Whether to start the chart in debug mode * @param registerWithJS - Whether to ask chart to register itself with JavaScript */ public static String createChart(String chartSWF, String strURL, String strXML, String chartId, int chartWidth, int chartHeight, boolean debugMode, boolean registerWithJS) { StringBuffer strBuf = new StringBuffer(); /* First we create a new DIV for each chart. We specify the name of DIV as "chartId"Div. DIV names are case-sensitive. */ strBuf.append("<!--START Script Block for Chart -->\n"); strBuf.append("\t\t<div id='" + chartId + "Div' align='center'>\n"); strBuf.append("\t\t\t\tChart.\n"); /*The above text "Chart" is shown to users before the chart has started loading (if there is a lag in relaying SWF from server). This text is also shown to users who do not have Flash Player installed. You can configure it as per your needs.*/ strBuf.append("\t\t</div>\n"); /*Now, we render the chart using FusionCharts Class. Each chart's instance (JavaScript) Id is named as chart_"chartId".*/ strBuf.append("\t\t<script type='text/javascript'>\n"); //Instantiate the Chart Boolean registerWithJSBool = new Boolean(registerWithJS); Boolean debugModeBool = new Boolean(debugMode); int regWithJSInt = boolToNum(registerWithJSBool); int debugModeInt = boolToNum(debugModeBool); strBuf.append("\t\t\t\tvar chart_" + chartId + " = new FusionCharts('" + chartSWF + "', '" + chartId + "', '" + chartWidth + "', '" + chartHeight + "', '" + debugModeInt + "', '" + regWithJSInt + "');\n"); //Check whether we've to provide data using dataXML method or dataURL method if (strXML.equals("")) { strBuf.append("\t\t\t\t//Set the dataURL of the chart\n"); strBuf.append("\t\t\t\tchart_" + chartId + ".setDataURL(\"" + strURL + "\");\n"); } else { strBuf.append("\t\t\t\t//Provide entire XML data using dataXML method\n"); strBuf.append("\t\t\t\tchart_" + chartId + ".setDataXML(\"" + strXML + "\");\n"); } strBuf.append("\t\t\t\t//Finally, render the chart.\n"); strBuf.append("\t\t\t\tchart_" + chartId + ".render(\"" + chartId + "Div\");\n"); strBuf.append("\t\t</script>\n"); strBuf.append("\t\t<!--END Script Block for Chart-->\n"); return strBuf.substring(0); } /** * Creates the Chart HTML to embed the swf object with the given parameters * @param chartSWF - SWF File Name (and Path) of the chart which you intend to plot * @param strURL - If you intend to use dataURL method for this chart, pass the URL as this parameter. Else, set it to "" (in case of dataXML method) * @param strXML - If you intend to use dataXML method for this chart, pass the XML data as this parameter. Else, set it to "" (in case of dataURL method) * @param chartId - Id for the chart, using which it will be recognized in the HTML page. Each chart on the page needs to have a unique Id. * @param chartWidth - Intended width for the chart (in pixels) * @param chartHeight - Intended height for the chart (in pixels) * @param debugMode - Whether to start the chart in debug mode */ public String createChartHTML(String chartSWF, String strURL, String strXML, String chartId, int chartWidth, int chartHeight, boolean debugMode) { /*Generate the FlashVars string based on whether dataURL has been provided or dataXML.*/ String strFlashVars = ""; Boolean debugModeBool = new Boolean(debugMode); if (strXML.equals("")) { //DataURL Mode strFlashVars = "chartWidth=" + chartWidth + "&chartHeight=" + chartHeight + "&debugMode=" + boolToNum(debugModeBool) + "&dataURL=" + strURL + ""; } else { //DataXML Mode strFlashVars = "chartWidth=" + chartWidth + "&chartHeight=" + chartHeight + "&debugMode=" + boolToNum(debugModeBool) + "&dataXML=" + strXML + ""; } StringBuffer strBuf = new StringBuffer(); // START Code Block for Chart strBuf.append("\t\t<!--START Code Block for Chart-->\n"); strBuf .append("\t\t\t\t<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0' width='" + chartWidth + "' height='" + chartHeight + "' id='" + chartId + "'>\n"); strBuf.append("\t\t\t\t <param name='allowScriptAccess' value='always' />\n"); strBuf.append("\t\t\t\t <param name='movie' value='" + chartSWF + "'/>\n"); strBuf.append("\t\t\t\t<param name='FlashVars' value=\"" + strFlashVars + "\" />\n"); strBuf.append("\t\t\t\t <param name='quality' value='high' />\n"); strBuf .append("\t\t\t\t<embed src='" + chartSWF + "' FlashVars=\"" + strFlashVars + "\" quality='high' width='" + chartWidth + "' height='" + chartHeight + "' name='" + chartId + "' allowScriptAccess='always' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' />\n"); strBuf.append("\t\t</object>\n"); // END Code Block for Chart strBuf.append("\t\t<!--END Code Block for Chart-->\n"); return strBuf.substring(0); } /** * Converts boolean to corresponding integer * @param bool - The boolean that is to be converted to number * @return int - 0 or 1 representing the given boolean value */ public static int boolToNum(Boolean bool) { int num = 0; if (bool.booleanValue()) { num = 1; } return num; } }
FusionCharts中文处理:
jsp方式:
response.setContentType( "text/xml; charset=UTF-8" ); OutputStream outs = response.getOutputStream(); outs.write( new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF} );//UTF-8 BOM outs.write(strXML.getBytes("UTF-8"));//数据 outs.flush(); outs.close(); outs = null; response.flushBuffer(); out.clear(); out = pageContext.pushBody();
java类生成xml数据文件
FileOutputStream out = new FileOutputStream(file,true); out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});//UTF-8 BOM out.write(content.getBytes(charset));//数据 out.close();
评论
12 楼
yjkun
2012-08-29
你好 请问下3d饼图的图例可以显示不?
11 楼
zghblyldb
2012-06-14
zghblyldb 写道
zghblyldb 写道
liweijie20054 写道
你好,我做的3D饼图提示的那个信息只显示数字,比如你那显示的是“北京市: 292Units”,而我做的饼图提示只是“292Units”,没有“北京市:”,请问这个属性是怎么改,谢谢了哈
set label=设置这个可以了
set label=
“set label=”
10 楼
zghblyldb
2012-06-14
zghblyldb 写道
liweijie20054 写道
你好,我做的3D饼图提示的那个信息只显示数字,比如你那显示的是“北京市: 292Units”,而我做的饼图提示只是“292Units”,没有“北京市:”,请问这个属性是怎么改,谢谢了哈
set label=设置这个可以了
set label=
9 楼
zghblyldb
2012-06-14
liweijie20054 写道
你好,我做的3D饼图提示的那个信息只显示数字,比如你那显示的是“北京市: 292Units”,而我做的饼图提示只是“292Units”,没有“北京市:”,请问这个属性是怎么改,谢谢了哈
set label=设置这个可以了
8 楼
charles751
2012-04-13
shxtyu 写道
楼主,能不能介绍下饼图每个模块与其对应的数据之间的这个指示线是怎么做出来 的,或者说是有什么属性吗?
是fusionchart自带的属性,具体试哪个我记不清了,不过你只要看下它的例子代码就知道了。
7 楼
shxtyu
2012-04-12
楼主,能不能介绍下饼图每个模块与其对应的数据之间的这个指示线是怎么做出来 的,或者说是有什么属性吗?
6 楼
charles751
2011-11-04
我的理解:饼图是根据饼各部分的比例来绘制的,各部分显示的大小又它们所占比例的大小决定,和各部分显示的说明文字无关。
5 楼
liweijie20054
2011-11-03
主要是把最左边和最右边字体的宽度算进去了,把“重庆市: 100Units”算进去了
4 楼
liweijie20054
2011-11-03
那个提示的信息我改好了,现在又有一个问题。就是修改饼图大小的那个参数把提示信息字体的长度都算进去了,就是把"北京市: 292Units"的长度也算进去了。我一个页面中有三个3D饼图,这样虽然我把饼图大小参数写的是一样的,但是由于提示信息长度不一样,那三个饼的大小也不一样。我想知道怎么修改饼的大小,不包括字体的长度。不知道我说明白没
3 楼
charles751
2011-11-01
下面这句在FusionCharts中解析为显示“北京市”的.
dataBuffer.append("<set label='" + cityName + "' value='" +rightRate+ "' />");
dataBuffer.append("<set label='" + cityName + "' value='" +rightRate+ "' />");
2 楼
liweijie20054
2011-11-01
你好,我做的3D饼图提示的那个信息只显示数字,比如你那显示的是“北京市: 292Units”,而我做的饼图提示只是“292Units”,没有“北京市:”,请问这个属性是怎么改,谢谢了哈
1 楼
hncdcsm1
2011-03-31
可以把这个工程打包上传么??
相关推荐
本文将深入探讨如何使用Java实现FusionCharts图表的导出功能,包括导出为图片和PDF文件。 首先,要实现这个功能,你需要在项目中引入FusionCharts的Java库。FusionCharts提供了Java SDK,通过它我们可以与...
例如,Column3D.swf用于创建3D柱状图,Pie3D.swf则用于生成3D饼图。这些SWF文件包含了绘制特定图表所需的图形元素和动画效果。用户需要下载并引用相应的SWF文件,确保用户的浏览器安装了Adobe Flash Player插件来...
创建一个基本的FusionCharts图表,需要以下步骤: 1. 准备数据:数据可以以XML或JSON格式存储。例如: ```xml 销售报告" subCaption="2019年" numberPrefix="$"> 产品A" value="12000" /> 产品B" value="18000" /...
FusionCharts 参数及功能特性详解实例 FusionCharts 是一款功能强大且灵活的图表工具,可以帮助开发者快速创建各种类型的图表,如折线图、柱状图、饼图等。通过设置不同的参数,可以实现图表的高度自定义,满足不同...
1. **图表类型**:FusionCharts支持多种图表类型,如条形图、折线图、饼图、散点图、雷达图、甘特图等,每种图表都有其特定的应用场景和数据表示方式。 2. **数据格式**:FusionCharts支持XML、JSON和纯JavaScript...
使用`FusionCharts()`函数创建图表实例,然后调用`render()`方法将其渲染到指定的DOM元素上。 6. **图表导出**: FusionCharts提供了一个`exportChart()`方法,用于将当前图表导出为图片。你需要指定导出的格式、...
3. **交互性**:FusionCharts图表具有良好的交互性,用户可以通过鼠标悬停、点击图表元素来获取详细信息或触发特定事件。例如,可以通过点击饼图的扇区来高亮显示相关数据。 4. **自定义选项**:FusionCharts提供了...
在这个实例中,我们将深入探讨如何利用FusionCharts与asp.net和SQL Server相结合,来从数据库中获取数据并生成图表。 首先,`FusionCharts` 是一个基于JavaScript的图表解决方案,提供了超过90种不同类型的图表,...
在"fusionCharts效果图"这个压缩包中,包含了各种类型的图表实例,这些实例不仅展示了FusionCharts的基本功能,还展示了其在复杂场景下的应用。通过查看这些效果,开发者可以直观地了解FusionCharts如何处理大数据、...
FusionCharts提供了一系列丰富的图表类型,如柱状图、饼图、线图、组合图等,适用于各种业务场景。它支持多种数据源,包括JSON、XML等,使得数据展示灵活且易于集成。在本实例中,我们将利用XML数据源与数据库连接,...
在这个文件中,你可以看到如何配置和初始化FusionCharts实例,以及如何绑定数据到图表上。 2. **export-handlers**:这部分包含用于图表导出的功能。FusionCharts Suite XT支持将图表导出为多种格式,如PNG、JPEG、...
FusionCharts是一款强大的JavaScript图表库,它提供了丰富的图表类型,如柱状图、饼图、线图、散点图、地图等,适用于数据可视化的需求。本资料包包含了FusionCharts的源码和多种设计实例,旨在帮助开发者快速理解和...
1. **FusionCharts介绍**:FusionCharts是一款基于Web的图表组件,它使用JavaScript和SVG(可缩放矢量图形)技术来生成2D和3D图表。这款工具支持多种图表类型,如柱状图、线图、饼图、地图等,适用于各种数据分析和...
3. **初始化图表**:使用`FusionCharts`构造函数创建一个新的图表实例,传入ID(对应HTML元素)和配置数据: ```javascript var chart = new FusionCharts({ type: 'column2d', // 图表类型 renderAt: 'chart-...
通过这种方式,XML数据源使得FusionCharts图表的创建变得更加灵活和便捷。开发者可以根据需求自由调整XML文件中的数据,而无需修改前端代码。同时,由于XML文件是文本格式,因此易于阅读和编辑,也方便与其他工具...
6. **响应式设计**:理解如何使FusionCharts图表适应不同屏幕尺寸,实现响应式布局。 7. **集成进项目**:学习如何将FusionCharts集成到现有的Web应用中,如ASP.NET、PHP、Java等服务器端平台。 8. **性能优化**:...
- 初始化图表:使用JavaScript代码创建图表实例,并设置图表的类型、尺寸、标题等属性。 - 渲染图表:绑定数据源并绘制图表。 总之,这个示例项目为你提供了一个FusionCharts的实践平台,你可以通过学习和修改...
- **丰富的图表库**:除了基础的饼图、柱状图和折线图,FusionCharts 还提供了地图、甘特图、雷达图、散点图等多种图表,满足多元化需求。 - **高度自定义**:颜色、样式、动画效果等都可定制,确保图表与品牌形象...