1. 程式人生 > >Spring MVC框架下,HTML網頁讀取資料庫資料填充Echarts

Spring MVC框架下,HTML網頁讀取資料庫資料填充Echarts

一、背景

專案需要展示人車的關聯關係,車使用車牌號標識,人使用ID來標識。Unity中嵌入了一個web視窗來呼叫後臺html頁面然後顯示。html需要以Echarts中力導向圖的形式顯示出人車關聯關係。如下圖Echarts示例中一樣。下面分為幾個步驟實現:

1. 編寫一個html頁面,同時引入echart.js外掛和jquery外掛。實現echarts官網上的如下關係圖

2.使用jquery封裝的ajax請求MVC的controller介面。然後將資料填充給具體的echarts圖表

二、HTML頁面

網際網路環境下,src如下,如果是離線情況下,直接寫js所在的包即可。 使用echart3

將如下的html網頁命名為relation.html,然後放在Java Web專案的webapp/views目錄下。echart.js放在webapp/js目錄下。在瀏覽器訪問 http://localhost:8080/cityGurd/views/relation.html即可顯示關係圖。

<script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.js"></script>。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.js"></script>
</head>
<body>
    <!-- 為ECharts準備一個具備大小(寬高)的Dom -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
 var myChart = echarts.init(document.getElementById('main'));
       var option={
 title: {
            text:"echarts關係圖demo"
            },
             series: [{
                itemStyle: {                
                    normal: {
                        label: {
                            position: 'top',
                            show: true,
                            textStyle: {
                                color: '#333'
                            }
                        },
                        nodeStyle: {
                            brushType: 'both',
                            borderColor: 'rgba(255,215,0,0.4)',
                            borderWidth: 1
                        },
                        linkStyle: {
                            normal: {
                                color: 'source',
                                curveness: 0,
                                type: "solid"
                            }
                        }
                    },

                },
                     force:{
                    initLayout: 'circular',//初始佈局
                    repulsion:100,//斥力大小
                },

                animation: false,
                name:"",
                type: 'graph',//關係圖型別
                layout: 'force',//引力佈局
                roam: true,//可以拖動
              //  legendHoverLink: true,//是否啟用圖例 hover(懸停) 時的聯動高亮。
               // hoverAnimation: false,//是否開啟滑鼠懸停節點的顯示動畫
               // coordinateSystem: null,//座標系可選
              //  xAxisIndex: 0, //x軸座標 有多種座標系軸座標選項
              //  yAxisIndex: 0, //y軸座標 
               // ribbonType: true,
                useWorker: false,
                minRadius: 15,
                maxRadius: 25,
                gravity: 1.1,

                scaling: 1.1,
                nodes: [{ "id": 0, "category": 0, "name": "深水稻【60D】", "label": "深水稻【60D】", "symbolSize": 40, "ignore": false, "flag": true },
                    { "id": "1", "category": 1, "name": "Deep減water rice", "label": "Deep減water rice", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": "r", "category": 1, "name": "D浮稻", "label": "D浮稻", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": "f", "category": 1, "name": "D澱稻", "label": "D澱稻", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": "k", "category": 1, "name": "S1水稻", "label": "S1水稻", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": 5, "category": 2, "name": "S2不育系 ", "label": "S2不育系 ", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": 6, "category": 2, "name": "S2不育系", "label": "S2不育系", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": 7, "category": 2, "name": "S2人為土", "label": "S2人為土", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": 8, "category": 2, "name": "S2 土壤型別(人為)", "label": "S2 土壤型別(人為)", "symbolSize": 20, "ignore": true, "flag": true },
                    { "id": 9, "category": 2, "name": "S2稻", "label": "S2稻", "symbolSize": 20, "ignore": true, "flag": true }
                ],//資料內容
                //接收格式均為json物件陣列
                [{ "source": 1, "target": 0, "name": "EnglishName" },
                    { "source": 2, "target": 0, "name": "equipment" },
                    { "source": 3, "target": 0, "name": "equipment" },
                    { "source": 5, "target": "k", "name": "superClass" },
                    { "source": 6, "target": 4, "name": "superClass" },
                    { "source": 7, "target": 4, "name": "superClass" },
                    { "source": 8, "target": 4, "name": "superClass" },
                    { "source": 9, "target": 4, "name": "superClass" },
                    { "source": 4, "target": 0, "name": "superClass" }
                ]//關係對應
            } ]            
}
   myChart.setOption(option);//將option新增到mychart中
    </script>
</body>
</html>

三、HTMl頁面加入ajax

(1)ajax 常用格式

$.ajax的一般格式

$.ajax({

     type: 'POST',

     url: url ,

    data: data ,

    success: success ,

    dataType: dataType

});

 

二、$.ajax的引數描述

引數 描述
url	必需。規定把請求傳送到哪個 URL。
data	可選。對映或字串值。規定連同請求傳送到伺服器的資料。
success(data, textStatus, jqXHR)	可選。請求成功時執行的回撥函式。
dataType	
可選。規定預期的伺服器響應的資料型別。
預設執行智慧判斷(xml、json、script 或 html)。
 

三、$.ajax需要注意的一些地方:

  1.data主要方式有三種,html拼接的,json陣列,form表單經serialize()序列化的;通過dataType指定,不指定智慧判斷。

  2.$.ajax只提交form以文字方式,如果非同步提交包含<file>上傳是傳過不過去,需要使用jquery.form.js的$.ajaxSubmit

(2)ajax data常用格式

<script type="text/javascript">
    //第一種寫法(拼接URL)
    function getFormInfo(){
        var name='wen';
        var user='chen';
        $.ajax({
         url: "/login/authenticate?name="+name+"&user="+user,
         type: "POST",
         data:{},
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
            console.log(err.statusText);
            console.log('異常');
          }
        });
    }
    //第二種寫法(表單序列化為json資料)
    function getFormInfo(){
        var params=$('#login').serializeJSON();
        console.log(params);
        $.ajax({
         url: "http://192.168.10.32:6833/login/authenticate",
         type: "POST",
         data:params,
         cache:false,
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
          }
        });
    }
    // 第三種寫法(表單序列化為字串)
    function getFormInfo(){
        var params=$('#login').serialize();
        console.log(params);
        $.ajax({
         url: "http://192.168.10.32:6833/login/authenticate",
         type: "POST",
         data:params,
         cache:false,
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
          }
        });
    }
    //第四種寫法(帶json資料)
    function getFormInfo(){
        $.ajax({
         url: "http://192.168.10.32:6833/login/authenticate",
         type: "POST",
         data:{
            name:'chem',
            user:'wen'
         },
         cache:false,
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
          }
        });
    }
    //第五種寫法(拼接data)
    function getFormInfo(){
        var name='chen';
        var user='wen';
        $.ajax({
         url: "http://192.168.10.32:6833/login/authenticate",
         type: "POST",
         data:'name='+name+'&user='+user,
         cache:false,
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
          }
        });
    }
    //第六種寫法(既有全部直接獲取表單中的資料又有單獨出來的資料)
    function getFormInfo(){
        var params=$('#login').serializeJSON();
        console.log(params);
        params.height='20';
        $.ajax({
         url: "http://192.168.10.32:6833/login/authenticate",
         type: "POST",
         data:params,
         cache:false,
         dataType: "json",
         success: function(data){
             
          },
          error:function(err){
          }
        });
    }
    </script>

 (3)通過url將引數傳遞到html,然後js獲取url中的引數,傳給MVC的controller介面去查詢指定資料

