需求:一個id對應多個key value 將id作為標識列 key值作為表頭 value作為值顯示。數據表可分為兩張表
param數據表:
下表一個id對應上表多個key及value 如下圖 id_param數據表:
然后將這些對應關系在前端顯示成這樣(頁數及總記錄沒有顯示,但可實現分頁功能)
方法思路:
1.獲取param的key value 作為 columns當做表頭信息 key作為表頭的field,value作為表頭的title;
2.獲取id_param的所有id(不重復的),構成ids,ids的size 作為總記錄數;
3.新建一個map的list對象mapputs。對ids進行遍歷,每次遍歷的id作為查詢條件查詢id_param獲取每條id對應的key,value,構成一個HashMap對象 mapput。每次遍歷結束將mapput加入mapputs中。
實現代碼:
創建實體類Test(getter setter方法省略)
1 private String key;//參數名稱 2 private String value;//參數內容 3 private String key_cn;//參數中文名稱 用於顯示表頭的title
后台獲取數據方法
1 @RequestMapping(value = "/test.do", method = RequestMethod.POST) 2 public 3 @ResponseBody 4 String test(HttpServletRequest request, HttpServletResponse response, Model model, String type, String page, String rows) { 5 Map map = new HashMap(); 6 List<Test> columns = licenseService.getColumns();//查詢param表 獲取表頭信息 sql語句 SELECT `key`,`key_cn` FROM test.`param` 7 List<String> ids = licenseService.getIds();//查詢id_params中 不重復的 id集合 SELECT DISTINCT id FROM test.`id_param` ORDER BY id 8 List<Map> mapputs = new ArrayList<Map>();//用於添加對 ids 每次遍歷中獲得的mapput 9 for(String id : ids){ 10 map.put("id",id);//放入此次查詢需要的id 11 Map mapput = new HashMap(); 12 List<Test> list = licenseService.getTestListById(map);//根據id 獲取對應key value 的list 13 for(Test test : list){ 14 mapput.put(test.getKey().toLowerCase(),test.getValue());//對list進行遍歷 將key value放入mapput中 15 } 16 mapputs.add(mapput);//結束一次遍歷添加此次獲得的mapput 17 } 18 map.put("total",ids.size());//將ids的長度作為記錄的總數傳入 19 map.put("columns",columns); 20 map.put("mapputs",mapputs); 21 return gson.toJson(map);//將對象轉為json數據 gson工具類是com.google.gson 22 }
前端代碼
1 <div data-options="region:'center',title:'Test'"> 2 <table id="userList" class="easyui-datagrid" style="width:100%;" height=100% border="0px" title="Test" 3 data-options="rownumbers:true,singleSelect:true" pagination="true"> 4 </table> 5 </div>
js代碼
1 <script type="text/javascript"> 2 $(function () { 3 var paramdata = getparam(1, 10);//首次加載 獲取第一頁10條記錄的數據 4 processparam(paramdata);//處理thead和tbody信息 5 $("#userList").datagrid("getPager").pagination({//更換頁數和每頁記錄數時重新加載表格數據 6 onSelectPage: function (pageNumber, pageSize) { 7 var page = pageNumber; 8 var rows = pageSize; 9 paramdata = getparam(page, rows); 10 processparam1(paramdata);//只加載tbody信息 11 } 12 }); 13 }) 14 15 //根據頁數和每頁記錄數記錄獲取數據 16 function getparam(page, rows) { 17 var page = page; 18 var rows = rows; 19 var paramdata; 20 $.ajax({ 21 url: "${pageContext.request.contextPath}/license/test.do", 22 async: false,//異步 false return值 23 data: { 24 "page": page,//當前頁 25 "rows": rows,//每頁記錄數 26 }, 27 type: 'POST', 28 dataType: 'json', 29 success: function (data) {//data后台的傳過來的表字段數組 30 paramdata = data; 31 } 32 }); 33 return paramdata; 34 } 35 36 //加載columns和data數據 用於重新加載頁面時第一次生成表格確定表頭數據 37 //注意:此方法僅適用於第一次加載頁面和重新加載頁面生成表格 在點擊下一頁等使用分頁功能時若使用此方法加載數據會導致表格重新生成,分頁功能不可用 故在分頁時使用processparam1方法只加載tbody數據 不重新生成表格 38 function processparam(data) { 39 var array = []; 40 var columns = []; 41 $(data.columns).each(function (index, el) { 42 array.push({field: '', title: '', width: '', align: 'center'});//初始化表頭的屬性 43 }); 44 var successData = { 45 total: data.total,//總記錄數 46 rows: data.mapputs,//每頁顯示行數 47 }; 48 columns.push(array); 49 $(data.columns).each(function (index, el) { 50 columns[0][index]['field'] = el.key.toLocaleLowerCase();//field賦值 注意field 一定要與 后台傳來的mapputs集合里mapput的key 相等! 51 columns[0][index]['title'] = el.key_cn;//title賦值 52 }); 53 var userList = $('#userList')//加載數據 生成表格 54 .datagrid({ 55 columns: columns, 56 data: successData, 57 rownumbers: true, 58 singleSelect: true, 59 pagination: true, 60 }); 61 } 62 63 //根據分頁參數傳來的page rows得到的data 加載tbody數據 64 function processparam1(data) { 65 //只加載tbody數據 66 var successData = { 67 total: data.total, 68 rows: data.mapputs 69 } 70 $('#userList').datagrid('loadData', successData); 71 } 72 //與主體方法無關 若需要在頁面當前的page rows基礎上刷新表格 可使用此方法 73 function reloadUserList() { 74 var table = $('#userList'); 75 var options = table.datagrid('getPager').data("pagination").options; 76 var page = options.pageNumber; 77 var rows = options.pageSize; 78 var paramdata = getparam(page, rows); 79 if (paramdata.mapputs.length <= 0) {//若用戶刪除當前頁面的最后一條記錄 刷新當前頁會無記錄可顯示 所以判斷傳入數據是否為空 若為空則重新加載當前頁面 返回第一條頁面 80 window.location.reload(); 81 } 82 processparam1(paramdata);//不為空則加載重新獲取到的數據 83 } 84 </script>