关于使用SSH框架分页的实现以及容易出错的地方

来源:互联网 发布:淘宝母婴节是哪一天 编辑:程序博客网 时间:2024/05/17 21:14

  洗完澡后,闲来无事来聊一聊分页功能的实现,这里我将向大家展示两种方案.

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;//接受页面传过来的pagepublic 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;}@Overridepublic String toString() {return "PageBean [page=" + page + ", totalPage=" + totalPage + ", pagesize=" + pagesize + ", allrec=" + allrec+ ", list=" + list + "]";}  }
把所有和分页相关的数据全部存放到pageBean中,方便多个action调用,通过service层和dao层得到pageBean对象,然后把这个对象存进值栈中,页面用ognl表达式取出

service层

@Overridepublic 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层

@Overridepublic int getCount() {     String hql = "select count(*) from Book";     Session session = sessionFactory.getCurrentSession();    int allrec = ((Number) session.createQuery(hql).uniqueResult()).intValue();return allrec;}@Overridepublic 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封装数据是时,那个地方千万仔细.










 
原创粉丝点击