这是网上一个视频教程里面讲到的一个分页功能,存在的问题有两个,首先是任何一个访问者浏览到第一页以外的页面,比如第m页,那么其它访问者浏览的结果不是第一页,而是第m页,如图上所示;其次的问题是,每显示一页都伴随着一个pager对象的产生,这会导致效率和性能问题。请各位帮忙指点,对代码进行改进或者推荐更好的分页办法,谢谢!
几个关键文件的代码贴出来
xwork.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "http://www.opensymphony.com/xwork/xwork-1.1.1.dtd"><xwork>
<include file="webwork-default.xml"></include>
<package name="default" extends="webwork-default">
<action name="browsebook" class="bookAction">
<result name="success">browsebook.jsp</result>
</action>
</package>
</xwork>BookAction.javapackage cn.gth.test.view;import java.util.List;
import java.util.Map;
import cn.gth.test.common.Pager;
import cn.gth.test.dao.IBookDao;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionSupport;@SuppressWarnings("serial")
public class BookAction extends ActionSupport {
private IBookDao bookDaoImp;
private Long catalogid;
private int currentPage = 1;

@SuppressWarnings("unchecked")
public String execute() throws Exception {
int totalSize = bookDaoImp.getTotalByCatalogid(catalogid);
Pager pager = new Pager(currentPage,totalSize);
List books = bookDaoImp.getBookByCatalogid(catalogid, currentPage, pager.getPageSize());
Map requ = (Map)ActionContext.getContext().get("request");
requ.put("books", books);
requ.put("pager", pager);
return SUCCESS;
}

public IBookDao getBookDaoImp() {
return bookDaoImp;
} public void setBookDaoImp(IBookDao bookDaoImp) {
this.bookDaoImp = bookDaoImp;
} public Long getCatalogid() {
return catalogid;
} public void setCatalogid(Long catalogid) {
this.catalogid = catalogid;
} public int getCurrentPage() {
return currentPage;
} public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
}bookDaoImp.javapackage cn.gth.test.dao.imp;import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import cn.gth.test.common.DaoSession;
import cn.gth.test.dao.IBookDao;public class BookDaoImp extends DaoSession implements IBookDao {
public List getBookByCatalogid(Long catalogid, int currentPage, int pageSize) {
Session session = this.getSession();
Query query = session.createQuery("from Book b where b.catalog.catalogid = ?");
query.setParameter(0, catalogid);
int startRow = (currentPage - 1) * pageSize;
query.setFirstResult(startRow);
query.setMaxResults(pageSize);
List books = query.list();
session.close();
return books;
} public int getTotalByCatalogid(Long catalogid) {
Session session = this.getSession();
Query query = session.createQuery("from Book b where b.catalog.catalogid = ?");
query.setParameter(0, catalogid);
List books = query.list();
int totalSize = books.size();
session.close();
return totalSize;
}
}browsebook.jsp<%@ page contentType="text/html; charset=gb2312" %>
<%@ taglib prefix="ww" uri="/webwork" %><div align="center">
<ww:set name="pager" value="#request.pager"/>
<table width="260" border="1" cellspacing="0" bordercolor="#666666">
  <tr>
    <td width="210"><div align="center">图书名称</div></td>
    <td width="50"><div align="center">价格</div></td>
  </tr>
  <ww:iterator value="#request['books']" id="book">
  <tr>
    <td><div align="center"><ww:property value="#book.bookname"/></div></td>
    <td><div align="center"><ww:property value="#book.price" /></div></td>
  </tr>
  </ww:iterator>
</table>
<ww:if test="#pager.hasFirst">
<a href="browsebook.action?currentPage=1">首页</a>
</ww:if>
<ww:if test="#pager.hasPrevious">
<a href="browsebook.action?currentPage=<ww:property value="#pager.currentPage-1"/>">前页</a>
</ww:if>
<ww:if test="#pager.hasNext">
<a href="browsebook.action?currentPage=<ww:property value="#pager.currentPage+1"/>">后页</a>
</ww:if>
<ww:if test="#pager.hasLast">
<a href="browsebook.action?currentPage=<ww:property value="#pager.totalPages"/>">尾页</a>
</ww:if>
<br>
总共<ww:property value="#pager.totalPages"/>页,当前第<ww:property value="#pager.currentPage"/>页
</div>
我把全部代码压缩了,大家有兴趣可以下载看看,把框架和jdbc的jar包导入eclipse就可以,用的webwork+spring+hibernate框架。
http://d.99081.com/gthboy/fenye.rar

解决方案 »

  1.   

    分页还是用seek定位来做比较好
      

  2.   


    哦,本人菜鸟,第一次听说seek定位,能不能详细介绍下?给几个url也行啊
      

  3.   

    建议用displaytag标签做,很简单
      

  4.   

    我的资源里有个javabean分页源码。注释的相当详细。运行效果不错
    有需要的朋友可以去看看:)
      

  5.   

    不产生pager对象,如何控制页面的显示?
    期待有好的解决方法个人认为display不怎么样!
      

  6.   

    在action的
    return SUCCESS;
    这一行前面加入下面这样一句:
    this.setCurrentPage(1);