1、獲取Url引數部分

  function GetUrlPara()
  {
    var url = document.location.toString();
    var arrUrl = url.split("?");

    var para = arrUrl[1];
    return para;
  }

  呼叫方法:GetUrlPara()

  舉例:假如當前 Url 是 http// www. liangshunet. com/pub/item.aspx?t=osw7,則擷取到的引數部分為:t=osw7。

2、獲取當前相對路徑的方法
首先獲取 Url,然後把 Url 通過 // 截成兩部分,再從後一部分中擷取相對路徑。如果擷取到的相對路徑中有引數,則把引數去掉。

  function GetUrlRelativePath()
  {
    var url = document.location.toString();
    var arrUrl = url.split("//");

    var start = arrUrl[1].indexOf("/");
    var relUrl = arrUrl[1].substring(start);//stop省略,擷取從start開始到結尾的所有字元

    if(relUrl.indexOf("?") != -1){
      relUrl = relUrl.split("?")[0];
    }
    return relUrl;
  }

  呼叫方法:GetUrlRelativePath();

舉例:假如當前 Url 是 http// www. liangshunet. com/pub/item.aspx?t=osw7,則擷取到的相對路徑為:/pub/item.aspx。
3、獲取當前Url的4種方法
var url = window.location.href;

  var url = self.location.href;

  var url = document.URL;

  var url = document.location;

  ie 位址列顯示的是什麼,獲取到的 url 就是什麼。
