吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3024|回复: 4
收起左侧

[Java 转载] 使用Java读取本地文件在网页上画Echars图

[复制链接]
ProgramerFangL 发表于 2017-11-14 17:48
本帖最后由 ProgramerFangL 于 2017-11-14 17:50 编辑

先简单介绍一下写这个代码的原因。最近在工作中有一个要做的事情就是根据别人给出的数据,一般是一种类似于top10的数据,如下
1510651236(1).png
需要将这种数据用echars出一个饼状图或者柱状图。刚开始的做法就是找在线的echars网站,类似于下图这种的
1510651382.png
然后将里面的数据变成自己的,但是当出图量多了以后(是不是感觉好无聊的工作,,但是确实需要人做)。虽然这个工作不是我在做,但是在线的做法太慢,严重影响了速率,所以我写了一个虽然很low但是还是可以实现需求的JavaWeb代码。具体逻辑就是访问网站,向后台提交请求,后台读取数据返回给前端页面,前端将返回的数据出图。废话就到这儿了,开始直接贴代码.。
这是一个实体类,对应于数据的格式,因为一般数据都是相当于key value格式的,所以只有两个属性name和value
[Asm] 纯文本查看 复制代码
public class Product {
    
    private String name;    //key名称
    private int value;        //value值
    
    public Product(String name, int value) {
        this.name = name;
        this.value = value;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    
    
} 

下面是一个用于读取本地文件的IO流:
[Java] 纯文本查看 复制代码
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ReadData {
        public static List<Product> readLine(){
                List list = new ArrayList();
                try {
                        FileReader fr = new FileReader("D:\\top10.txt");//本地需要出图的文件路径
                        BufferedReader br = new BufferedReader(fr);
                        String valueString = null;
                        while((valueString = br.readLine())!= null){
                                
                                String[] strs=valueString.split("        ");//将文件中的每行内容按什么方式切割
                                int value = Integer.valueOf(strs[1]);
                                String name = strs[0];
                                Product pd = new Product(name, value);//将每一行数据封装成一个实体类,加入list中
                                list.add(pd);
                                System.out.println(valueString);
                                
                        }
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return list;
        }
        public static void main(String[] args) {
                readLine();
        }
}

下面是一个servle类,用于接收请求并处理,主要看doPost()方法:
[Java] 纯文本查看 复制代码
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

import test.Product;
import test.ReadData;

/**
 * Servlet implementation class DataServlet
 */
@WebServlet("/DataServlet")
public class DataServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
       
    /**
     * [url=home.php?mod=space&uid=2660]@see[/url] HttpServlet#HttpServlet()
     */
    public DataServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
                 doPost(request,response);
        }

        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
                 List<Product> list = ReadData.readLine();//获取读取的本地文件内容
                
             ObjectMapper mapper = new ObjectMapper();    //提供java-json相互转换功能的类
             String json = mapper.writeValueAsString(list);    //将list中的对象转换为Json格式的数组
                
                //将json数据返回给客户端
                response.setContentType("text/html; charset=utf-8");
                response.getWriter().write(json); 
                System.out.println(json);
        }

}

下面要贴的就是一个jsp页面了
[HTML] 纯文本查看 复制代码
<%[url=home.php?mod=space&uid=402414]@[/url] page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>ECharts</title>
    
    <!-- 引入 echarts.js -->
    <script type="text/javascript" src="echarts-all.js"></script>
    <!-- <script type="text/javascript" src="echarts-all.js"></script> -->
    <!-- 引入jquery.js -->
    <script type="text/javascript" src="jquery-1.12.3.js"></script>
</head>

<body>
<!-- <img border="0" src="image/title.png" style="width:70px;height:70px"> -->
        <header  style="height:90px;background:url(image/header2.jpg) no-repeat center">
        
        
        </header>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div>
    <div id="test" style="width: 800px;height:600px;margin-right:300px;float:right"></div>
    </div>
    <footer style="margin-top:600px;background-color: ;">
    <hr>
    <div style="text-align: center">

</div>
    </footer>
    <script type="text/javascript">
        var yuan = echarts.init(document.getElementById('test'));
        yuan.setOption({
                 title : {
                        text: '某站点用户访问来源',
                        x:'center'
                    },
                    tooltip : {
                        trigger: 'item',
                        formatter: "{a} <br/>{b} : {c} ({d}%)"
                    },
                    legend: {
                        orient : 'vertical',
                        x : 'left',
                        data:[]
                    },
                    toolbox: {
                        show : true,
                        feature : {
                            mark : {show: true},
                            dataView : {show: true, readOnly: false},
                            magicType : {
                                show: true, 
                                type: ['pie', 'funnel'],
                                option: {
                                    funnel: {
                                        x: '25%',
                                        width: '50%',
                                        funnelAlign: 'left',
                                        max: 1548
                                    }
                                }
                            },
                            restore : {show: true},
                            saveAsImage : {show: true}
                        }
                    },
                    calculable : true,
                    series : [
                        {
                            name:'访问来源',
                            type:'pie',
                            radius : '55%',
                            center: ['50%', '60%'],
                        }
                    ]
        });

         
         
         var names=[];    //类别数组(实际用来盛放X轴坐标值)
         
         $.ajax({
         type : "post",
         async : true,            //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
         url : "DataServlet",    //请求发送到DataServlet处
         dataType : "json",        //返回数据形式为json
         success : function(result) {
             //请求成功时执行该函数内容,result即为服务器返回的json对象
             if (result) {
                    for(var i=0;i<result.length;i++){       
                       names.push(result[i].name);    //挨个取出类别并填入类别数组
                     }
                   
                    yuan.setOption({title : {
                            text: 'XXXXTOP10',
                            x:'center'
                        },
                        tooltip : {
                            trigger: 'item',
                            formatter: "{a} <br/>{b} : {c} ({d}%)"
                        },
                        legend: {
                            orient : 'vertical',
                            x : 'left',
                            data:[]
                        },
                        toolbox: {
                            show : true,
                            feature : {
                                mark : {show: true},
                                dataView : {show: true, readOnly: false},
                                magicType : {
                                    show: true, 
                                    type: ['pie', 'funnel'],
                                    option: {
                                        funnel: {
                                            x: '25%',
                                            width: '50%',
                                            funnelAlign: 'left',
                                            max: 1548
                                        }
                                    }
                                },
                                restore : {show: true},
                                saveAsImage : {show: true}
                            }
                        },
                        calculable : true,
                            legend: {
                                data:names,
                                x : 'left',
                               orient : 'vertical'
                            },
                            series: [{
                            // 根据名字对应到相应的系列
                            name: '访问来源',
                            type:'pie',
                                radius : '55%',
                            data: result
                        }]
                    });
                    
             }
             yuan.hideLoading();
         
        },
         error : function(errorMsg) {
             //请求失败时执行该函数
         alert("图表请求数据失败!");
         yuan.hideLoading();
         }
    })

         
    </script>
    
</body>
</html> 


最后的出图效果如下:
1510652814(1).png
虽然网页很丑,但是节省了时间,方便了工作,提高了效率。发现错误或有改进意见的请帮忙提出。谢谢

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

第二梦 发表于 2017-11-14 18:16
我最近就打算搞一套数据分析系统出来
 楼主| ProgramerFangL 发表于 2017-11-14 18:18
第二梦 发表于 2017-11-14 18:16
我最近就打算搞一套数据分析系统出来

数据分析是指哪一方面的??可以的话,可以一起搞啊,我之前用spark也做过数据分析,以及日志分析这一块的
重头再来 发表于 2017-11-14 18:30
Chart.js就可以做报表了...把数据转成Json传前台就行了,你这个功能是完成了,没有复用性啊
 楼主| ProgramerFangL 发表于 2017-11-14 18:34
重头再来 发表于 2017-11-14 18:30
Chart.js就可以做报表了...把数据转成Json传前台就行了,你这个功能是完成了,没有复用性啊

针对需求来的,,复用性确实。。。尴尬
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 08:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表