SSH框架通过JFreeChart实现柱状图和获取项目路径

获取项目路径:String url= ServletActionContext.getRequest().getRealPath("/upload");

一.直接生成的图片输出到jsp页面

1.jsp页面

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@ taglib prefix="s" uri="/struts-tags" %>  
  4. <%    
  5. String path = request.getContextPath();    
  6. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";    
  7. %>   
  8. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  9. <html>  
  10. <head>  
  11. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  12. <base href="<%=basePath%>">  
  13. <title>Insert title here</title>  
  14. </head>  
  15. <body>  
  16.  <!--img src='D:\temp\chart.jpg' width="680" height="700" onload="alert('图片存在');"  onerror="alert('无此图片');"/-->  
  17.  <img alt="统计图" src="<%=basePath%>/chart2.action">     
  18. </body>  
  19. </html>  

2.action类

  1. public String execute() throws Exception{  
  2.  //添加数据  
  3.         DefaultCategoryDataset dataset = new DefaultCategoryDataset();  
  4.         dataset.addValue(42000"月份" , "1月");  
  5.         dataset.addValue(40000 , "月份" , "2月");  
  6.         dataset.addValue(34000 , "月份" , "3月");  
  7.         dataset.addValue(18000 , "月份" , "4月");  
  8.         dataset.addValue(26000 , "月份" , "5月");  
  9.         dataset.addValue(42000 , "月份" , "6月");  
  10.         dataset.addValue(40000 , "月份" , "7月");  
  11.         dataset.addValue(34000 , "月份" , "8月");  
  12.         dataset.addValue(18000 , "月份" , "9月");  
  13.         dataset.addValue(26000 , "月份" , "10月");  
  14.         dataset.addValue(45000 , "月份" , "11月");  
  15.         dataset.addValue(38000 , "月份" , "12月");  
  16.           
  17.         //创建一个柱状图  
  18.         JFreeChart chart = ChartFactory.createBarChart3D("年度人口统计图""人口""数量",dataset,PlotOrientation.VERTICAL, truefalsefalse);  
  19.         chart.setTitle(new TextTitle("年度人口统计图"new Font("黑体", Font.ITALIC,22)));  
  20.         LegendTitle legend = chart.getLegend(0);  
  21.         legend.setItemFont(new Font("宋体", Font.BOLD, 14));  
  22.         CategoryPlot plot = (CategoryPlot) chart.getPlot();  
  23.         CategoryAxis categoryAxis = plot.getDomainAxis();  
  24.         categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));  
  25.         categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  
  26.         categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 18));  
  27.         NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();  
  28.         numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));  
  29.   
  30.         HttpServletResponse response=ServletActionContext.getResponse();  
  31.         response.setContentType("image/");  
  32.         ChartUtilities.writeChartAsJPEG(response.getOutputStream(), 1, chart, 900600null);  
  33.         response.getOutputStream().close();  
  34.           
  35.         return null;  
  36. }  
3.struts.xml配置

  1. <action name="chart2" class="Char2tAction">  
  2. <result name="success">/Chart.jsp</result>  
  3. </action>  


Tip:参考的别的文章包一定得继承两个类,或者修改源码,实践正确配置如下:

<!-- 柱状图 -->
<package name="struts2" extends="struts-default,jfreechart-default">
<action name="chart2" class="com.ssh.app.web.action.CreateChartBar">
<result name="success">/tLiveStatistics.jsp</result>
</action>
</package>


4.效果图



二.生成图片保存到本地:

