JFreeChart生成柱狀圖及其在struts2下的展現
JFreeChart是JAVA平臺上的一個開放的圖表繪制類庫,是一個不錯的java圖形解決方案,利用它能夠生成餅圖、柱狀圖、散點圖、時序圖、甘特圖等多種圖表,能夠解決大部分圖形方面的需求。
在統計時,采用JFreeChart可以直接通過Servlet生成相應的展示圖,不過項目架構中使用struts,將表現層與業務邏輯分離,此處無需在多使用其他交互方式。采用在申請jsp時,其中的img標簽直接調用action,在action中調用業務邏輯,利用從DB中獲取的產量統計數據,形成柱狀圖,將其輸出到指定位置,之后返回輸入流(inputStream)輸出圖片。示例代碼如下所示:
Jsp端只需要利用img 的src指定相應Action(struts2內容)(View)
<img src="../chart_helper!generateBarChart.action" width="600" height="200" />
利用JFreeChart產生柱狀圖的核心代碼,此處代碼可獨立與本文使用(Business)
這樣在申請訪問此jsp時會調用ChartHelperAction中的generateBarChart方法來得到統計圖。其中重要的一點是利用JFreeChart生成柱狀圖存儲在指定目錄下。示例如下所示:
DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(150, "1", "A"); dataset.addValue(150, "2", "A"); dataset.addValue(150, "3", "A"); dataset.addValue(150, "1", "B"); dataset.addValue(150, "2", "B"); dataset.addValue(150, "3", "B"); dataset.addValue(150, "1", "C"); dataset.addValue(150, "2", "C"); dataset.addValue(150, "3", "C"); JFreeChart chart = ChartFactory.createBarChart3D( "", // 圖表標題 "", // 目錄軸的顯示標簽 "產量", // 數值軸的顯示標簽 dataset, // 數據集 PlotOrientation.VERTICAL , // 圖表方向:垂直 true, // 是否顯示圖例(對于簡單的柱狀圖必須是false) false, // 是否生成工具 false // 是否生成URL鏈接 ); //重新設置圖標標題,改變字體 chart.setTitle(new TextTitle("圖書銷量統計圖", new Font("黑體", Font.ITALIC , 22))); //取得統計圖標的第一個圖例 LegendTitle legend = chart.getLegend(0); //修改圖例的字體 legend.setItemFont(new Font("宋體", Font.BOLD, 14)); CategoryPlot plot = (CategoryPlot)chart.getPlot(); chart.setBackgroundPaint(ChartColor.WHITE); //設置柱狀圖到圖片上端的距離 ValueAxis rangeAxis = plot.getRangeAxis(); rangeAxis.setUpperMargin(0.5); //取得橫軸 CategoryAxis categoryAxis = plot.getDomainAxis(); //設置橫軸顯示標簽的字體 categoryAxis.setLabelFont(new Font("宋體" , Font.BOLD , 22)); //分類標簽以45度角傾斜 // categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); categoryAxis.setTickLabelFont(new Font("宋體" , Font.BOLD , 18)); //取得縱軸 NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis(); //設置縱軸顯示標簽的字體 numberAxis.setLabelFont(new Font("宋體" , Font.BOLD , 22)); //在柱體的上面顯示數據 BarRenderer custombarrenderer3d = new BarRenderer(); custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);//數據字體的顏色 custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); custombarrenderer3d.setBaseItemLabelsVisible(true); plot.setRenderer(custombarrenderer3d); FileOutputStream fos = null; String imagePath = “D:\\chart.jpg”; try { fos = new FileOutputStream(imagePath); //將統計圖標輸出成JPG文件 ChartUtilities.writeChartAsJPEG( fos, //輸出到哪個輸出流 1, //JPEG圖片的質量,0~1之間 chart, //統計圖標對象 680, //寬 200,//寬 null //ChartRenderingInfo 信息 ); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
上面代碼的核心是獲取生成Chart的數據源,并借此創建創建柱狀圖,繼而設置圖的相關屬性,輸出到指定位置。上面代碼的生成的柱狀圖效果如下所示:
值得注意的是由于這種報表一段時間下來會產生很多,而業務上也不需要存儲這些信息,所以上文中輸出的統計圖可以依次覆蓋。這是上述代碼中指定了固定的輸出路徑imagePath = “D:\\chart.jpg”;。在實際開中這些內容最好在配置文件中設置。
讀取硬盤圖片,向JSP頁面輸出圖片流(Action)
生成柱狀圖后我們可以將其讀出到inputStream,繼而將其輸出成圖片形式。下面的代碼展示了上文jsp 中img src指定action的generateBarChart方法的部分代碼,另外的代碼為創建柱狀圖和返回柱狀圖路徑的過程。
try{ String impath = 此處的圖路徑,是上面所示代碼中生成柱狀圖的存儲路徑 File file = new File(imagePath); InputStream inputStream = null; if(file.exists()){ try { inputStream = new FileInputStream(file); } catch (FileNotFoundException e) { } } int i = inputStream.available(); byte data[] = new byte[i]; inputStream.read(data); HttpServletResponse response = ServletActionContext.getResponse(); ServletOutputStream out = response.getOutputStream(); response.setContentType( "multipart/form-data" ); out.write(data); out.flush(); out.close(); }catch(IOException e){ e.printStackTrace(); }此文中間部分是利用JFreeChart產生柱狀圖的核心代碼。上述代碼是利用既有的基于struts2的架構進行的圖標展示。此外我們還可以將圖標輸出到整個應用項目中的文件夾中,而返回一個相對應用url的地址,達到直接顯現的目的,從而避免上文中利用imgPath獲取inputStream,再以圖片輸出流的形式輸出的過程,即第三部分代碼可省略。當然采用servlet形式直接輸出統計表而不再進行存儲和讀取的方式會相對來講更簡單一點,不過這樣的耦合性也會高一些。總之JFreeChart同Java有很好的結合,可以很好的解決圖標需求,需加以深入研究。
轉自:http://blog.csdn.net/dongzi87/article/details/7451855