在JSP中利用JFreechart生成各種圖表


  一個java新手編寫web網頁時遇到一個問題,就是取出數據庫里的某個表的內容並將其生成柱狀圖或者折線圖,這突然就比較迷茫,不知應該怎樣完成,但靜下心來想了想思路,首先我應該知道要生成圖表有哪些路可尋,通過上網發現了大神總結的心得如下(原文):

https://blog.csdn.net/happylee6688/article/details/26960729

  • ChartDirector
  ChartDirector 是一款商業的圖表庫,有多種語言的版本,支持的版本有有.NET,ASP/COM/VB,JSP/Java,CodeFusion,PHP,Perl,Ruby,C++等。ChartDirector圖表工具尤其適合用於Web及嵌入式應用程序開發。使用它做的圖表非常的精細漂亮,雖然是商業圖表,但其收費並不算貴,當然,如果你不想花錢購買,它也提供了免費版本,但在生成的圖表上會出現logo信息。不過,網上還是有很多的破解方法的,很簡單。
  ChartDirector 插件使用方便,快捷,靈活,功能強大,交互性強。在Web服務器以及嵌入式應用程序開發中,它是一種非常理想的工具,擁有豐富的圖表圖形組件庫。支持多種圖表樣式,如圓形圖表(餅形圖),圓環圖,柱形圖(條形圖),直線圖,曲線圖,梯形線圖,趨勢線圖,曲線擬合圖,線間色圖,區域圖,泡沫圖等等。采用多線程結構,特別應用於具有高性能要求的服務器端應用程序開發,擁有基於API(應用編程接口)的對象,允許用戶控制和定制圖表細節,從而設計出用戶滿意的圖表。
  ChartDirector 對中文的支持也是很不錯的,出現的問題很容易解決,網上都有解決方案。此外,ChartDirector 提供的源碼中,jsp的demo也是比較簡單的,你只需要改一下數據,馬上就可以呈現出你想要的效果。而且還備有英文的文檔,文檔中提供了源代碼的說明,對於開發人來說還是很方便的。就我個人來說,我還是很喜歡這一款插件的,圖形種類繁多,樣式漂亮,而且上手也很簡單。
  • JScharts 
  JScharts 是一個用來在瀏覽器上直接繪制圖表的JavaScript工具包。支持柱狀圖,圓餅圖以及簡單的曲線圖。直接將這個庫插入網頁,然后從 XML 文件或 JavaScript 數組變量調用數據。
JSCharts 的特點是,它不需要任何服務端的插件和模塊,是純JavaScript組件,它是一款商業軟件,但提供了免費的版本(含有水印)。如要刪除水印,需要一個域密鑰。正常情況下,JScharts是不支持中文的,不過在網上找到一個解決方案,可以試一下, 點擊這里 。
  • JFreeChart
  JFreeChart 是一個開源的Java項目,它主要用來開發各種各樣的圖表,這些圖表包括,餅形圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。在這些不同樣式的圖表上可以滿足目前商業系統的要求。
  JFreeChart是一種基於Java語言的圖表開發技術,可以用於Servlet、JSP、Applet、Java Application 環境中,通過JDBC可動態顯示任何數據庫數據,結合ltext可以輸出至PDF文件。JFreeChart 畫出來的圖形不夠精細,看起來有些模糊,圖表的文字邊緣、顏色和顏色的分界也比較模糊。JFreeChart 對中文的支持不是很好,雖然有字體的解決辦法,但仍然存在問題。它使用的默認字體顯示出來的中文會很模糊,你可能需要修改源代碼。
 
  對比這三款Java圖表插件,ChartDirector 提供的圖形樣式是最多的,也是最漂亮的,畢竟是商業軟件,對於另外兩種還是有一些優勢的。雖然免費版本的圖表會有logo信息,不過對於這個網上有解決方案,可以去掉logo。對開發人員來說,ChartDirector 提供了很多的Demo和文檔,足夠開發人員學習和使用了。
  JScharts 也提供了一些日常常用的圖形樣式,包括柱狀圖、餅形圖等等。而且它提供的樣式也還是不錯的。雖然JScharts 不需要任何服務端的插件和模塊,但是對Web前端的JavaScript有一定的要求,不了解JavaScript的開發者是沒辦法使用的。當然,如果了解JavaScript的話,使用JScharts開發圖表還是很簡單的。
  JFreeChart 也提供了一些日常常用的圖形樣式,只不過它只支持java語言,在易用性方面還是很簡單的。樣式方面也還是可以的。雖然JFreeChart的文檔要收費,但好在國內還有很多人在使用JFreeChart,網上可以找到很多相關的使用教程。JFreeChart的缺陷就是只適合生成圖片,而且文字、圖片都不是特別清晰,還需要進行一些調整。////////
  因為是java開發web 所以決定學習JFreeChart ,步驟:
一:Jfreechart下載,下載地址: http://sourceforge.net/projects/jfreechart/files/ 下載 jfreechart-1.0.19.zip , 解壓后從lib文件下找出jfreechart.jar和jcommon.jar這倆個來復制(其它干什么的不清楚)粘貼到WEB-INF\lib下即可
二:編寫代碼

<%@ page pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ page import="java.awt.Color,
org.jfree.chart.ChartFactory,
org.jfree.chart.JFreeChart,
org.jfree.chart.plot.PlotOrientation,
org.jfree.chart.servlet.ServletUtilities,
org.jfree.data.category.CategoryDataset,
org.jfree.data.general.*,
org.jfree.chart.plot.CategoryPlot,
org.jfree.chart.axis.CategoryAxis,
org.jfree.chart.axis.ValueAxis,
org.jfree.chart.renderer.category.BarRenderer3D,
org.jfree.chart.urls.StandardCategoryURLGenerator,
org.jfree.chart.*,
org.jfree.chart.entity.*,
org.jfree.chart.labels.*,
org.jfree.chart.axis.CategoryLabelPositions,
java.awt.Font,
java.awt.GradientPaint,
org.jfree.ui.TextAnchor,
org.jfree.chart.axis.NumberAxis,
org.jfree.chart.axis.NumberTickUnit
"%>
<%@ page import="org.jfree.data.general.DefaultPieDataset"%>
<%@ page import="org.jfree.data.category.CategoryDataset" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.JFreeChart"%>
<%@ page import="org.jfree.chart.plot.PiePlot"%>
<%@ page import="org.jfree.chart.ChartRenderingInfo"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
<%@ page import="org.jfree.chart.encoders.SunPNGEncoderAdapter"%>
<%@ page import="org.jfree.chart.StandardChartTheme"%>
<%@ page import="org.jfree.chart.ChartFactory"%>
<%@ page import="org.jfree.chart.plot.CategoryPlot"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer"%>
<%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Color"%>
<%@ page import="java.sql.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.awt.*"%>
<%@ page import="java.io.*"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.CategoryLabelPositions"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberAxis3D"%>
<%@ page import="org.jfree.chart.axis.NumberTickUnit"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D" %>
<%@ page import="org.jfree.chart.renderer.category.LineAndShapeRenderer" %>
<%@ page import="org.jfree.data.category.DefaultCategoryDataset" %>
<%@ page import="org.jfree.chart.plot.DatasetRenderingOrder" %>

//PS:一個新手就盡可能的導入類,以防出錯.....

//餅狀圖代碼如下:

<html>
<body>
<%
//實例化核心類對象
DefaultPieDataset dataset=new DefaultPieDataset();
//設置圖表值,可為多個
dataset.setValue("paid",45);
dataset.setValue("Unpaid",25);
//根據JFreeChart提供的工廠類org.jfree.chart.ChartFactory創建餅狀圖
JFreeChart chart=ChartFactory.createPieChart3D("Student payment form",dataset,true,false,false);

//生成圖形存入session,得到存入session的圖形名稱

