1. 程式人生 > >SSM pageHelper + 前端 Bootstraptbale分頁 + 解析巢狀的二級json資料

SSM pageHelper + 前端 Bootstraptbale分頁 + 解析巢狀的二級json資料

ssm  後臺使用pageHelper 分頁外掛 前端使用Bootstraptable 外掛   

廢話不多說  先上圖

為了大家能更快的掌握 ,我不加其他花哨的內容    bootstrapboot 裡的屬性我就設定了常用幾個

下面是jsp頁面的程式碼   一共要引入5個檔案  注意引入js的先後順序  jquery 在前

bootstrap.min.css

bootstrap-table.css

jquery-3.2.1.min.js    我用的是3.2.1

bootstrap.min.js

bootstrap-table.js

bootstrap-table-zh-CN.js   支援中文的

jsp 頁面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html>
<html lang="zh">

<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<!--引入 bootstrap.min.css-->
<link rel="stylesheet" href="${pageContext.request.contextPath }/statics/css/bootstrap.min.css" />

<!--引入bootstrap-table.css-->
<link rel="stylesheet" href="${pageContext.request.contextPath }/statics/css/bootstrap-table.css" />

<!--引入jquery-->
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/jquery-3.2.1.min.js"></script>

<!--引入bootstrap.min.js -->
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/bootstrap.min.js"></script>

<!--引入bootstrap-table.js -->
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/bootstrap-table.js"></script>

<!--引入bootstrap-table-zh-CN.js-->
<script type="text/javascript" src="${pageContext.request.contextPath }/statics/js/bootstrap-table-zh-CN.js"></script>

</head>

<body>
	<div class="panel panel-default">
		<div class="panel-body"><h2>學生資訊表</h2></div>
	</div>
	<!-- table 標籤 -->
	<table></table>
</body>
</html>


<script type="text/javascript">
	//專案根路徑
	var path = '${pageContext.request.contextPath}';
	$('table').bootstrapTable({
		method : 'post',                                   // 向伺服器請求方式
		contentType : "application/x-www-form-urlencoded", // 如果是post必須定義
		url : path + '/getData',                           //請求後臺的URL(*)
		pageSize : 2,                                      // 每頁的記錄行數(*)
		pageNumber : 1,                                    // table初始化時顯示的頁數
		pageList : [ 2, 5, 10 ],                           //可供選擇的每頁的行數(*)
		sidePagination : "server",                         //分頁方式:client客戶端分頁,server服務端分頁(*)  bootstrap-table要求伺服器返回的json須包含:total rows
		cache : false,                                     // 是否使用快取,預設為true,所以一般情況下需要設定一下這個屬性(*)
		striped : true,                                    // 隔行變色
		pagination : true,                                 // 是否啟用分頁
		showRefresh : true,                                //是否顯示重新整理按鈕
		showToggle : true,                                 //是否顯示詳細檢視和列表檢視的切換按鈕預設true
		showToggle : true,                                 //是否顯示詳細檢視和列表檢視的切換按鈕預設true
		silent : true,                                     // 設定重新整理事件
            	queryParams : function(params) {   //params為bootstraptable自帶的    //  請求引數,傳到伺服器的引數
			return {
				pageSize : params.limit,                   // 每頁顯示數量
				pageNumber : params.offset,                // 顯示第幾頁
			}
		},
		columns : [                                        //頁面需要展示的列,後端互動物件的屬性  
			{
				field : 'stuNo',                           // 返回json資料中的name
				title : '學生編號',                           // 表格表頭顯示文字
				align : 'center',                          // 左右居中
				valign : 'middle'                          // 上下居中
			}, {
				field : 'stuName',
				title : '姓名'
			}, {
				field : 'gradeName',
				title : '年級編號'
			}, {
				field : 'stuGender',
				title : '性別'
			}, {
				field : 'stuBirthday',
				title : '生日'
			}, {
				field : 'enterDate',
				title : '入學時間'
			}, {
				field : 'createBy',
				title : '建立者'
			}, {
				field : 'createTime',
				title : '建立時間'
			}, {
				field : 'modifyBy',
				title : '修改者'
			}, {
				field : 'modifyTime',
				title : '修改時間'
			},
			{
				title : '操作',
				align : 'center',
				formatter : function(value, row, index) {
					return '<button class="btn btn-primary btn-sm" onclick="del(\'' + row.stuNo + '\')">刪除</button>';
				}
			} ],
			
			
		onLoadSuccess : function() {               //載入成功時執行
			//alert("success");
			console.info("載入成功");
		}, //載入成功時執行的方法
		onLoadError : function() {                 //載入失敗時執行
			//alert("error");
			console.info("載入資料失敗");
		}, //載入失敗時執行的方法

		
		
		responseHandler : function(res) { //載入伺服器資料之前的處理程式,可以用來格式化資料。引數:res為從伺服器請求到的資料。如果你的json格式沒有巢狀可以不必寫
			                                      
			// 把res.rows中巢狀的json物件取出來追加到res.rows中    	
			for (var i = 0; i < res.rows.length; i++) {
				var grade = res.rows[i].gradeList[0];
				for (var key in grade) {
					//如果grade的鍵值等於gradeName 就追加
					if (key == "gradeName") {
						var k = key;
						var value = grade[key];
						res.rows[i][k] = value;
					}
				}
			}

			//把res.rows 中的 gradeList刪除
			for (var i = 0; i < res.rows.length; i++) {
				delete res.rows[i]["gradeList"];
			}
			//返回格式化好的json資料
			return res;
		}
	});
