这个模块的主要步骤就是:

前台通过struts调用后台,通过JFreeChart产生图片格式的图表,存储在某个位置,然后前台jsp再去调用图片。

来开工。

JFreeChart的简介大家请百度。

首先需要两个包,jcommon-1.0.16.jar和jfreechart-1.0.13.jar。

jfreechart(下面就简称jfc),有可能会出现中午乱码问题,我建议大家就找上面那两个包,至少不会出那些需要换包的问题。

先看看效果

生成的图片:

前台的显示效果:

后台的方法

public String statistic() {

        //.....

        //diagramType就是前台的那个下拉框

        //可以是饼状图也可以是柱状图
        if (diagramType.equals("barChart"))
            getBarChart();
        else
            getPieChart();

        //getExcel(countArray);

        return SUCCESS;
    }
    /**
     * 生成柱状图
     */
    public void getBarChart() {
        CategoryDataset dataset = getDataSet();// 获取数据结果集
        JFreeChart chart = ChartFactory.createStackedBarChart3D("不同危险等级病人数分布", // 标题
                "危险等级",// x轴显示
                "病人数量(单位:位)", // y轴显示
                dataset, // 数据源
                PlotOrientation.VERTICAL, // 图表方向:水平,垂直
                true, // 是否显示图例(对于简单的柱状图必须是false)
                false,// 是否生成工具
                false);// 是否生成URL链接
        CategoryPlot plot = chart.getCategoryPlot();
        CategoryAxis axis = plot.getDomainAxis(); // 获取X轴
        ValueAxis numberAxis = plot.getRangeAxis();// 获取y轴
        axis.setLowerMargin(0.06);// 设置距离图片左端距离此时为6%
        axis.setUpperMargin(0.06); // 设置距离图片右端此时为6%
        axis.setCategoryLabelPositionOffset(10);// 图表横轴与标签的距离(10像素)
        axis.setCategoryMargin(0.2);// 横轴标签之间的距离20%
        chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 12));// 设置底部中文乱码
        axis.setTickLabelFont(new Font("黑体", Font.BOLD, 12));// 设置X轴坐标上的文字
        axis.setLabelFont(new Font("黑体", Font.BOLD, 14));// 设置X轴的标题文字

        numberAxis.setTickLabelFont(new Font("黑体", Font.BOLD, 12));// 设置y轴坐标上的文字
        numberAxis.setLabelFont(new Font("黑体", Font.BOLD, 14));// 设置Y轴的标题文字
        chart.getTitle().setFont(new Font("黑体", Font.BOLD, 18));// 设置标题文字

        NumberAxis numberAxis1 = (NumberAxis)chart.getCategoryPlot().getRangeAxis();
        numberAxis1.setAutoTickUnitSelection(false);
        numberAxis1.setTickUnit(new   NumberTickUnit(30D));//1为一个间隔单位

        BarRenderer3D customBarRenderer = (BarRenderer3D) plot.getRenderer();
        customBarRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());//显示每个柱的数值
        customBarRenderer.setBaseItemLabelsVisible(true); //柱子上数值可见

        Date date = new Date();// 获取当前时间
        chartTimeTag = Long.toString(date.getTime());// 获取当前时间的时间戳
        String path = ServletActionContext.getServletContext().getRealPath("/")
                + "resources/chart/" + chartTimeTag + ".png";// 图片的存储路径
        // 输出图片到文件
        FileOutputStream fos_png = null;
        try {
            fos_png = new FileOutputStream(path);
            ChartUtilities.writeChartAsPNG(fos_png, chart, 900, 500, null);// 存储为png图片,宽度为900,高为500
            fos_png.close();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.toString());
        }
    }
    /**
     * 得到生成柱状图的数据结果集,将方法tongJi()所得到的结果集中的数据依次添加到dataset中
     *
     * @return dataset 返回柱状图所需要的数据结果集
     */
    public CategoryDataset getDataSet() {
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        for (int i = 0; i < hosDegreeDataList.size(); i++) {
            //hosDegreeDataList里面存放的就是数据
            //hosDegreeDataList是一个list 每个element都是一组数据
            //大家对比一下图片中的ss与mm 就知道addValue的三个参数的作用了
            dataset.addValue(Integer.parseInt(hosDegreeDataList.get(i).get(2)
                    .toString()), hosDegreeDataList.get(i).get(0).toString()+"mm",
                    hosDegreeDataList.get(i).get(0).toString()+"ss");  //加上ss与mm 你就知道这两个参数的区别了

        }
        return dataset;
    }
  /**
     * 生成饼状图
     */
    public void getPieChart() {
        System.out.println("create chart start!!!!!!!!!");
        PieDataset dataset = getPieDataSet();// 获取数据结果集
        JFreeChart chart = ChartFactory.createPieChart3D("不同危险等级病人数分布",// 图表标题
                dataset,// 数据源
                true,// 是否显示图例
                true, true);// 是否生成工具,是否生成URL链接
        PiePlot3D plot = (PiePlot3D) chart.getPlot();
        // 图片中显示百分比:默认方式
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));
        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值,
        // {2} 表示所占比例 ,小数点后两位
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator(
                "{0}={1}({2})", NumberFormat.getNumberInstance(),
                new DecimalFormat("0.00%")));
        // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例
        plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}"));
        // 指定图片的透明度(0.0-1.0)
        plot.setForegroundAlpha(1.0f);
        // 指定显示的饼图上圆形(true)还椭圆形(false)
        plot.setCircular(true);
        // 设置图上分类标签label的字体,解决中文乱码
        plot.setLabelFont(new Font("黑体", Font.PLAIN, 12));
        // 设置图上分类标签label的最大宽度,相对与plot的百分比
        plot.setMaximumLabelWidth(0.2);
        // 设置3D饼图的Z轴高度(0.0~1.0)
        plot.setDepthFactor(0.07);
        // 设置起始角度,默认值为90,当为0时,起始值在3点钟方向
        plot.setStartAngle(45);

        // 设置图标题的字体,解决中文乱码
        TextTitle textTitle = chart.getTitle();
        textTitle.setFont(new Font("黑体", Font.PLAIN, 20));

        // 设置背景色为白色
        chart.setBackgroundPaint(Color.white);
        // 设置Legend部分字体,解决中文乱码
        chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));

        Date date = new Date();
        chartTimeTag = Long.toString(date.getTime());// 获取当前的时间戳
        String path = ServletActionContext.getServletContext().getRealPath("/")
                  + "resources/chart/" + chartTimeTag + ".png";// 图片的存储路径
        // 输出图片到文件
        //+"resources/chart/abc.png";
        System.out.println(path);
        FileOutputStream fos_png = null;
        try {
            fos_png = new FileOutputStream(path);
            ChartUtilities.writeChartAsPNG(fos_png, chart, 900, 500, null);
            fos_png.close();
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.toString());
        }
    }
   /**
     * 得到生成饼状图的数据结果集:将方法tongJi()所得到的结果集中的数据依次添加到dataset中
     *
     * @return dataset 返回饼状图所需要的数据结果集
     */
    public PieDataset getPieDataSet() {
        DefaultPieDataset dataset = new DefaultPieDataset();
        for (int i = 0; i < hosDegreeDataList.size(); i++) {
            dataset.setValue(hosDegreeDataList.get(i).get(0).toString(), Double
                    .parseDouble(hosDegreeDataList.get(i).get(2).toString()));

        }
        return dataset;
    }

