【ExtJs】與後台資料庫互動的帶分頁表格組件grid的查詢,extjsgrid

來源:互聯網
上載者:User

【ExtJs】與後台資料庫互動的帶分頁表格組件grid的查詢,extjsgrid

ExtJs的表格組件Grid是可以分頁的,並且這個組件是隨時隨地地與後台資料庫進行這互動。正如VC的MFC中的List表格控制項一樣。

基本上,這個表格控制項作為OA系統的主角,配合《【ExtJs】利用樹狀結構、Border布局與標籤頁刻劃OA介面》(點擊開啟連結)就真的是一個完整的OA系統了。

然而網上對於此組件的敘述非常糟糕,各類雜七雜八的資料,層出不同的後端語言,讓人根本看不明白。下面舉一個例子來說明Grid組件怎麼查詢資料庫的資料,並且分頁現實出來。


一、基本目標

比如Mysql資料庫有一張使用者資訊表,如所示:


然後,我要把它放到Grid.html並且每頁2個結果地顯示出來,如:



二、基本思想

這個項目的目錄結構如:


必要的Ext資源不在上面的目錄結構中。其中Grid.html就是前台顯示頁面,formSubmit.php解釋Grid.html中傳遞過來的分頁資訊,到model.php把Mysql資料庫中的user表查詢出來,再用Ajax打回到Grid.html顯示。

formSubmit.php關鍵是列印出諸如以下的Json字串,Grid.html直接在等待接受如下的資訊,如果接受不到,會一直處於讀取的狀態:

{'success':true,'total':3,'data':[{'id':1,'username':'a','password':'b'},{'id':2,'username':'c','password':'b'},{'id':3,'username':'s','password':'b'}]}

其中total是data中一共有多少項,data是每一項的資料。


三、製作過程

1、Grid.html

首先在HTML僅僅是引入ExtJs的資源:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">        <title>ExtGrid</title>        <script type="text/javascript" src="../js/ext-all.js"></script>        <script type="text/javascript" src="../js/bootstrap.js"></script>        <script type="text/javascript" src="../js/ext-lang-zh_CN.js"></script>        <link href="../ext-theme-classic/ext-theme-classic-all.css" rel="stylesheet" type="text/css"></head><body></body></html>
之後,先構造一個User實體、對象、模型、Object什麼的,反正就是那個意思!ExtJs是這樣要求的,我也不像寫這麼複雜!
 Ext.define('user',{extend:'Ext.data.Model',fields:[{name:'id',type:'int'},{name:'username',type:'string'},{name:'password',type:'string'}]});
這個對象中的fields中的Json數組,基本上與資料庫中的表格對應,也與下面Grid表格控制項所要顯示的列對應。

其次,定義一個所謂的ExtJs資料中心store。制定這個資料中心的模型是user,還有各項屬性與各類雜七雜八的固定配置。

