由于组内要求做一个简单的查询页面,继整合mybatis之后又有一个分页功能。搜了下mybatis分页功能,基本是通过拦截器来拦截带有分页要求的sql请求,由于我个人对拦截器理解不足,加上需要更改配置文件等等,先自己模拟了个分页功能,具体思路是通过mysql自带的limit来进行指定位置指定数目的查询。
首先说下limit的用法,很简单,有两个参数的情况下 limit param1,param2; 代表截取检索结果从第param1为止开始的param2个条目,这里就用到了这个用法。
service层需要两个函数来支持:queryByConditions和queryCountByConditions,即按照条件查找信息列表和按照条件获取数目。
public List<EleAccount> queryByConditions(String dueBillNo, String idNo, String custName, int location, int offset); public int queryCountByConditions(String dueBillNo, String idNo, String custName);
其中获取检索列表比获取数目多了两个参数:location和offset。location是根据前台传来的页码加上每页数目算出的检索起始位置,offset是每页显示数目,自己设定。
前台传向controller的参数,除了平常的检索条件外,多一个curPage,表示当前页码。
前台页面跳转部分,我显示了首页,当前页码-2到当前页码+2 尾页。具体前台分页部分代码:
1 <c:if test = "${not empty results}"><a href="javascript:void(0);" onclick="submit(1)">首页</a></c:if> 2 <c:if test = "${curPage-2>0}"><a href="javascript:void(0);" onclick="submit(${curPage-2})">${curPage-2}</a></c:if> 3 <c:if test = "${curPage-1>0}"><a href="javascript:void(0);" onclick="submit(${curPage-1})">${curPage-1}</a></c:if> 4 <c:if test = "${not empty results}">${curPage}</c:if> 5 <c:if test = "${curPage+1<=totalPage}"><a href="javascript:void(0);" onclick="submit(${curPage+1})">${curPage+1}</a></c:if> 6 <c:if test = "${curPage+2<=totalPage}"><a href="javascript:void(0);" onclick="submit(${curPage+2})">${curPage+2}</a></c:if> 7 <c:if test = "${curPage+1<=totalPage}"><a href="javascript:void(0);" onclick="submit(${curPage+1})">下一页</a></c:if> 8 <c:if test = "${not empty results}"><a href="javascript:void(0);" onclick="submit(${totalPage})">尾页</a></c:if>
通过c:if标签控制是否显示对应的页码,curPage即当前页码。submit(curPage)函数如下:
1 var curPage = document.getElementById("curPage"); 2 var submitButton = document.getElementById("submit"); 3 function submit(curPageInt){ 4 curPage.value = curPageInt; 5 submitButton.click(); 6 }
controller部分如下:
1 public ModelAndView result(@RequestParam("dueBillNo")String dueBillNo, 2 @RequestParam("custName")String custName, 3 @RequestParam("idNo")String idNo, 4 @RequestParam("curPage")Integer curPage){ 5 Integer pageSize = 10; 6 if(curPage == null||curPage == 0){ 7 curPage = 1; 8 } 9 //查询所需结果 10 Integer size = eleAccountService.queryCountByConditions(dueBillNo, idNo, custName); 11 Integer totalPage = 0; 12 if(size%pageSize == 0){ 13 totalPage = size/pageSize; 14 }else{ 15 totalPage = size/pageSize + 1; 16 } 17 List<EleAccount> eleAccounts = eleAccountService.queryByConditions(dueBillNo, idNo, custName, (curPage-1)*pageSize, pageSize); 18 ModelMap modelMap = new ModelMap(); 19 modelMap.put("curPage", curPage); 20 modelMap.put("totalPage", totalPage); 21 modelMap.put("dueBillNo", dueBillNo); 22 modelMap.put("custName", custName); 23 modelMap.put("idNo", idNo); 24 modelMap.put("results", eleAccounts); 25 return new ModelAndView("/result",modelMap); 26 }
实现方法因为是自己想的,所以做的比较粗糙,而且如果有多个分页的话,这样实现有点麻烦,具体如何优化,看以后有什么思路吧~