返回的jsp页面部分代码如下:

  

  <img src="../../../resources/chart/<s:property value = "chartTimeTag"/>.png"
                / width="500px">
            <br>
            <br>
    <input type="button" class="btn_long" value="点击查看大图"
            onclick="window.open('../../../resources/chart/<s:property value="chartTimeTag"/>.png')" />

基于web的jfreechart的使用的更多相关文章

  1. shellinabox基于web浏览器的终端模拟器

    1. Shellinabox介绍 Shellinabox 是一个利用 Ajax 技术构建的基于 Web 浏览器的远程终端模拟器,也就是说安装了该软件之后,服务器端不需要开启 ssh服务,通过 Web  ...

  2. Tridiv:基于 Web 的 CSS 编辑器,创建炫丽 3D 图形

    Tridiv 是一个基于 Web 的编辑器,使用 CSS 创建 3D 形状.它提供了一个传统的四个面板的操作界面,给出了从每个平面的视图,以及一个预览窗格中示出的最终的效果.使用 Tridiv 可以创 ...

  3. Eclipse Che:下一代基于 Web 的 IDE

    即使对于熟练的开发人员,想要去为一个项目贡献代码,正确的安装和配置一个集成开发环境.工作区 workspace和构建工具,都是一个十分艰难和浪费时间的任务.Codenvy 的CEO,Tyler Jew ...

  4. 基于web的IM软件通信原理分析

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

  5. Hya.io – 基于 Web 的数字音频工作站

    Hya.io 是基于 Web 的音频应用程序,通过 Web MIDI ,音频合成器,音序以及大量的插件来支持硬件 MIDI .您可以添加插件到工作区,将其连接到路由音频,进行播放和实验. HYA 支持 ...

  6. 基于Web的企业网和互联网的信息和应用( 1194.22 )

    基于Web的企业网和互联网的信息和应用( 1194.22 ) 原文更新日期: 2001年6月21日原文地址: http://www.access-board.gov/sec508/guide/1194 ...

  7. 基于web工作流开发

    目前在研发基于web工作流的开发 什么是工作流? 工作流简言之就是: 1.反应业务流程的计算机化的模型. 2.一类能够完全或者部分自动执行的经营过程:(为了提高效率,实现自动化). 3.任务.活动及活 ...

  8. 基于Web的数据推送技术(转)

    基于Web的数据推送技术 对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种.1. HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务 ...

  9. 使用 XMPP 构建一个基于 web 的通知工具——转

    Inserting of file(使用 XMPP 构建一个基于 web 的通知工具.docx) failed. Please try again. http://www.ibm.com/develo ...

