洗完澡后,闲来无事来聊一聊分页功能的实现,这里我将向大家展示两种方案.
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层
//当前页
private int pageCurrent;
//总页数
private int allPages;
//总记录数
private int allCount;
//有些是给set方法,有些是给get方法,这里我就全部给加上set,get方法
//显示图书列表
public String list(){
bookList = bookService.list(pageCurrent);
return "list";
}
然后跳到service层
实现action中bookService.list(pageCurrent)的方法
public ArrayList<Book> list(int pageCurrent) {
return bookDao.list(pageCurrent);
}
再到dao层
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;
}
pagesize变量是我定义的一个常量,给其值为5,每页显示5条数据.
这是第一种方法.
接下来第二种方式就是因为,我这只是联系代码,只用到了一个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层
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";
}
差点忘了我另外写了一个util包,里面一个pageBean类
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 + "]";
}
}
把所有和分页相关的数据全部存放到pageBean中,方便多个action调用,通过service层和dao层得到pageBean对象,然后把这个对象存进值栈中,页面用ognl表达式取出
service层
@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中写另外两个方法getCount()和listBypage(),相比读者都发现了
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封装数据是时,那个地方千万仔细.