4、js獲取當前域名有2種方法
    1、方法一

  var domain = document.domain;

 

  2、方法二

  var domain = window.location.host;

 

  3、注意問題

  由於獲取到的當前域名不包括 http://,所以把獲取到的域名賦給 a 標籤的 href 時,別忘了加上 http://,否則單擊連結時導航會出錯。

(4)如果url中的引數在js中讀取之後,編碼有問題。就使用decodeURI去解碼即可。

    HTML中的$("form").serialize()函式,在submit按鈕點選時,將form表單中含有name的input整理成一個“name=aaa&pass=bbb”這樣的字串,使用get方法請求時會將此字串新增到請求url後面作為引數字尾,如果請求內容中存在漢字(即form表單中需要傳輸的input中有漢字),漢字將轉換為一種由“%”開頭的編碼。下面是常用的兩種編碼方式:
1.encodeURI編碼

定義和用法::   encodeURI() 函式可把字串作為 URI 進行編碼。
語           法:    encodeURI(URIstring)
引數    描述:    URIstring  必需。一個字串,含有 URI 或其他要編碼的文字。 
返    回   值:    URIstring 的副本,其中的某些字元將被十六進位制的轉義序列進行替換。
說           明:    該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。

該編碼方法的目的是對 URI 進行完整的編碼,因此對以下在 URI 中具有特殊含義的 ASCII 標點符號,encodeURI() 函式是不會進行轉義的:;/?:@&=+$,#

2.encodeURIComponent() 編碼

