本章介绍的是非常简单易懂的分页功能实现,适用数据量不大,以及想学习分页的思想的同学参考
废话不多说。分页的实现功能好几种,有的是把数据直接取出来放在一个定义的list <bean>中,再进行逻辑处理的正确的显示到页面中。同时也有一些现成的框架比如说 thymeleaf模板中也有分页,但是原理都差不多。
我要介绍的传统的分页的思想是,根据数据库的select * from table limit 0,4,这句语句,它的意思是说,查询数据从下标为0的数组到下标为4的这些数据。既是4个数据,下一条就是4,8。以此类推,所以在我们在操作分页的时候,利用这句话,就可以实现分页了。
分页还涉及到首页、跳转到某一页的、尾页的功能,因此我们需要定义一个list集合,用来存放需要分页的数据以及它的总数共有多少条数据,一页分几个数据,能也成几个页面。这些数据
代码呈上。
先定义一个工具类 PageUtil
public class PageUtil<T> { //属性 private int pageNumber;//总记录数 private int pageCount;//总页数 private int pageIndex;//当前页 private int pageSize;//每页大小 private List<T>list;//当前页的数据 public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; } public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getPageIndex() { return pageIndex; } public void setPageIndex(int pageIndex) { this.pageIndex = pageIndex; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } }
数据查询的代码,用的是mybatis持久层,我分的是8条一页
<!--这是请假事务总数查询的代码--> <select id="pageCount" resultType="int"> select count(*) from leave_affair </select>
<!--这是总请假事务分页的查询代码--> <select id="findLeavePage" parameterType="int" resultType="Model.Student"> SELECT leave_affair.sno,sclass,sname,reason,longtime,status,starttime,endtime from student,leave_affair WHERE student.sno=leave_affair.sno limit #{index},8 </select> Dao和Services(简单的附上主要代码)
@Dao */ List<Student> findLeavePage(int index); /** * 这是数量的页数 * @return */ int pageCount();
@Service
@Override public int getPageCount() { return userDao.pageCount(); } @Override public List<Student> findLeavePage(int index) { return userDao.findLeavePage(index); }
这是一个测试类的Controller @RequestMapping("/getLeaveYes.do") public ModelAndView testPage(HttpServletRequest request, Model model){ //pageIndex是分页的时候需要的参数 if (request.getParameter("pageIndex") != null) { pageIndex = Integer.parseInt(request.getParameter("pageIndex")); }//对页面上的分页标签传的值,进行获取,也是就点击'上一页或者下一页'传过来的pageindex pageUtil.setPageIndex(pageIndex);//保存至工具类 number = userService.getPageCount();//调用service层方法计算出总数据量,就是多少条数据. pageUtil.setPageNumber(number);//保存至工具类 pageUtil.setPageSize(pageSize);//保存至工具类 pageUtil.setPageCount((int) Math.ceil((double) (pageUtil .getPageNumber() / pageUtil.getPageSize())) + 1);//计算出总页数,并封装到工具类 int index = (pageIndex - 1) * pageSize;//计算出每一页从数据库中第几条数据开始取值,也就是limit后面的第一个数字 list = userService.findLeavePage(index);//调用service层的方法,取得数据库中的值 pageUtil.setList(list);//保存到工具类中的集合 model.addAttribute("url","getLeaveYes.do");//这是传递一个页面中的URL model.addAttribute("pageUtil", pageUtil);//传递到页面,存入值栈中 ModelAndView mv=new ModelAndView("teacher/T_student_affair"); mv.addObject("pageUtil",pageUtil); return mv; }
接下来的是页面,用的是jsp,用了JSTL(Java server pages standarded tag library,即JSP标准标签库)
<c:forEach items="${pageUtil.list}" var="list"> <tr> <td>${list.sno}</td> <td>${list.sclass}</td> <td>${list.sname}</td> <td>${list.reason}</td> <td>${list.longtime}</td></tr>
<!--这是分页div--> <div id="page all" style="font-size: 19px"> <b>共${pageUtil.pageNumber}</b>条,当前第<span>${pageUtil.pageIndex}</span>页 <a href="${url}?pageIndex=1" class='first'>首页</a> <a href="${url}?pageIndex=${pageUtil.pageIndex>1?pageUtil.pageIndex-1:1}" class='pre'>上一页</a> <c:forEach begin="1" end="${pageUtil.pageCount}" var="i"> <a href="tech/${url}?pageIndex=${i}" style="text-decoration: none;">${i}</a> </c:forEach> <a href="${url}?pageIndex=${pageUtil.pageIndex<pageUtil.pageCount?pageUtil.pageIndex+1:pageUtil.pageCount}" class='next'>下一页</a> <a href="${url}?pageIndex=${pageUtil.pageCount}" class='last'>末页</a> </div>
分页的div就是利用查询工具中的PageUtil,以及传递到Controller中的两个参数,URL和pageIndex,页数来判断,是否还有数据查询。有的话就构造完整的数据库查询语句。