需求:一个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方法省略)
private String key;//参数名称
private String value;//参数内容
private String key_cn;//参数中文名称 用于显示表头的title
后台获取数据方法
@RequestMapping(value = "/test.do", method = RequestMethod.POST)
public
@ResponseBody
String test(HttpServletRequest request, HttpServletResponse response, Model model, String type, String page, String rows) {
Map map = new HashMap();
List<Test> columns = licenseService.getColumns();//查询param表 获取表头信息 sql语句 SELECT `key`,`key_cn` FROM test.`param`
List<String> ids = licenseService.getIds();//查询id_params中 不重复的 id集合 SELECT DISTINCT id FROM test.`id_param` ORDER BY id
List<Map> mapputs = new ArrayList<Map>();//用于添加对 ids 每次遍历中获得的mapput
for(String id : ids){
map.put("id",id);//放入此次查询需要的id
Map mapput = new HashMap();
List<Test> list = licenseService.getTestListById(map);//根据id 获取对应key value 的list
for(Test test : list){
mapput.put(test.getKey().toLowerCase(),test.getValue());//对list进行遍历 将key value放入mapput中
}
mapputs.add(mapput);//结束一次遍历添加此次获得的mapput
}
map.put("total",ids.size());//将ids的长度作为记录的总数传入
map.put("columns",columns);
map.put("mapputs",mapputs);
return gson.toJson(map);//将对象转为json数据 gson工具类是com.google.gson
}
前端代码
<div data-options="region:'center',title:'Test'">
<table id="userList" class="easyui-datagrid" style="width:100%;" height=100% border="0px" title="Test"
data-options="rownumbers:true,singleSelect:true" pagination="true">
</table>
</div>
js代码
<script type="text/javascript">
$(function () {
var paramdata = getparam(1, 10);//首次加载 获取第一页10条记录的数据
processparam(paramdata);//处理thead和tbody信息
$("#userList").datagrid("getPager").pagination({//更换页数和每页记录数时重新加载表格数据
onSelectPage: function (pageNumber, pageSize) {
var page = pageNumber;
var rows = pageSize;
paramdata = getparam(page, rows);
processparam1(paramdata);//只加载tbody信息
}
});
}) //根据页数和每页记录数记录获取数据
function getparam(page, rows) {
var page = page;
var rows = rows;
var paramdata;
$.ajax({
url: "${pageContext.request.contextPath}/license/test.do",
async: false,//异步 false return值
data: {
"page": page,//当前页
"rows": rows,//每页记录数
},
type: 'POST',
dataType: 'json',
success: function (data) {//data后台的传过来的表字段数组
paramdata = data;
}
});
return paramdata;
} //加载columns和data数据 用于重新加载页面时第一次生成表格确定表头数据
//注意:此方法仅适用于第一次加载页面和重新加载页面生成表格 在点击下一页等使用分页功能时若使用此方法加载数据会导致表格重新生成,分页功能不可用 故在分页时使用processparam1方法只加载tbody数据 不重新生成表格
function processparam(data) {
var array = [];
var columns = [];
$(data.columns).each(function (index, el) {
array.push({field: '', title: '', width: '', align: 'center'});//初始化表头的属性
});
var successData = {
total: data.total,//总记录数
rows: data.mapputs,//每页显示行数
};
columns.push(array);
$(data.columns).each(function (index, el) {
columns[0][index]['field'] = el.key.toLocaleLowerCase();//field赋值 注意field 一定要与 后台传来的mapputs集合里mapput的key 相等!
columns[0][index]['title'] = el.key_cn;//title赋值
});
var userList = $('#userList')//加载数据 生成表格
.datagrid({
columns: columns,
data: successData,
rownumbers: true,
singleSelect: true,
pagination: true,
});
} //根据分页参数传来的page rows得到的data 加载tbody数据
function processparam1(data) {
//只加载tbody数据
var successData = {
total: data.total,
rows: data.mapputs
}
$('#userList').datagrid('loadData', successData);
}
//与主体方法无关 若需要在页面当前的page rows基础上刷新表格 可使用此方法
function reloadUserList() {
var table = $('#userList');
var options = table.datagrid('getPager').data("pagination").options;
var page = options.pageNumber;
var rows = options.pageSize;
var paramdata = getparam(page, rows);
if (paramdata.mapputs.length <= 0) {//若用户删除当前页面的最后一条记录 刷新当前页会无记录可显示 所以判断传入数据是否为空 若为空则重新加载当前页面 返回第一条页面
window.location.reload();
}
processparam1(paramdata);//不为空则加载重新获取到的数据
}
</script>