JSP 图表

这次目标就是生成简单的图表

先上个动图

word.gif

文章涉及到的几个知识点

  • 数据库链接
  • servlet 传递值给 JSP页面
  • canvasjs库生成的图表

首先,去 canvasjs官网 看一下生成图表的一些例子

比如: Pie Chart

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
window.onload = function () {
    var chart = new CanvasJS.Chart("chartContainer",
    {
        theme: "theme2",
        title:{
            text: "Gaming Consoles Sold in 2012"
        },      
        data: [
        {       
            type: "pie",
            showInLegend: true,
            toolTipContent: "{y} - #percent %",
            yValueFormatString: "#,##0,,.## Million",
            legendText: "{indexLabel}",
            dataPoints: [
                {  y: 4181563, indexLabel: "PlayStation 3" },
                {  y: 2175498, indexLabel: "Wii" },
                {  y: 3125844, indexLabel: "Xbox 360" },
                {  y: 1176121, indexLabel: "Nintendo DS"},
                {  y: 1727161, indexLabel: "PSP" },
                {  y: 4303364, indexLabel: "Nintendo 3DS"},
                {  y: 1717786, indexLabel: "PS Vita"}
            ]
        }
        ]
    });
    chart.render();
}
</script>
<script type="text/javascript" src="/assets/script/canvasjs.min.js"></script></head>
<body>
<div id="chartContainer" style="height: 300px; width: 100%;"></div>
</body>
 </html>

生成的样子就是这样

pieChart.png

通过研究代码 我们会发现,有一个js 数组,canvasjs 根据 这个数组的内容生成对应的图表。既然如此,我们这里暂且不研究具体的canvasjs, 我们目的是了解js需要什么样的数据,然后提供数据,最后生成我们需要的图表。

json数据

细心的读者就会发现,上面的 js 代码中, 有一个数组, 数组里面都是json数据。

dataPoints: [
                {  y: 4181563, indexLabel: "PlayStation 3" },
                {  y: 2175498, indexLabel: "Wii" },
                {  y: 3125844, indexLabel: "Xbox 360" },
                {  y: 1176121, indexLabel: "Nintendo DS"},
                {  y: 1727161, indexLabel: "PSP" },
                {  y: 4303364, indexLabel: "Nintendo 3DS"},
                {  y: 1717786, indexLabel: "PS Vita"}
            ]

如果读者不知道什么是json数据,可以先google查阅一下,补充一下知识。 这里简单说一下, 就是用于 名称 / 值对 来表示。
上例{ y: 4181563, indexLabel: "PlayStation 3" }
y 就是一个 key,它对应着一个value 4181563,
indexLabel 也是一个 key,它对应着一个value "PlayStation 3",。

数据库

建立数据库 test,并创建表名 pie, 字段 y (int) indexLable(varchar)

table1.png

录入数据

table2.png

用eclipse 创建一个 Dynamic Web Project,项目名称 ChartDemo

因为需要链接MySQL数据库,我们必须引用 com.mysql.jdbc_5.1.5.jar

将此jar 包 放于

WebContent
      -- Web-INT
         -- lib (放于这个文件夹内)

在 src 内 , 创建一个 MySQLDB 工具类

package cn.hejing.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/** 
* @author  hejing
* @email 2010jing@gmail.com 
* @date datetime 2016年9月21日 下午11:14:50 
* @description 
* @version 1.0 
* @since  
*/
public class MySQLDB {
    /** 
    * @param args 
    */  
   //驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中  
   public static final String DBDRIVER = "com.mysql.jdbc.Driver";  
   //连接地址是由各个数据库生产商单独提供的,所以需要单独记住  
   public static final String DBURL = "jdbc:mysql://localhost:3306/test";  
   //连接数据库的用户名  
   public static final String DBUSER = "root";  
   //连接数据库的密码  
   public static final String DBPASS = ""; 
   
   
   Connection conn = null; //表示数据库的连接对象 
   
   /** 
    * 建立数据库连接 
    * @return 数据库连接 
    */  
   public Connection getConnection() {  
       try {
           Class.forName(DBDRIVER);
       } catch (ClassNotFoundException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       } //1、使用CLASS 类加载驱动程序  
       try {  
           // 获取连接  
           conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);  
       } catch (SQLException e) {  
           System.out.println(e.getMessage());  
       }  
       return conn;  
   } 
}

这个工具类 用于 链接数据库,里面提供一个方法 getConnection(),返回的是一个 Connection。

编写servlet ShowChart.java

package cn.hejing.servlet;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import javax.servlet.RequestDispatcher;
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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import cn.hejing.util.MySQLDB;

/**
 * Servlet implementation class ShowChart
 */
@WebServlet("/ShowChart")
public class ShowChart extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private MySQLDB mysqlDB = new MySQLDB();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ShowChart() {
        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
        //response.getWriter().append("Served at: ").append(request.getContextPath());
        
        Connection conn = mysqlDB.getConnection();
        String sql =  "select * from pie";
        PreparedStatement ps=null;
        ResultSet rs = null;
        
        
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        String data = null;
        
        try {
            if(rs.next()){
                data = resultSetToJson(rs);
                
            }
        } catch (JSONException | SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println(data);
        
        RequestDispatcher rd = request.getRequestDispatcher("index.jsp");  
        request.setAttribute("chartData",data);//存值  
        rd.forward(request,response);//开始跳转 
        
        
        //request.getRequestDispatcher("index.jsp").forward(request, response);
    
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }
    
    
    public String resultSetToJson(ResultSet rs) throws SQLException,JSONException  
    {  
       // json数组  
       JSONArray array = new JSONArray();  
        
       // 获取列数  
       ResultSetMetaData metaData = rs.getMetaData();  
       int columnCount = metaData.getColumnCount();  
        
       // 遍历ResultSet中的每条数据  
        while (rs.next()) {  
            JSONObject jsonObj = new JSONObject();  
             
            // 遍历每一列  
            for (int i = 1; i <= columnCount; i++) {  
                String columnName =metaData.getColumnLabel(i);  
                
                if(columnName.equals("y")){
                    int value = rs.getInt(columnName);
                    jsonObj.put(columnName, value);  

                }else{
                    String value = rs.getString(columnName);  
                    jsonObj.put(columnName, value);  
                }
               
                //jsonObj.put(columnName, value);  
            }   
            array.put(jsonObj);   
        }  
        
       return array.toString();  
    }  

}

在servlet 内

private MySQLDB mysqlDB = new MySQLDB();

实例化一个MySQLDB对象

Connection conn = mysqlDB.getConnection();
        String sql =  "select * from pie";
        PreparedStatement ps=null;
        ResultSet rs = null;
        
        
        try {
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

这里获取到Connetion, 并且从数据库内获取数据,返回结果集。

String data = null;
        
        try {
            if(rs.next()){
                data = resultSetToJson(rs);
                
            }
        } catch (JSONException | SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

将获取的结果集 转成 json格式。

转成json格式, 利用了这个方法

    public String resultSetToJson(ResultSet rs) throws SQLException,JSONException  
    {  
       // json数组  
       JSONArray array = new JSONArray();  
        
       // 获取列数  
       ResultSetMetaData metaData = rs.getMetaData();  
       int columnCount = metaData.getColumnCount();  
        
       // 遍历ResultSet中的每条数据  
        while (rs.next()) {  
            JSONObject jsonObj = new JSONObject();  
             
            // 遍历每一列  
            for (int i = 1; i <= columnCount; i++) {  
                String columnName =metaData.getColumnLabel(i);  
                
                if(columnName.equals("y")){
                    int value = rs.getInt(columnName);
                    jsonObj.put(columnName, value);  

                }else{
                    String value = rs.getString(columnName);  
                    jsonObj.put(columnName, value);  
                }
               
                //jsonObj.put(columnName, value);  
            }   
            array.put(jsonObj);   
        }  
        
       return array.toString();  
    }

打印出来就是这样的结果:

[
    {
        "indexLabel": "Wii",
        "y": 2175498
    },
    {
        "indexLabel": "Xbox 360",
        "y": 3125844
    },
    {
        "indexLabel": "Nintendo DS",
        "y": 1176121
    },
    {
        "indexLabel": "PSP",
        "y": 1727161
    },
    {
        "indexLabel": "Nintendo 3DS",
        "y": 4303364
    },
    {
        "indexLabel": "PS Vita",
        "y": 1717786
    }
]

打印出来本来是字符串。
为了好看,格式化了一下,方便查看。
注意: 需要添加 json-20160810.jar

WebContent
      -- Web-INT
         -- lib (放于这个文件夹内)

servlet 传递值 给 JSP 页面

RequestDispatcher rd = request.getRequestDispatcher("index.jsp");  
        request.setAttribute("chartData",data);//存值  
        rd.forward(request,response);//开始跳转

index.jsp 页面

在此之前,需要在 WebContent下 创建一个文件夹asset,并将canvasjs.min.js文件放入内

WebContent
      -- asset (放于这个文件夹内)
      -- Web-INT
         -- lib 

index.jsp 代码

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Pie Chart</title>
</head>
<body>
<% 
    String piadata = request.getAttribute("chartData");  
%>
<div id="chartContainer1" style="height: 400px; width: 100%;">
</body>
<script src="asset/canvasjs.min.js"></script>
<script type="text/javascript">

window.onload = function () {
    var chart = new CanvasJS.Chart("chartContainer1",
    {
        theme: "theme2",
        title:{
            text: "Gaming Consoles Sold in 2012"
        },      
        data: [
            {       
                type: "pie",
                showInLegend: true,
                toolTipContent: "{y} - #percent %",
                yValueFormatString: "#,##0,,.## Million",
                legendText: "{indexLabel}",
                dataPoints:<%out.print(piadata);%>
            }
        ]
    });
    chart.render();

}
</script>

</html>

jsp页面 获取从servlet 传递过来的数据

<% 
    String piadata = request.getAttribute("chartData");  
%>

把代码 输出到 js内

    dataPoints:<%out.print(piadata);%>

到此,基本上完成。
项目结构如下

structure.png

运行结果:

result.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,679评论 6 342
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,505评论 18 399
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,390评论 0 10
  • 利用Bintary插件将arr上传到Jcenter 以下几个步骤: 注册bintray账号(https://bin...
    ChanZeeBm阅读 919评论 0 3