定義和用法:   encodeURIComponent() 函式可把字串作為 URI 元件進行編碼。
語           法:   encodeURIComponent(URIstring)
引數    描述:  URIstring  必需。一個字串,含有 URI 元件或其他要編碼的文字。 
返    回   值:   URIstring 的副本,其中的某些字元將被十六進位制的轉義序列進行替換。
說           明:  該方法不會對 ASCII 字母和數字進行編碼,也不會對這些 ASCII 標點符號進行編碼: - _ . ! ~ * ' ( ) 。
                        其他字元(比如 :;/?:@&=+$,# 這些用於分隔 URI 元件的標點符號),都是由一個或多個十六進位制的轉義序列替換        的。

解碼方式:

encodeURI()編碼的解碼函式為 decodeURI()

encodeURIComponent()編碼的解碼函式為 decodeURIComponent(),

 (5)對字串進行JSON格式化

什麼是json?

什麼是json,json是什麼,json如何使用
JSON是一種取代XML的資料結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網路傳輸資料將減少更多流量從而加快速度,

那麼,JSON到底是什麼?

JSON就是一串字串 只不過元素會使用特定的符號標註。

{} 雙括號表示物件

[] 中括號表示陣列

"" 雙引號內是屬性或值

: 冒號表示後者是前者的值(這個值可以是字串、數字、也可以是另一個數組或物件)

所以 {"name": "Michael"} 可以理解為是一個包含name為Michael的物件

而[{"name": "Michael"},{"name": "Jerry"}]就表示包含兩個物件的陣列

當然了,你也可以使用{"name":["Michael","Jerry"]}來簡化上面一部,這是一個擁有一個name陣列的物件

ps:現在還有很多人存在一些誤區,為什麼{name:'json'}在檢驗時通過不了,
那是因為JSON官網最新規範規定

如果是字串,那不管是鍵或值最好都用雙引號引起來,所以上面的程式碼就是{"name":"json"}

不要反駁,官網就是這麼定義的。


JS字串轉換成JSON的四種方法:

1、jQuery外掛支援的轉換方式: 

 

示例:

 $.parseJSON( jsonstr ); //jQuery.parseJSON(jsonstr),可以將json字串轉換成json物件 

 

2、瀏覽器支援的轉換方式(Firefox,chrome,opera,safari,ie)等瀏覽器:

 

示例:

 

JSON.parse(jsonstr); //可以將json字串轉換成json物件 

JSON.stringify(jsonobj); //可以將json物件轉換成json對符串 

 

注:ie8(相容模式),ie7和ie6沒有JSON物件,推薦採用JSON官方的方式,引入json.js。 

 

3、Javascript支援的轉換方式: 

eval('(' + jsonstr + ')'); //可以將json字串轉換成json物件,注意需要在json字元外包裹一對小括號 

 注:ie8(相容模式),ie7和ie6也可以使用eval()將字串轉為JSON物件,但不推薦這些方式,這種方式不安全eval會執行json串中的表示式。 

 

4、JSON官方的轉換方式: 

 

http://www.json.org/提供了一個json.js,這樣ie8(相容模式),ie7和ie6就可以支援JSON物件以及其stringify()和parse()方法; 

可以在https://github.com/douglascrockford/JSON-js上獲取到這個js,一般現在用json2.js。

 (5)經過上面的知識,就可以寫出如下的html程式碼,瀏覽器訪問:http://cityGurd/views/relation.html?car_number = ABC即可實現藉由MVC controller從資料庫查詢車牌號對應資料,然後填充到echarts的目的。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script type="text/javascript" src="/cityGud/js/echarts.js"></script>
    <script type="text/javascript" src="/cityGud/js/jquery-3.3.1.js"></script>
</head>
<body>
    <!-- 為ECharts準備一個具備大小(寬高)的Dom -->
    <div id="main" style="width: 600px;height:400px;margin:0 auto"></div>
    <script type="text/javascript">
    var url = document.location.toString();
	var arrUrl = url.split("?");
	var carParam = arrUrl[1];
	var carParamArr = carParam.split("=");
	var car_number =decodeURI(carParamArr[1]).toString();
	//var param = "{\"args\":'{\"region\":\"1\",\"car_number\":"+car_number+"}'}";
	var param = "{\"region\":\"1\",\"car_number\":"+ car_number +"}";
	//var param = "{args:'{\"region\":\"1\",\"car_number\":\"雲H8H182\"}'}";
    var myChart = echarts.init(document.getElementById('main'));
    var master;
   
    var option={
	    		 			title: {
	    		           		 text:"echarts關係圖demo"
	    		            },
    		             series: [{
    		                itemStyle: {                
    		                    normal: {
    		                        label: {
    		                            position: 'top',
    		                            show: true,
    		                            textStyle: {
    		                                color: '#333'
    		                            }
    		                        },
	    		                        nodeStyle: {
	    		                            brushType: 'both',
	    		                            borderColor: 'rgba(255,215,0,0.4)',
	    		                            borderWidth: 1
	    		                        },
    		                        linkStyle: {
    		                            normal: {
    		                                color: 'source',
    		                                curveness: 0,
    		                                type: "solid"
    		                            }
    		                        }
    		                    },

    		                },
    		                force:{
    		                    initLayout: 'circular',//初始佈局
    		                    repulsion:100,//斥力大小
    		                },

    		                animation: false,
    		                name:"",
    		                type: 'graph',//關係圖型別
    		                layout: 'force',//引力佈局
    		                roam: true,//可以拖動
    		              //  legendHoverLink: true,//是否啟用圖例 hover(懸停) 時的聯動高亮。
    		               // hoverAnimation: false,//是否開啟滑鼠懸停節點的顯示動畫
    		               // coordinateSystem: null,//座標系可選
    		              //  xAxisIndex: 0, //x軸座標 有多種座標系軸座標選項
    		              //  yAxisIndex: 0, //y軸座標 
    		               // ribbonType: true,
    		                useWorker: false,
    		                minRadius: 15,
    		                maxRadius: 25,
    		                gravity: 1.1,

    		                scaling: 1.1,
    		                nodes: [],//資料內容
    		                //接收格式均為json物件陣列
    		                links:[]//關係對應
    		            } ]            
    		}
	myChart.setOption(option);

    //非同步獲取資料
    $.ajax({
		type:"POST",
		url:"/cityGud/analysis_car/car_graph?args=" + param,
		dataType:"json",
		data:{},
		success:function(data){
			console.log(data.mas);
			console.log(data.sec);
			myChart.setOption({
				series: [{
				    nodes:data.mas,
		    		links:data.sec
				}]
		    });//將option新增到mychart中
		},
		error:function(err){
			console.log(param);
			//console.log($.parseJSON(param));
		}
	}); 

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