String filename=ServletUtilities.saveChartAsPNG(chart,500,400,session);

//在頁面中通過img展示生成的圖形,通過jfreechart的servlet輸出圖形
String graphURL=request.getContextPath()+"/DisplayChart?filename="+filename;
%>
<img src="<%=graphURL %>" >
</body>
</html>

 

以上輸出圖表的方法是用JFreeChart的serverlet進行輸出,所以要配置web.xml文件,如下:(如果圖表不顯示,多半是web.xml沒有配置)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>ceshi</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>

<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>/DisplayChart</url-pattern>
</servlet-mapping>
</web-app>

 

事實上,圖表輸出是有倆種方式,另一種是通過一個函數輸出:(柱狀圖為例)

//第一步,構造一個Dataset :填充要統計的數據
DefaultCategoryDataset mDataset = new DefaultCategoryDataset();
mDataset.addValue(2000, "清華大學", "本科生"); //數據一般從數據庫得出,用個for循環即可
mDataset.addValue(1500, "清華大學", "研究生");
mDataset.addValue(1000, "清華大學", "博士生");
mDataset.addValue(900, "清華大學", "講師");
mDataset.addValue(800, "清華大學", "副教授");
mDataset.addValue(300, "清華大學", "教授");
mDataset.addValue(600, "清華大學", "行政人員");
mDataset.addValue(400, "清華大學", "管理人員");
//第二步,生成圖形,ChartFactory.createBarChart3D來生成柱狀圖
JFreeChart mChart = ChartFactory.createBarChart3D(
"學校人員分布圖", // 圖形名稱
"類型", // 分類名稱,為橫坐標名稱
"數量", // 值名稱,為縱坐標名稱
mDataset, // 數據集合
PlotOrientation.VERTICAL, // 垂直顯示
true, // 是否顯示圖例
true,// 是否使用工具提示
false);// 是否使用url

//第三,顯示,有倆種方法:流式輸出與URL(上面已經講了)輸出
response.setContentType("image/png");
//流式輸出
ChartUtilities.writeChartAsPNG(response.getOutputStream(),mChart,800,500);

//////////////////////////////////////////////////////

按理說,圖表核心輸出就已經學會了,但從上文得知,JFreeChart是不支持中文,會出現亂碼,如果圖表中的參數用英文,上面代碼足以應付

如果想輸出中文而且還不顯示亂碼,那必須要自己再配置,如下:

// 配置字體
Font xfont = new Font("宋體", Font.PLAIN, 12);// X軸
Font yfont = new Font("宋體", Font.PLAIN, 12);// Y軸
Font kfont = new Font("宋體", Font.PLAIN, 12);// 底部
Font titleFont = new Font("宋體", Font.BOLD, 25); // 圖片標題
// 圖形的繪制結構對象,對於餅圖不適用
CategoryPlot plot = mChart.getCategoryPlot();

// X 軸
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setLabelFont(xfont);// 軸標題
domainAxis.setTickLabelFont(xfont);// 軸數值
domainAxis.setTickLabelPaint(Color.BLACK); // 字體顏色

// Y 軸
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setLabelFont(yfont);
rangeAxis.setLabelPaint(Color.BLACK); // 字體顏色
rangeAxis.setTickLabelFont(yfont);

這樣就解決亂碼了,上邊的代碼適用柱狀圖,設置字體, 
對於折線圖、餅圖設置字體 的代碼不太一樣,需要單獨對不同類型的圖形設置字體,但都非常類似。

 

用戶的一般需求上面的一些思路就足以,但有時想輸出一些綜合的圖表,比如柱狀圖與折線圖一起輸出,甚至是柱狀圖與很多折線圖一起輸出,

網上也有很多例子,順帶着上面的思想也可以學習折線圖。

綜合圖參考鏈接:

http://blog.sina.com.cn/s/blog_906e353d0101241e.html

https://blog.csdn.net/sb_jb/article/details/77867614?fps=1&locationNum=2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM