JSP 圖表

這次目標(biāo)就是生成簡單的圖表

先上個(gè)動(dòng)圖

word.gif

文章涉及到的幾個(gè)知識(shí)點(diǎn)

  • 數(shù)據(jù)庫鏈接
  • servlet 傳遞值給 JSP頁面
  • canvasjs庫生成的圖表

首先,去 canvasjs官網(wǎng) 看一下生成圖表的一些例子

比如: 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

通過研究代碼 我們會(huì)發(fā)現(xiàn)纪铺,有一個(gè)js 數(shù)組娩梨,canvasjs 根據(jù) 這個(gè)數(shù)組的內(nèi)容生成對(duì)應(yīng)的圖表。既然如此叔扼,我們這里暫且不研究具體的canvasjs事哭, 我們目的是了解js需要什么樣的數(shù)據(jù),然后提供數(shù)據(jù)瓜富,最后生成我們需要的圖表鳍咱。

json數(shù)據(jù)

細(xì)心的讀者就會(huì)發(fā)現(xiàn),上面的 js 代碼中与柑, 有一個(gè)數(shù)組谤辜, 數(shù)組里面都是json數(shù)據(jù)澎现。

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數(shù)據(jù),可以先google查閱一下每辟,補(bǔ)充一下知識(shí)剑辫。 這里簡單說一下, 就是用于 名稱 / 值對(duì) 來表示渠欺。
上例{ y: 4181563, indexLabel: "PlayStation 3" }
y 就是一個(gè) key妹蔽,它對(duì)應(yīng)著一個(gè)value 4181563,
indexLabel 也是一個(gè) key,它對(duì)應(yīng)著一個(gè)value "PlayStation 3",挠将。

數(shù)據(jù)庫

建立數(shù)據(jù)庫 test胳岂,并創(chuàng)建表名 pie, 字段 y (int) indexLable(varchar)

table1.png

錄入數(shù)據(jù)

table2.png

用eclipse 創(chuàng)建一個(gè) Dynamic Web Project,項(xiàng)目名稱 ChartDemo

因?yàn)樾枰溄覯ySQL數(shù)據(jù)庫舔稀,我們必須引用 com.mysql.jdbc_5.1.5.jar

將此jar 包 放于

WebContent
      -- Web-INT
         -- lib (放于這個(gè)文件夾內(nèi))

在 src 內(nèi) 乳丰, 創(chuàng)建一個(gè) 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 
    */  
   //驅(qū)動(dòng)程序就是之前在classpath中配置的JDBC的驅(qū)動(dòng)程序的JAR 包中  
   public static final String DBDRIVER = "com.mysql.jdbc.Driver";  
   //連接地址是由各個(gè)數(shù)據(jù)庫生產(chǎn)商單獨(dú)提供的,所以需要單獨(dú)記住  
   public static final String DBURL = "jdbc:mysql://localhost:3306/test";  
   //連接數(shù)據(jù)庫的用戶名  
   public static final String DBUSER = "root";  
   //連接數(shù)據(jù)庫的密碼  
   public static final String DBPASS = ""; 
   
   
   Connection conn = null; //表示數(shù)據(jù)庫的連接對(duì)象 
   
   /** 
    * 建立數(shù)據(jù)庫連接 
    * @return 數(shù)據(jù)庫連接 
    */  
   public Connection getConnection() {  
       try {
           Class.forName(DBDRIVER);
       } catch (ClassNotFoundException e1) {
           // TODO Auto-generated catch block
           e1.printStackTrace();
       } //1内贮、使用CLASS 類加載驅(qū)動(dòng)程序  
       try {  
           // 獲取連接  
           conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS);  
       } catch (SQLException e) {  
           System.out.println(e.getMessage());  
       }  
       return conn;  
   } 
}

這個(gè)工具類 用于 鏈接數(shù)據(jù)庫产园,里面提供一個(gè)方法 getConnection(),返回的是一個(gè) 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);//開始跳轉(zhuǎn) 
        
        
        //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數(shù)組  
       JSONArray array = new JSONArray();  
        
       // 獲取列數(shù)  
       ResultSetMetaData metaData = rs.getMetaData();  
       int columnCount = metaData.getColumnCount();  
        
       // 遍歷ResultSet中的每條數(shù)據(jù)  
        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 內(nèi)

private MySQLDB mysqlDB = new MySQLDB();

實(shí)例化一個(gè)MySQLDB對(duì)象

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, 并且從數(shù)據(jù)庫內(nèi)獲取數(shù)據(jù)夜郁,返回結(jié)果集什燕。

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

將獲取的結(jié)果集 轉(zhuǎn)成 json格式。

轉(zhuǎn)成json格式竞端, 利用了這個(gè)方法

    public String resultSetToJson(ResultSet rs) throws SQLException,JSONException  
    {  
       // json數(shù)組  
       JSONArray array = new JSONArray();  
        
       // 獲取列數(shù)  
       ResultSetMetaData metaData = rs.getMetaData();  
       int columnCount = metaData.getColumnCount();  
        
       // 遍歷ResultSet中的每條數(shù)據(jù)  
        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();  
    }

打印出來就是這樣的結(jié)果:

[
    {
        "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 (放于這個(gè)文件夾內(nèi))

servlet 傳遞值 給 JSP 頁面

RequestDispatcher rd = request.getRequestDispatcher("index.jsp");  
        request.setAttribute("chartData",data);//存值  
        rd.forward(request,response);//開始跳轉(zhuǎn)

index.jsp 頁面

在此之前,需要在 WebContent下 創(chuàng)建一個(gè)文件夾asset,并將canvasjs.min.js文件放入內(nèi)

WebContent
      -- asset (放于這個(gè)文件夾內(nèi))
      -- 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 傳遞過來的數(shù)據(jù)

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

把代碼 輸出到 js內(nèi)

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

到此统台,基本上完成雕擂。
項(xiàng)目結(jié)構(gòu)如下

structure.png

運(yùn)行結(jié)果:

result.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饺谬,隨后出現(xiàn)的幾起案子捂刺,更是在濱河造成了極大的恐慌,老刑警劉巖募寨,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件族展,死亡現(xiàn)場離奇詭異,居然都是意外死亡拔鹰,警方通過查閱死者的電腦和手機(jī)仪缸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來列肢,“玉大人恰画,你說我怎么就攤上這事宾茂。” “怎么了拴还?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵跨晴,是天一觀的道長。 經(jīng)常有香客問我片林,道長端盆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任费封,我火速辦了婚禮焕妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弓摘。我一直安慰自己焚鹊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布韧献。 她就那樣靜靜地躺著末患,像睡著了一般。 火紅的嫁衣襯著肌膚如雪势决。 梳的紋絲不亂的頭發(fā)上阻塑,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天蓝撇,我揣著相機(jī)與錄音果复,去河邊找鬼。 笑死渤昌,一個(gè)胖子當(dāng)著我的面吹牛虽抄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播独柑,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼迈窟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忌栅?” 一聲冷哼從身側(cè)響起车酣,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎索绪,沒想到半個(gè)月后湖员,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞驱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年娘摔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唤反。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凳寺,死狀恐怖鸭津,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肠缨,我是刑警寧澤逆趋,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站晒奕,受9級(jí)特大地震影響父泳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吴汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一惠窄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漾橙,春花似錦杆融、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淘捡,卻和暖如春藕各,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焦除。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工激况, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像逻住,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浙踢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)灿渴,斷路器洛波,智...
    卡卡羅2017閱讀 134,697評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,848評(píng)論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法骚露,內(nèi)部類的語法蹬挤,繼承相關(guān)的語法,異常的語法荸百,線程的語...
    子非魚_t_閱讀 31,662評(píng)論 18 399
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題闻伶。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,411評(píng)論 0 10
  • 利用Bintary插件將arr上傳到Jcenter 以下幾個(gè)步驟: 注冊bintray賬號(hào)(https://bin...
    ChanZeeBm閱讀 945評(píng)論 0 3