Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62786
  • 博文数量: 21
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 240
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-18 17:58
文章分类

全部博文(21)

文章存档

2011年(1)

2009年(1)

2008年(19)

我的朋友
最近访客

分类: Java

2008-06-03 18:21:33

displaytag 中的分页对于数据量不大来说是很好的,只需要简单的配置就可以做出来强大的功能,但是要注意的是分页链接的编码问题。我们知道的,这样的分页模式在数据量大时,对于性能来说是个问题,毕竟将大量的数据一次性取出来,而用到的只有少数,不是很好的选择,而Hibernate强大的分页功能,对于我们来说再简单不过了,但是却不知道如何2者结合起来使用?

下面就是一个很好的例子:只需要3部。

1) Add partialList="true" size="resultSize" to the display tag in your jsp file like so:

<display:table name="collection" cellspacing="0" cellpadding="0" requestURI=""
    defaultsort="1" id="c" pagesize="25" partialList="true" size="resultSize" class="list" export="false">




2) Modify your action file by adding a method which gets the page number from the request

public final class DisplayTagAction extends BaseAction {

  public ActionForward execute(ActionMapping mapping, ActionForm form,
      HttpServletRequest request, HttpServletResponse response)
      throws Exception {
    if (log.isDebugEnabled()) {
      log.debug("Entering 'execute' method");
    }

  TestDataManager amgr = (TestDataManager) getBean("testDataManager");

        //get the page number from request
        int page = getPage(request);
        int size = 25;
        
        //pass in page and size
        request.setAttribute("collection", amgr.getTestData(page, size);

        //get the total size of collection , required for display tag to get the pagination to work
        request.setAttribute("resultSize", new Integer(amgr.getTestDataSize()));

  return mapping.findForward("displayTagPage");

  }
  

    public int getPage(HttpServletRequest request){
      int page=0;
        Enumeration paramNames = request.getParameterNames();
        while (paramNames.hasMoreElements()) {
            String name = (String)paramNames.nextElement();
            if (name != null && name.startsWith("d-") && name.endsWith("-p")) {
                String pageValue = request.getParameter(name);
                if (pageValue != null) {
                    page = Integer.parseInt(pageValue)-1;
                }
            }
        }
        return page;
    }




3) Modify the data access call to return a paginated list.

   public List getTestData(int page, int pageSize){
  
        Query query = getSession().createQuery("from Test");
        return query.setFirstResult(page * pageSize).setMaxResults(pageSize+1).list();
   }

   public int getTestDataSize() {

        return ((Integer)getSession().createQuery("select count(*) from Test").uniqueResult()).intValue();
   }

阅读(1100) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~