随机推荐

  1. [多线程] 生产者消费者模型的BOOST实现

    说明 如果 使用过程中有BUG 一定要告诉我:在下面留言或者给我邮件(sawpara at 126 dot com) 使用boost::thread库来实现生产者消费者模型中的缓冲区! 仓库内最多可以 ...

  2. 全废话SQL Server统计信息(2)——统计信息基础

    接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...

  3. Java中的泛型类和泛型方法区别和联系

    泛型的概念大家应该都会,不懂的百度或者google,在java中泛型类的定义较为简单 <span style="font-size:18px;"><span st ...

  4. Android系统的安全设计与架构

    Android系统的安全设计与架构 一.安全策略 1.Android 的总体架构由5个主要层次上的组件构成,这5层是:Android应用层. Android框架层.Dalvik虚拟机层.用户空间原生代 ...

  5. 适配器模式(adapter)

    适配器模式的定义: 将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能在一起的那些类可以一起工作. 主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式. ...

  6. 详解EBS接口开发之供应商导入(补充)--供应商银行账户更新

    CREATE OR REPLACE PACKAGE BODY update_vendor_account IS PROCEDURE main(errbuf OUT VARCHAR2, retcode ...

  7. UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口

    1.经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认. 2.nagle算法: 一个TCP连接 ...

  8. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  9. Unity UGUI基础之Button

    UGUI Button,可以说是真正的使用最广泛.功能最全面.几乎涵盖任何模块无所不用无所不能的组件,掌握了它的灵巧使用,你就几乎掌握了大半个UGUI! 一.Button组件: Interactabl ...

  10. pig 的chararry类型不能用比较运算符comparison operator

    pig 的chararry类型可能是按字段,逐个字段进行比较. element_id 是chararray类型, 语句: no_app_category_mapping = filter no_ele ...