var userStore=Ext.create('Ext.data.Store',{model:'user',pageSize:2,//每頁顯示數目proxy:{type:'ajax',url:'formSubmit.php',//提供Json字串的頁面reader:{type:'json',root:'data',totalProperty:'total'//總項數}},autoLoad:true});
最後還是那個Grid表格控制項,這個ExtJs的表格控制項相當複雜的,要資料中心提供資料支援才能正常運行。

 Ext.create('Ext.grid.Panel',{title:'使用者資訊表',renderTo: Ext.getBody(),store:userStore,//此表格控制項的資料由userStore資料中心提供支援columns:[{text:'ID',dataIndex:'id',flex:1},{text:'使用者名稱',dataIndex:'username',flex:1},{text:'密碼',dataIndex:'password',flex:1}],bbar:{xtype:'pagingtoolbar',//底部工具列是分頁工具列store:userStore,//按照userStore的資料進行分頁displayInfo:true//顯示共XX頁,每頁顯示XX條的資訊}});

此控制項的列定義中,text為呈現給使用者的列頭,dataIndex是指明此列到底與資料中心中的model的哪一項對應。比如我在user實體中定義了username這列,那麼這裡“使用者名稱”的資料就是username這列的資料,且為string類型。flex:1代表自動列寬。

因此,整個頁面的代碼如下:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">        <title>ExtGrid</title>        <script type="text/javascript" src="../js/ext-all.js"></script>        <script type="text/javascript" src="../js/bootstrap.js"></script>        <script type="text/javascript" src="../js/ext-lang-zh_CN.js"></script>        <link href="../ext-theme-classic/ext-theme-classic-all.css" rel="stylesheet" type="text/css"></head><body></body></html><script> Ext.onReady(function(){ Ext.define('user',{extend:'Ext.data.Model',fields:[{name:'id',type:'int'},{name:'username',type:'string'},{name:'password',type:'string'}]});var userStore=Ext.create('Ext.data.Store',{model:'user',pageSize:2,//每頁顯示數目proxy:{type:'ajax',url:'formSubmit.php',//提供Json字串的頁面reader:{type:'json',root:'data',totalProperty:'total'//總項數}},autoLoad:true}); Ext.create('Ext.grid.Panel',{title:'使用者資訊表',renderTo: Ext.getBody(),store:userStore,//此表格控制項的資料由userStore資料中心提供支援columns:[{text:'ID',dataIndex:'id',flex:1},{text:'使用者名稱',dataIndex:'username',flex:1},{text:'密碼',dataIndex:'password',flex:1}],bbar:{xtype:'pagingtoolbar',//底部工具列是分頁工具列store:userStore,//按照userStore的資料進行分頁displayInfo:true//顯示共XX頁,每頁顯示XX條的資訊}}); });</script>


2、formSubmit.php

這頁,如果使用者在Grid.html定義每一頁顯示2個,那麼無論它翻到哪一頁,你都會收到limit=2這個變數,如果使用者翻到第1頁,那麼你會收到start=0這個變數,如果第2頁,則start=1,換句話說,你會收到兩個變數,你的任務就是利用這兩個變數,構造出諸如如下的Json字串,直接在這頁列印出來!

{'success':true,'total':3,//資料庫一共有多少項,這個值應該是固定的。'data':[{'id':1,'username':'a','password':'b'},{'id':2,'username':'c','password':'b'}]//在本頁中,你要grid.html顯示的東西}

因此便有了如下的語句。其中$total的值,$data字串的構造,直接利用model.php中的方法求出。搞完一大輪,把結果列印。列印$data的時候,如果這個json項,不是最後一項,則添上逗號,搞json數組,最後一項千萬不要有逗號,否則會出現《【JavaScript】數組定義末尾請不要留下逗號》(點擊開啟連結)的問題。

<?php$start=$_REQUEST["start"];$limit=$_REQUEST["limit"];include_once("model.php");$db=new db();$user=$db->getUserInfoByPaging($start,$limit);$total=$db->getUserTotalNum();$data="";for($i=0;$i<count($user);$i++){  $data.="{'id':".$user[$i]['id'].",'username':'".$user[$i]['username']."','password':'".$user[$i]['password']."'}";if(($i+1)!=count($user)){$data.=",";}}echo "{'success':true,'total':{$total},'data':[{$data}]}";?>

Jsp的使用者我建議你直接用Servlet或者SSH直接在一個Java中列印這些東西到頁面了。用諸如如下的語句即可,其中SSH則還需要用HttpServletResponse response=ServletActionContext.getResponse();取出Respond對象。

        PrintStream out = new PrintStream(response.getOutputStream());          response.setContentType("text/html;charSet=utf-8");          out.print("列印內容");  
Aspx可以利用respond.write來搞。

3、model.php

這個真的沒什麼好說的,直接在《【php】利用原生態的JavaScript Ajax為php進行MVC分層設計,相容IE6》(點擊開啟連結)已經說過了。都是一些很簡單的php操作資料庫代碼而已。反正資料庫的查詢結果通通用一個二維數組儲存起來。就是SSH中的XXList的移植版。

分頁的查詢,查詢通過把資料庫的所有結果查詢出來,再進行分頁,把分頁的結果再放到另一個數組裡面再打回formSubmit.php,這樣必定能夠準確分頁。不要根據什麼id查詢第X個項。如果這張表的id是斷層,某個使用者通過在操作資料庫之類的問題,將有可能出現不準確的分頁。

同時,按正常來說,這裡面只是操作一張表的,因此這個類命名成db沒有所謂,按正常來說,應該命名成user。這樣就真的嚴格按照那些什麼垃圾架構、團隊開發標準了。

<?php  function createCon(){      //資料庫的地址是localhost:3306,資料庫使用者名稱(第二項)是root,資料庫密碼(第三項)是root      $con=mysql_connect("localhost","root","root");      if(!$con){          die("串連失敗!");      }      //要操作test資料庫      mysql_select_db("test",$con);      //防止亂碼      mysql_query("set names utf8;");      return $con;  }  class db{public function getUserTotalNum(){        $con=createCon();          $result=mysql_query("select * from user;");        $userList=array();        for($i=0;$row=mysql_fetch_array($result);$i++){            $userList[$i]['id']=$row['id'];              $userList[$i]['username']=$row['username'];              $userList[$i]['password']=$row['password'];          }        mysql_close($con);          return count($userList);}    public function getUserInfoByPaging($start,$limit){          $con=createCon();          $result=mysql_query("select * from user;");        $userList=array();        for($i=0;$row=mysql_fetch_array($result);$i++){            $userList[$i]['id']=$row['id'];              $userList[$i]['username']=$row['username'];              $userList[$i]['password']=$row['password'];          }$user=array();for($i=0,$j=$start;$j<($start+$limit);$i++,$j++){if(empty($userList[$j])){break;}$user[$i]=$userList[$j];}        mysql_close($con);          return $user;      } }  ?> 


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.