1.生成图片

  1.     public void createChart() {  
  2.         // TODO Auto-generated method stub        
  3.         DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
  4.         dataset.addValue(1001"1""A");     
  5.         dataset.addValue(800"2""A");          
  6.         dataset.addValue(150"3""A");      
  7.         dataset.addValue(150"1""B");  
  8.         dataset.addValue(150"2""B");      
  9.         dataset.addValue(250"3""B");      
  10.         dataset.addValue(150"1""C");      
  11.         dataset.addValue(33"2""C");   
  12.         dataset.addValue(900"3""C");      
  13. //      JFreeChart chart = ChartFactory.createBarChart3D(   
  14. //                                          "", // 图表标题   
  15. //                                          "", // 目录轴的显示标签   
  16. //                                          "产量", // 数值轴的显示标签   
  17. //                                          dataset, // 数据集   
  18. //                                          PlotOrientation.VERTICAL , // 图表方向:垂直   
  19. //                                          true, // 是否显示图例(对于简单的柱状图必须是false)   
  20. //                                          false, // 是否生成工具   
  21. //                                          false // 是否生成URL链接   
  22. //                                  );   
  23.         //JFreeChart chart = ChartFactory.createBarChart3D("","","产量",dataset,PlotOrientation.VERTICAL,true,false,false);  
  24.         JFreeChart chart = ChartFactory.createBarChart3D("销量统计图""种类""产量", dataset, PlotOrientation.VERTICAL, truefalsefalse);  
  25.                   
  26.         //重新设置图标标题,改变字体   
  27.         chart.setTitle(new TextTitle("销量统计图"new Font("黑体", Font.ITALIC , 22)));   
  28.                 //取得统计图标的第一个图例   
  29.                 LegendTitle legend = chart.getLegend(0);   
  30.                 //修改图例的字体   
  31.                 legend.setItemFont(new Font("宋体", Font.BOLD, 14));   
  32.                 //legend.setItemFont(new Font("宋体", Font.TRUETYPE_FONT, 14));   
  33.                 CategoryPlot plot = (CategoryPlot)chart.getPlot();   
  34.                   
  35.                 chart.setBackgroundPaint(ChartColor.WHITE);   
  36.   
  37.                 //设置柱状图到图片上端的距离  
  38.                 ValueAxis rangeAxis = plot.getRangeAxis();  
  39.                 rangeAxis.setUpperMargin(0.5);  
  40.                   
  41.                 //取得横轴   
  42.                 CategoryAxis categoryAxis = plot.getDomainAxis();   
  43.                 //设置横轴显示标签的字体   
  44.                 categoryAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));   
  45.                 //分类标签以45度角倾斜   
  46. //              categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);   
  47.                 categoryAxis.setTickLabelFont(new Font("宋体" , Font.BOLD , 18));   
  48.                   
  49.                 //取得纵轴   
  50.                 NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();   
  51.                 //设置纵轴显示标签的字体   
  52.                 numberAxis.setLabelFont(new Font("宋体" , Font.BOLD , 22));   
  53.   
  54.                 //在柱体的上面显示数据  
  55.                 BarRenderer custombarrenderer3d = new BarRenderer();  
  56.                 custombarrenderer3d.setBaseItemLabelPaint(Color.BLACK);//数据字体的颜色  
  57.                 custombarrenderer3d.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());  
  58.                 custombarrenderer3d.setBaseItemLabelsVisible(true);  
  59.                 plot.setRenderer(custombarrenderer3d);  
  60.                 //HttpServletRequest request = null;  
  61.                 //request.getSession().getServletContext().getRealPath("/");  
  62.                 //URL a = Thread.currentThread().getContextClassLoader().getResource("");  
  63.                 //URL a = Thread.currentThread().getContextClassLoader().getResource("");       
  64.                 //System.out.println(a);  
  65.                 FileOutputStream fos = null;    
  66.                 //String imagePath = "D:\\chart.jpg";  
  67.                 String imagePath = "D:\\temp\\chart.jpg";  
  68.                 ChartRenderingInfo info = new ChartRenderingInfo();   
  69.                 try {  
  70.                     fos = new FileOutputStream(imagePath);  
  71.                     //将统计图标输出成JPG文件   
  72.                     ChartUtilities.writeChartAsJPEG(   
  73.                         fos, //输出到哪个输出流   
  74.                         1//JPEG图片的质量,0~1之间   
  75.                         chart, //统计图标对象   
  76.                         800//宽   
  77.                         600,//高  
  78.                         info //ChartRenderingInfo 信息   
  79.                     );  
  80.                     fos.close();  
  81.                 } catch (FileNotFoundException e) {  
  82.                     // TODO Auto-generated catch block  
  83.                     e.printStackTrace();  
  84.                 } catch (IOException e) {  
  85.                     // TODO Auto-generated catch block  
  86.                       
  87.                     e.printStackTrace();  
  88.                 }  
  89.           
  90.     }  


2.显示到jsp:     

  1. try{  
  2.       
  3.     String impath = "D:\\temp\\chart.jpg";//此处的图路径,是上面所示代码中生成柱状图的存储路径  
  4.     File file = new File(impath);  
  5.           
  6.     InputStream inputStream = null;  
  7.     if(file.exists()){  
  8.         try {  
  9.             inputStream = new FileInputStream(file);  
  10.                       
  11.         } catch (FileNotFoundException e) {  
  12.                   
  13.         }  
  14.     }  
  15.   
  16.     int i = inputStream.available();   
  17.          byte data[] = new byte[i];  
  18.          inputStream.read(data);  
  19.               
  20.          HttpServletResponse response = ServletActionContext.getResponse();  
  21.          ServletOutputStream out = response.getOutputStream();  
  22.               
  23.          response.setContentType("image/jpeg");  
  24.               
  25.          out.write(data);   
  26.          out.flush();        
  27.          out.close();   
  28.               
  29. }catch(IOException e){  
  30.          e.printStackTrace();   
  31. }  

















posted @ 2017-08-21 16:07  星朝  阅读(542)  评论(0)    收藏  举报