</script>










</html>

由於我後臺傳來的json格式是巢狀的  bootstraptable 無法獲取到巢狀的值 所以要在表格渲染之前對json處理

如果後臺傳來的json是這樣的: total 為後臺傳過來的總記錄數  rows 是傳過來渲染表格的資料  

rows裡沒有巢狀  則不需要處理  

{"total" : 6 ,  "rows"   : [ {"name" : "李四", "age": "20" },{"name" : "張三", "age": "21" }  ] } rows裡沒有巢狀  則不需要處理  

rows裡又嵌套了一層 grade物件   grade裡的屬性和值在bootstraptable裡拿不出來的 就要在表格渲染之前處理這個json資料

{"total" : 6 ,  "rows"   : [ {"name" : "李四", "age": "20","grade":[{"gradeNo":"101"},{"gradeName":"三班"}] },{"name" : "張三", "age": "21","grade":[{"gradeNo":"101"},{"gradeName":"三班"}] }  ] }  
我從後臺傳來的json如下
{"total":6,"rows":[{"age":8,"classNumber":"03","createBy":"孔子","createTime":"2018-04-25 14:19","enterDate":"2018-04-25","gradeList":[{"createBy":"孔子","createTime":"2018-04-25 14:19","gradeName":"三班","modifyBy":"孔子","modifyTime":"2018-04-25 14:57"}],"modifyBy":"孔子","modifyTime":"2018-04-25 14:57","stuBirthday":"2010-02-03","stuGender":"女","stuName":"李濤","stuNo":"0007"},{"age":35,"classNumber":"03","createBy":"孔子","createTime":"2018-04-25 12:51","enterDate":"2018-04-30","gradeList":[{"createBy":"孔子","createTime":"2018-04-25 12:51","gradeName":"三班"}],"stuBirthday":"1983-02-09","stuGender":"男","stuName":"郭德綱","stuNo":"0009"}]}
我的處理方式如下
responseHandler : function(res) { //載入伺服器資料之前的處理程式,可以用來格式化資料。引數:res為從伺服器請求到的資料。如果你的json格式沒有巢狀可以不必寫
			                                      
			// 把後臺傳來的資料中 rows中巢狀的json物件gradeList 的屬性gradeName取出來追加到rows中    	
			for (var i = 0; i < res.rows.length; i++) {
				var grade = res.rows[i].gradeList[0];
				for (var key in grade) {
					//如果grade的鍵值等於gradeName 就追加 gradeName到rows中 

					if (key == "gradeName") {
						var k = key;
						var value = grade[key];
						res.rows[i][k] = value;
					}
				}
			}

			//把res.rows 中的 gradeList刪除
			for (var i = 0; i < res.rows.length; i++) {
				delete res.rows[i]["gradeList"];
			}
			//返回格式化好的json資料
			return res;
		}

