在上周的开发中,遇到这么一个需求,如图:
有这样一个导航框显示子部门,这个子部门比较多,目前27个,根据《 》翻页,之前的做法是将接口分页,每点一次《或者》就请求一次接口重新获取分页的数据,但是我觉得一开始我就已经返回了所有数据,没必要频繁请求接口,所以我就进行了优化,大概的思路:将返回的的list<子部门>分组,每5个一组,放到map中,再将map转成json返回前端,那么前端就根据我分好组,默认显示第一组,点击下一页就显示第二组,再下一页就第三组、以此类推
//初始化子部门的数据,集团默认显示的是企业下的所有数据
Office office = new Office();
office.setParentCode("GAC200");
List<Office> soList = officeService.findList(office);
//定义一个map将所有数据分组,每组5个返回大屏页面,进行一个分页的操作
Map<String, Object> soMap = new HashMap<String, Object>();
//5个一组,num记录一共有多少组
int num;
if(soList.size()%5 != 0) {
num= soList.size()/5+1;
}else {
num = soList.size()/5;
}
//将多少组也传到页面
soMap.put("count", num);
List<Office> temp = officeService.findList(office);
//定义key主要是map的key,第一组传office1第二组传office2以此类推
int key = 1;
for(int i=1;i<soList.size()+1;i++) {
temp.add(soList.get(i-1));
if( i%5 == 0) {
//够五个了也就是够一组了将改组数据放到map中
soMap.put(String.valueOf("office"+key), temp);
key++;
temp.clear();
}
}
在这个过程我遇到了一些问题,一开始我的代码是这么写的,但是在调试过程中就发现map永远只有一条数据,发现list是引用类型,我每次都是对temp进行操作,也就是永远只有一个lsit!如果子部门有27个,27%5!=0;那么length=27/5+1=6组,那么我就一共要分为6组,也就是我需要6个list,这只是我的分析,我不可能直接就定义6个list,对不对,假设哪天这个企业的子部门多了少了不再是6组了,你的代码就不再适应了!这不是我的风格,虽然能应付开发,蒙混过关,但是人要有责任心,自己也要追求进步。
这时候我就考虑到了一个问题,我能不能不返回list,list是集合,又不能再定义成数组,那有没有clone()方法,我无法再复制一个lsit,但是开辟的是两个地址空间,这时候我考虑到怎么才能动态的初始化,就是我怎么能在代码运行的时候再确定我要多少组,在我所有学习的过程中只有数组是可以动态初始化的,list不能是数组,那什么既能定义成为数组又可以保存list,我想到了对象,对象的成员属性里面是我的list <子部门>,这样不就侧面的、投机取巧的解决了动态声明list,代码如下:
定义一个对象,主要用于数据封装
package com.jeesite.modules.kwm.entity;
import java.util.ArrayList;
import java.util.List;
import com.jeesite.modules.sys.entity.Office;
/**
* 该类主要是封装分组后端的子部门数据传到大屏页面(每5个一组)
* @author liaomengdan
*
*/
public class KwmSonOffice {
List<Office> officeList;
public KwmSonOffice() {
super();
officeList = new ArrayList<Office>();
}
public KwmSonOffice(List<Office> officeList) {
super();
this.officeList = officeList;
}
public List<Office> getOfficeList() {
return officeList;
}
public void setOfficeList(List<Office> officeList) {
this.officeList = officeList;
}
}
接口层代码:
//初始化子部门的数据,集团默认显示的是企业下的所有数据
Office office = new Office();
office.setParentCode("GAC200");
List<Office> soList = officeService.findList(office);
//定义一个map将所有数据分组,每组5个返回大屏页面,进行一个分页的操作
Map<String, Object> soMap = new HashMap<String, Object>();
//5个一组,num记录一共有多少组
int num;
if(soList.size()%5 != 0) {
num= soList.size()/5+1;
}else {
num = soList.size()/5;
}
//将多少组也传到页面
soMap.put("count", num);
//动态声明KwmSonOffice对象数组并初始化,主要用于传递数据到前端
KwmSonOffice[] sonOffice =new KwmSonOffice[num];
for(int i = 0 ; i < num ; i++) {
sonOffice[i] = new KwmSonOffice();
}
//定义key主要是map的key,第一组传1第二组传2以此类推
int key = 0;
//将数组进行分组
for(int i=1;i<soList.size()+1;i++) {
sonOffice[key].getOfficeList().add(soList.get(i-1));
if( i%5 == 0) {
//够五个了也就是够一组了将改组数据放到map中
soMap.put(String.valueOf("office"+(key+1)), sonOffice[key].getOfficeList());
key++;
}
}
if(soList.size()%5 != 0) {
soMap.put(String.valueOf("office"+(key+1)), sonOffice[key].getOfficeList());
}
//将map转成json传到页面上
ObjectMapper objectMapper = new ObjectMapper();
String mapString = null;
try {
mapString = objectMapper.writeValueAsString(soMap);
} catch (Exception e) {
e.printStackTrace();
}
model.addAttribute("soList", mapString);
希望对你们有帮助,或者有更好的解决办法请告诉我,前端的代码有空我再贴