洗完澡后,闲来无事来聊一聊分页功能的实现,这里我将向大家展示两种方案.
1.第一种方案:先看效果图,我这里说的分页功能是指SSH框架搭建完全没有问题的情况下做的,由于是第一次写博客,还是不够太熟练,我直接贴代码出来吧,先是我的showlist.jsp显示,然后是action层,service层,dao层的代码
这个jsp页面中的allpages变量是我在action中定义了的
<%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="addInput.jsp">新增</a> <hr> <table border="1"> <tr> <th>编号</th><th>书名</th><th>价格</th><th>数量</th><th>作者</th><th>删除</th><th>修改</th> </tr> <c:forEach items="${bookList }" var="list"> <tr> <td>${list.id }</td> <td>${list.name }</td> <td>${list.price }</td> <td>${list.bookCount }</td> <td>${list.author }</td> <td><a href="book_delete.action?bid=${list.id }">删除</a></td> <td><a href="book_load.action?bid=${list.id }">修改</a></td> </tr> </c:forEach> </table> <c:forEach begin="1" end="${allPages }" step="1" var="p"> <a href="book_list.action?pageCurrent=${p }">${p }</a> </c:forEach> </body> </html>
action层
然后跳到service层//当前页 private int pageCurrent; //总页数 private int allPages; //总记录数 private int allCount; //有些是给set方法,有些是给get方法,这里我就全部给加上set,get方法 //显示图书列表 public String list(){ bookList = bookService.list(pageCurrent); return "list"; }
实现action中bookService.list(pageCurrent)的方法
再到dao层public ArrayList<Book> list(int pageCurrent) { return bookDao.list(pageCurrent); }
pagesize变量是我定义的一个常量,给其值为5,每页显示5条数据.public ArrayList<Book> list(int pageCurrent) { Session session = sessionFactory.getCurrentSession(); String hql = "from Book"; ArrayList<Book> arrayList = (ArrayList<Book>) session.createQuery(hql) .setFirstResult((pageCurrent-1)*pageSize) .setMaxResults(pageSize).list(); return arrayList; } //再写一个计算总记录数的方法 public int countPage() { Session session = sessionFactory.getCurrentSession(); String hql = "select count(*) from Book"; allCount = ((Long)session.createQuery(hql).uniqueResult()).intValue(); allPages = allCount%pageSize==0?allCount/pageSize:(allCount/pageSize)+1; return allPages; }
这是第一种方法.
接下来第二种方式就是因为,我这只是联系代码,只用到了一个action,等到真正用在项目中时还是得改进,接下来让我先在eclipse中把第二种实现我再来述说,那我先来说说思路吧,我们以后可能需要用到n多个action我们总不能可能在每个action对应的service层dao层写同样的代码吧,这样显示代码会过于冗长,所以我们想到可以把分页的数据(像当前页数page,总页数totalPage,每页显示数pagesize,总记录数allrec,封装到一个pageBean中,值得一提的小技巧是,我们可以把显示的每一条书的数据也可以封装到pageBean里面去)
终于弄完了,还是按照老规则,以此上传showlist.jsp,action层 service层dao层的代码,这些代码都是根据我上述所说的基础上改的,有心的读者可以参照阅读
<%@page import="java.util.ArrayList"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="addInput.jsp">新增</a> <hr> <table border="1"> <tr> <th>编号</th><th>书名</th><th>价格</th><th>数量</th><th>作者</th><th>删除</th><th>修改</th> </tr> <%-- <c:forEach items="${bookList }" var="list"> --%> <s:iterator var="b" value="pb.list"> <tr> <td><s:property value="#b.id"/></td> <td> <s:property value="#b.name"/> </td> <td><s:property value="#b.price"/></td> <td><s:property value="#b.bookCount"/></td> <td><s:property value="#b.author"/></td> <td><a href="book_delete.action?bid=<s:property value="#b.id"/>">删除</a></td> <td><a href="book_load.action?bid=<s:property value="#b.id"/>">修改</a></td> </tr> </s:iterator> <%-- </c:forEach> --%> </table> <%-- <c:forEach begin="1" end="${allPages }" step="1" var="p"> <a href="book_list.action?pageCurrent=${p }">${p }</a> </c:forEach> --%> <span>第<s:property value="pb.page"/>/<s:property value="pb.totalPage"/>页 </span> <s:iterator begin="1" end="pb.totalPage" step="1" var="i"> <a href="book_list?page=<s:property value="#i"/>"> <s:property value="#i"/></a> </s:iterator> <s:if test="pb.page != 1"> <a href="book_list?page=<s:property value="1"/>"> 首页</a> <a href="book_list?page=<s:property value="pb.page-1"/>"> 上一页</a> </s:if> <s:if test="pb.page != pb.totalPage"> <a href="book_list?page=<s:property value="pb.page+1"/>"> 下一页</a> <a href="book_list?page=<s:property value="pb.totalPage"/>"> 尾页</a> </s:if> </body> </html>
这个页面加了点小功能,希望大家能参照我的运行结果的截图看得懂action层
差点忘了我另外写了一个util包,里面一个pageBean类private int page = 1;//接受页面传过来的page public int getPage() { return page; } //显示图书列表第二种方法 public String list(){ PageBean<Book> pb = bookService.list(page); System.out.println("------"+pb.toString()); ActionContext.getContext().getValueStack().set("pb", pb); return "list"; }
把所有和分页相关的数据全部存放到pageBean中,方便多个action调用,通过service层和dao层得到pageBean对象,然后把这个对象存进值栈中,页面用ognl表达式取出package com.jh.util; import java.util.List; public class PageBean<T> { private int page; private int totalPage; private int pagesize; private int allrec; private List<T> list; public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getPagesize() { return pagesize; } public void setPagesize(int pagesize) { this.pagesize = pagesize; } public int getAllrec() { return allrec; } public void setAllrec(int allrec) { this.allrec = allrec; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } @Override public String toString() { return "PageBean [page=" + page + ", totalPage=" + totalPage + ", pagesize=" + pagesize + ", allrec=" + allrec + ", list=" + list + "]"; } }
service层
这里需要在dao中写另外两个方法getCount()和listBypage(),相比读者都发现了@Override public PageBean<Book> list(int page) { int pagesize = 5; //设置当前页数 PageBean<Book> pb = new PageBean<>(); pb.setPage(page); //设置书的总记录数 int allrec = 0; allrec = bookDao.getCount(); pb.setAllrec(allrec); //设置总页数 int totalPage = 0; if(totalPage % allrec ==0){ totalPage = allrec/pagesize; }else{ totalPage = (allrec/pagesize)+1; } pb.setTotalPage(totalPage); //设置每页显示记录数 pb.setPagesize(pagesize); //设置每条数据的集合(书名,价格,数量..) int begin = (page - 1)*pagesize; List<Book> list = bookDao.listBypage(begin,pagesize); pb.setList(list); return pb; }
dao层
那么大功告成了,经过测试完全可行,运行结果见上传图片.第一次写,不足的地方还请大家多多担待,有问题或者是错误欢迎大家提出.@Override public int getCount() { String hql = "select count(*) from Book"; Session session = sessionFactory.getCurrentSession(); int allrec = ((Number) session.createQuery(hql).uniqueResult()).intValue(); return allrec; } @Override public List<Book> listBypage(int begin, int pagesize) { String hql = "from Book"; Session session = sessionFactory.getCurrentSession(); List<Book> list = session.createQuery(hql) .setFirstResult(begin) .setMaxResults(pagesize) .list(); return list; }
ps:第一张截图是第一种方式实现,其他的是第二种方式实现的,有人注意到第一页时没有首页和上一页,最后一页没有下一页和尾页,而且页码也在跟着变,虽然很简单,还望原谅我的自娱自乐!
最后说说我编程过程中遇到的问题:最容易出错的地方就是给pageBean封装数据是时,那个地方千万仔细.