處理之後的json資料  
{"total":6,"rows":[{"age":8,"classNumber":"03","createBy":"孔子","createTime":"2018-04-25 14:19","enterDate":"2018-04-25","modifyBy":"孔子","modifyTime":"2018-04-25 14:57","stuBirthday":"2010-02-03","stuGender":"女","stuName":"李濤","stuNo":"0007","gradeName":"三班"},{"age":35,"classNumber":"03","createBy":"孔子","createTime":"2018-04-25 12:51","enterDate":"2018-04-30","stuBirthday":"1983-02-09","stuGender":"男","stuName":"郭德綱","stuNo":"0009","gradeName":"三班"}]}

後臺Controller的程式碼如下

package com.xuan.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.validation.groups.Default;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.alibaba.fastjson.JSONArray;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xuan.pojo.Student;
import com.xuan.service.StudentService;
@Controller
public class TestController {

	@Autowired
	StudentService studentService;

	@RequestMapping("/index")
	public String enter() {
		return "test/table";
	}
	
	/**
	 * @param pageNumber
	 * @param pageSize
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/getData")
	//前臺傳來的引數  pageNumber:顯示第幾頁    ,pageSize:頁面的大小
	public String getData(@RequestParam(value = "pageNumber") int pageNumber, @RequestParam("pageSize") int pageSize) {
		
		//呼叫PageHelper的startPage靜態方法傳入分頁要的引數:  第幾頁 和頁面大小 
		PageHelper.startPage(pageNumber, pageSize);
		
		//呼叫service查詢 得到一個lisi 集合 我的Student物件裡包含了一個grade集合
		List<Student> studentList = studentService.ListStudent();
		
		//使用PageInfo 的有參構造傳入上面呼叫Service得到的集合 得到pageInfo物件  此物件不僅包含了分頁查詢得到的結果 還有分頁的引數 如 總記錄數,總頁數等等   
		PageInfo<Student> pageInfo = new PageInfo<Student>(studentList);
		
		//因為bootstraptable接收渲染資料的引數時會以鍵名為rows的接收     所以新建一個集合取出pageinfo物件中查詢到集合賦值給它
		List<Student> rows = pageInfo.getList();
		
		//取出總記錄數
		int totlal = (int) pageInfo.getTotal();
		
		//把總記錄數和查詢到的集合裝到一個map物件嗎中  
		Map<String, Object> results = new HashMap<String, Object>();
		results.put("rows", rows);
		results.put("total", totlal);

		//使用JSONArray的toJSONString方法不map 集合解析為json格式 並返回給前臺頁面
		return JSONArray.toJSONString(results);
	}
}

service 方法:

	@Override
	public List<Student> ListStudent() {
		return studentMapper.ListStudent();
	

dao介面:

List<Student> ListStudent();

mapper.xml:

	<resultMap id="gradeMap" type="com.xuan.pojo.Grade">
		<id column="gradeNo" property="gradeNo" jdbcType="VARCHAR" />
		<result column="gradeName" property="gradeName" jdbcType="VARCHAR" />
		<result column="createBy" property="createBy" jdbcType="VARCHAR" />
		<result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
		<result column="modifyBy" property="modifyBy" jdbcType="VARCHAR" />
		<result column="modifyTime" property="modifyTime" jdbcType="TIMESTAMP" />
	</resultMap>

	<resultMap id="studentMap" type="com.xuan.pojo.Student">
		<id column="stuNo" property="stuNo" jdbcType="VARCHAR" />
		<result column="classNumber" property="classNumber" jdbcType="VARCHAR" />
		<result column="stuName" property="stuName" jdbcType="VARCHAR" />
		<result column="stuGender" property="stuGender" jdbcType="VARCHAR" />
		<result column="stuBirthday" property="stuBirthday" jdbcType="DATE" />
		<result column="enterDate" property="enterDate" jdbcType="DATE" />
		<result column="createBy" property="createBy" jdbcType="VARCHAR" />
		<result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
		<result column="modifyBy" property="modifyBy" jdbcType="VARCHAR" />
		<result column="modifyTime" property="modifyTime" jdbcType="TIMESTAMP" />
		<collection property="gradeList" ofType="com.xuan.pojo.Grade" 
			resultMap="gradeMap" />
	</resultMap>

	<select id="ListStudent" resultMap="studentMap">
		SELECT
		gra.`gradeName`,stu.*
		FROM student stu
		JOIN grade gra ON (gra.`gradeNo` = stu.`classNumber`)
	</select>

student Bean    student裡有一個 grade集合 

package com.xuan.pojo;

import java.util.Date;
import java.util.List;

import org.springframework.format.annotation.DateTimeFormat;

import com.alibaba.fastjson.annotation.JSONField;

public class Student {
	private String stuNo;

	private String classNumber;

	private String stuName;

	private String stuGender;

	@DateTimeFormat(pattern = "yyyy-MM-dd")
	@JSONField(format = "yyyy-MM-dd")
	private Date stuBirthday;
	
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	@JSONField(format = "yyyy-MM-dd")
	private Date enterDate;

	private String createBy;
	
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	@JSONField(format = "yyyy-MM-dd HH:mm")
	private Date createTime;

	private String modifyBy;
	
	@JSONField(format = "yyyy-MM-dd HH:mm")
	private Date modifyTime;


	private List<Grade> gradeList;

	public List<Grade> getGradeList() {
		return gradeList;
	}

	public void setGradeList(List<Grade> gradeList) {
		this.gradeList = gradeList;
	}

	@SuppressWarnings("deprecation")
	public Integer getAge() {
		Date date = new Date();
		return date.getYear() - stuBirthday.getYear();
	}

	public String getStuNo() {
		return stuNo;
	}

	public void setStuNo(String stuNo) {
		this.stuNo = stuNo == null ? null : stuNo.trim();
	}

	public String getClassNumber() {
		return classNumber;
	}

	public void setClassNumber(String classNumber) {
		this.classNumber = classNumber == null ? null : classNumber.trim();
	}

	public String getStuName() {
		return stuName;
	}

	public void setStuName(String stuName) {
		this.stuName = stuName == null ? null : stuName.trim();
	}

	public String getStuGender() {
		return stuGender;
	}

	public void setStuGender(String stuGender) {
		this.stuGender = stuGender == null ? null : stuGender.trim();
	}

	public Date getStuBirthday() {
		return stuBirthday;
	}

	public void setStuBirthday(Date stuBirthday) {
		this.stuBirthday = stuBirthday;
	}

	public Date getEnterDate() {
		return enterDate;
	}

	public void setEnterDate(Date enterDate) {
		this.enterDate = enterDate;
	}

	public String getCreateBy() {
		return createBy;
	}

	public void setCreateBy(String createBy) {
		this.createBy = createBy == null ? null : createBy.trim();
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public String getModifyBy() {
		return modifyBy;
	}

	public void setModifyBy(String modifyBy) {
		this.modifyBy = modifyBy == null ? null : modifyBy.trim();
	}

	public Date getModifyTime() {
		return modifyTime;
	}

	public void setModifyTime(Date modifyTime) {
		this.modifyTime = modifyTime;
	}
}

grade Bean:

package com.xuan.pojo;

import java.util.Date;
import java.util.List;


import com.alibaba.fastjson.annotation.JSONField;

public class Grade {
    private String gradeNo;

    private String gradeName;

    private String createBy;
	@JSONField(format="yyyy-MM-dd HH:mm")
    private Date createTime;

    private String modifyBy;
    @JSONField(format="yyyy-MM-dd HH:mm")
    private Date modifyTime;
    

	public String getGradeNo() {
        return gradeNo;
    }

    public void setGradeNo(String gradeNo) {
        this.gradeNo = gradeNo == null ? null : gradeNo.trim();
    }

    public String getGradeName() {
        return gradeName;
    }

    public void setGradeName(String gradeName) {
        this.gradeName = gradeName == null ? null : gradeName.trim();
    }

    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy == null ? null : createBy.trim();
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public String getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(String modifyBy) {
        this.modifyBy = modifyBy == null ? null : modifyBy.trim();
    }

    public Date getModifyTime() {
        return modifyTime;
    }

    public void setModifyTime(Date modifyTime) {
        this.modifyTime = modifyTime;
    }
}