本章介绍的是非常简单易懂的分页功能实现,适用数据量不大,以及想学习分页的思想的同学参考
废话不多说。分页的实现功能好几种,有的是把数据直接取出来放在一个定义的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,页数来判断,是否还有数据查询。有的话就构造完整的数据库查询语句。