用Hibernate+Struts实现分页
tags: struts  
 
Hibernate|持久层(普通论坛) - 浏览帖子内容 (主题:1732 帖子:8293)  [本版精华]
本版斑竹: hosson  nkoffee  BruceJini 
当前位置: Java 论坛 >> J2ee技术论坛 >> Hibernate|持久层
rss-feed rdf-feed atom-feed
  主题:[原创]用Hibernate+Struts实现分页。(不知道怎么申请精华帖子,希望大家来讨论) (回复数:15 作者:XXYMJJ) 刷新   收藏本主题
XXYMJJ     
user face
  • Matrix排名:1340
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:56
  • 总积分(Karma):273
  • 参与分(经验):262
  • 专家分(威望):40
  • 可用分(财富):100
  • 类型:普通用户
  • 注册:2005-10-19
  • 进入XXYMJJ的部落格
  • [信息] [引用] [回复] 楼 主 BACK TOP

    上个星期偶然的一次机会,帮别人忙做一个Hibernate得东西,正好自己也有兴趣学习学习(^_^),对Hibernate基础掌握之后,于是乎自然而然想到了Paging问题。当时Google以下,大家都与Hibernate Paging 原理都转贴了不少,但是真正结合起来的例子然而很少(几乎没有)。那天在论坛看到一个兄弟求一个Hibernate+Struts实现分页得例子。于是昨天下午4点-6点开始着手(下班回家有天下足球阿!),后来晚上睡觉都在向这个问题(失眠才想的,不是因为想而失眠 ~郁闷)。今天上午来了看了几十封垃圾邮件后,终于作了出来(由不足的地方情大家指出)。在此鸣谢“Norther ”兄弟对我HQL的支持(才开始学哈,多谢好心人啊)。废话少说,开始写:

    前言,必读

    1:由于长促写的,难免有不周到或者还有格式上面凌乱的问题。
    2:对于Page function进行了一定的封装。用户只需要在PageBean 里面设置以下pageRecorders (每页显示条数据),然后在自己的Action里面组装自己需要的query就可以了。
    3:对于Hibernate没有进行深入研究(时间有限),所以采取了每次翻页都采用一次查询。第一次显示的时候采用了两次查询(第一次是查询Hibernate.xml里面设定的一次查询长度的所有纪录,由此推算出总数据数,总页数等等,然后赋予第一页的起始数和第一页的终止数,由query.list(); 得出第一页的数据,这里可能会有更好的改进,希望大家指点。后面得翻页主要是得到第N页的起始数和第N页的终止数)
    4: 在此鸣谢各位兄弟的支持,


    正文:
    关于Hibernate得基本配置什么的就不多说了。现在就只是写上Paging相关的代码:
    1:
    PageBean.java
    /*
    * Created on 2006-3-21
    *
    * To change the template for this generated file go to
    * Window>Preferences>Java>Code Generation>Code and Comments
    */
    package com.ibm.hibernate.beans;

    import java.util.Iterator;
    import java.util.List;

    import javax.servlet.http.HttpServletRequest;

    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Query;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.Transaction;

    /**
    * @author Johnny           //PS: My English Name
    *
    * To change the template for this generated type comment go to
    * Window>Preferences>Java>Code Generation>Code and Comments
    */
    public class PageBean {
    //        public static final String HQL_DEMO_BYNAME =
    //                "from com.ibm.hibernate.beans.Demo as e where e.name=:tempName";
    //        public static final String HQL_DEMO_BYALL =
    //                "from com.ibm.hibernate.beans.Demo as e ";

            int currentPage = 1; //当前页
            public int totalPages = 0; //总页数
            int pageRecorders = 5; //每页5条数据
            int totalRows = 0; //总数据数
            int pageStartRow = 0; //每页的起始数
            int pageEndRow = 0; //每页显示数据的终止数
            boolean hasNextPage = false; //是否有下一页
            boolean hasPreviousPage = false; //是否有前一页
            List list;
            private Demo demo;
            Iterator it;
            static PageBean pb;

            public PageBean() {
            }

            public PageBean(List list) {
                    this.list = list;
                    totalRows = list.size();
                    it = list.iterator();
                    hasPreviousPage = false;
                    currentPage = 1;
                    if ((totalRows % pageRecorders) == 0) {
                            totalPages = totalRows / pageRecorders;
                    } else {
                            totalPages = totalRows / pageRecorders + 1;
                    }

                    if (currentPage >= totalPages) {
                            hasNextPage = false;
                    } else {
                            hasNextPage = true;
                    }

                    if (totalRows < pageRecorders) {
                            this.pageStartRow = 0;
                            this.pageEndRow = totalRows;
                    } else {
                            this.pageStartRow = 0;
                            this.pageEndRow = pageRecorders;
                    }

            }

            /**
             * @return Returns the currentPage.
             */
            public String getCurrentPage() {
                    return this.toString(currentPage);
            }
            /**
             * @param currentPage The currentPage to set.
             */
            public void setCurrentPage(int currentPage) {
                    this.currentPage = currentPage;
            }
            /**
             * @return Returns the pageRecorders.
             */
            public int getPageRecorders() {
                    return pageRecorders;
            }
            /**
             * @param pageRecorders The pageRecorders to set.
             */
            public void setPageRecorders(int pageRecorders) {
                    this.pageRecorders = pageRecorders;
            }
            /**
             * @return Returns the pageEndRow.
             */
            public int getPageEndRow() {
                    return pageEndRow;
            }
            /**
             * @return Returns the pageStartRow.
             */
            public int getPageStartRow() {
                    return pageStartRow;
            }
            /**
             * @return Returns the totalPages.
             */
            public String getTotalPages() {

                    return this.toString(totalPages);
            }
            /**
             * @return Returns the totalRows.
             */
            public String getTotalRows() {
                    return this.toString(totalRows);
            }
            /**
             * @return Returns the hasNextPage.
             */
            public boolean isHasNextPage() {
                    return hasNextPage;
            }
            /**
             * @param hasNextPage The hasNextPage to set.
             */
            public void setHasNextPage(boolean hasNextPage) {
                    this.hasNextPage = hasNextPage;
            }
            /**
             * @return Returns the hasPreviousPage.
             */
            public boolean isHasPreviousPage() {
                    return hasPreviousPage;
            }
            /**
             * @param hasPreviousPage The hasPreviousPage to set.
             */
            public void setHasPreviousPage(boolean hasPreviousPage) {
                    this.hasPreviousPage = hasPreviousPage;
            }
            public void getNextPage() {

                    currentPage = currentPage + 1;
                    System.out.println("PageBean.getNextPage()正在执行;");
                    System.out.println("参数currentPage=" + currentPage);

                    if ((currentPage - 1) > 0) {
                            hasPreviousPage = true;
                    } else {
                            hasPreviousPage = false;
                    }

                    if (currentPage >= totalPages) {
                            hasNextPage = false;
                    } else {
                            hasNextPage = true;
                    }
                    System.out.println("参数hasNextPage=" + hasNextPage);
                    if (currentPage * pageRecorders < totalRows) { //判断是否为最后一页
                            pageEndRow = currentPage * pageRecorders;
                            pageStartRow = pageEndRow - pageRecorders;
                    } else {
                            pageEndRow = totalRows;
                            pageStartRow = pageRecorders * (totalPages - 1);
                    }
                    System.out.println("参数pageStartRow=" + pageStartRow);
                    System.out.println("参数pageEndRow=" + pageEndRow);
                    //                Demo[] Demos = getDemos();
                    this.description();

            }

            public void getPreviouspage() {

                    currentPage = currentPage - 1;

                    if (currentPage == 0) {
                            currentPage = 1;
                    }

                    if (currentPage >= totalPages) {
                            hasNextPage = false;
                    } else {
                            hasNextPage = true;
                    }
                    if ((currentPage - 1) > 0) {
                            hasPreviousPage = true;
                    } else {
                            hasPreviousPage = false;
                    }
                    if (currentPage * pageRecorders < totalRows) { //判断是否为最后一页
                            pageEndRow = currentPage * pageRecorders;
                            pageStartRow = pageEndRow - pageRecorders;
                    } else {
                            pageEndRow = totalRows;
                            pageStartRow = pageRecorders * (totalPages - 1);
                    }
                    System.out.println("参数pageStartRow=" + pageStartRow);
                    System.out.println("参数pageEndRow=" + pageEndRow);
                    this.description();

            }

            public String toString(int temp) {
                    String str = Integer.toString(temp);
                    return str;
            }

            public void description() {

                    String description =
                            "共有数据数:"
                                    + this.getTotalRows()
                                    + "共有页数: "
                                    + this.getTotalPages()
                                    + "当前页数为:"
                                    + this.getCurrentPage()
                                    + " 是否有前一页: "
                                    + this.isHasPreviousPage()
                                    + " 是否有下一页:"
                                    + this.isHasNextPage()
                                    + " 开始行数:"
                                    + this.getPageStartRow()
                                    + " 终止行数:"
                                    + this.getPageEndRow();

                    System.out.println(description);

            }
            /**
             * @return
             */
            public Demo getDemo() {
                    return demo;
            }

            /**
             * @param demo
             */
            public void setDemo(Demo demo) {
                    this.demo = demo;
            }

            /**
             * @return
             */
            public List getList() {
                    return list;
            }

            /**
             * @param list
             */
            public void setList(List list) {
                    this.list = list;
            }

            /**
             *
             */
            public PageBean pagingFirsttime(
                    SessionFactory factory,
                    Session session,
                    Transaction transaction,
                    String name,
                    Query query,
                    List list,
                    PageBean pb,
                    HttpServletRequest request)
                    throws HibernateException {

                    list = query.list();

                    pb = new PageBean(list);
                    query.setFirstResult(pb.getPageStartRow());
                    query.setMaxResults(pb.getPageRecorders());
                    list = query.list();

                    pb.setList(list);
                    pb.description();
                    
                    transaction.commit();
                    session.close();
                    return pb;

            }
            public PageBean paging(
                    SessionFactory factory,
                    Session session,
                    Transaction transaction,
                    String name,
                    Query query,
                    List list,
                    PageBean pb,
                    HttpServletRequest request)
                    throws HibernateException {
                    
                    query.setFirstResult(pb.getPageStartRow());
                    query.setMaxResults(pb.getPageRecorders());
                    list = query.list();

                    pb.setList(list);
                    pb.description();
            
                    transaction.commit();
                    session.close();
                    
                    return pb;
            }

    }

    msn: Johnny_issc@hotmail.com
        
      
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    编辑推荐(新闻) BEA 收购 Flashline , 加速SOA
    XXYMJJ     
    user face
  • Matrix排名:1340
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:56
  • 总积分(Karma):273
  • 参与分(经验):262
  • 专家分(威望):40
  • 可用分(财富):100
  • 类型:普通用户
  • 注册:2005-10-19
  • 进入XXYMJJ的部落格
  • [信息] [引用] [回复] 第 2 楼 BACK TOP

    PagingAction.java
    /
    *
    * Created on 2006-3-21
    *
    * To change the template for this generated file go to
    * Window>Preferences>Java>Code Generation>Code and Comments
    */
    package com.ibm.hibernate.action;

    import java.util.ArrayList;
    import java.util.List;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import net.sf.hibernate.Hibernate;
    import net.sf.hibernate.HibernateException;
    import net.sf.hibernate.Query;
    import net.sf.hibernate.Session;
    import net.sf.hibernate.SessionFactory;
    import net.sf.hibernate.Transaction;

    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;

    import com.ibm.hibernate.beans.Demo;
    import com.ibm.hibernate.beans.PageBean;
    import com.ibm.hibernate.form.QueryForm;
    import com.strutsrecipes.hibernate.plugin.HibernatePlugIn;

    /**
    * @author Johnny
    *
    * To change the template for this generated type comment go to
    * Window>Preferences>Java>Code Generation>Code and Comments
    */
    public class PagingAction extends Action {
            public static final String HQL_DEMO_BYNAME =
                    "from com.ibm.hibernate.beans.Demo as e where e.name=:tempName";
            public static final String HQL_DEMO_BYALL =
                    "from com.ibm.hibernate.beans.Demo as e ";
                    
            public ActionForward execute(
                    ActionMapping mapping,
                    ActionForm form,
                    HttpServletRequest request,
                    HttpServletResponse response)
                    throws HibernateException {

                    SessionFactory factory = null;
                    Session session = null;
                    Transaction transaction = null;
                    Query query = null;
                    List list = null;
                    PageBean pb = (PageBean) request.getSession().getAttribute("page");
                    String action = request.getParameter("action");

                    QueryForm queryForm = (QueryForm) form;
                    String name = queryForm.getName();

                    try {
                            factory =
                                    (SessionFactory) servlet.getServletContext().getAttribute(
                                            HibernatePlugIn.SESSION_FACTORY_KEY);
                            session = factory.openSession();
                            transaction = session.beginTransaction();
                            //组装Query
                            if (name == null || name.equals("")) {

                                    query = session.createQuery(HQL_DEMO_BYALL);

                            } else {

                                    query = session.createQuery(HQL_DEMO_BYNAME);

                                    query.setString("tempName", name);

                            }

                            if (action == null || action.equals("null")) { //第一次读取数据
                                    pb = new PageBean();
                                    pb =
                                            pb.pagingFirsttime(
                                                    factory,
                                                    session,
                                                    transaction,
                                                    name,
                                                    query,
                                                    list,
                                                    pb,
                                                    request);

                                    System.out.println("第一步,数据已经成功传递到Action,action=" + action);

                            } else {
                                    if (action == "nextPage" || action.equals("nextPage")) {//nextPage
                                            System.out.println("参数action=" + action);
                                            System.out.println("函数pb.getNextPage()准备执行");

                                            pb.getNextPage();
                                            pb =
                                                    pb.paging(
                                                            factory,
                                                            session,
                                                            transaction,
                                                            name,
                                                            query,
                                                            list,
                                                            pb,
                                                            request);
                                    }
                                    if (action == "previousPage"
                                            || action.equals("previousPage")) {//previousPage
                                            System.out.println("参数action=" + action);
                                            System.out.println("函数pb.getNextPage()准备执行");

                                            pb.getPreviouspage();
                                            pb =
                                                    pb.paging(
                                                            factory,
                                                            session,
                                                            transaction,
                                                            name,
                                                            query,
                                                            list,
                                                            pb,
                                                            request);

                                    }
                            }
                    } catch (Exception e) {
                            e.printStackTrace();
                            System.out.println("数据库连接出现异常");
                    }
                    request.setAttribute("page", pb);
                    request.getSession().setAttribute("page", pb);
                    return (mapping.findForward("QuerySuccess"));
            }

    }

    msn: Johnny_issc@hotmail.com
        
      
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    XXYMJJ     
    user face
  • Matrix排名:1340
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:56
  • 总积分(Karma):273
  • 参与分(经验):262
  • 专家分(威望):40
  • 可用分(财富):100
  • 类型:普通用户
  • 注册:2005-10-19
  • 进入XXYMJJ的部落格
  • [信息] [引用] [回复] 第 3 楼 BACK TOP

    Jsp 相关部分
    <logic:iterate name="page" property="list" id="Demo"
                            type="com.ibm.hibernate.beans.Demo">

                            <tr>
                                    <td><bean:define id="idint" name="Demo" property="id" type="Integer" />&nbsp;
                                    <bean:write name="Demo" property="id" /></td>

                                    <td>&nbsp;<bean:write name="Demo" property="name" /></td>
                                    <td><input type="submit" value="Delete"
                                            onclick="transfervalue('<%=idint%>')"></td>
                                    <td><input type="button" onclick="Modify('<%=idint%>')"
                                            value="Modify"></td><TR>
                    </logic:iterate>

    <TABLE width="760" border="1" cellpadding="0" cellspacing="0">
            <tr>
                    <TH><logic:equal name="page" property="hasPreviousPage" value="true">
                            <html:link page="/query.do?action=previousPage">PreviousPage</html:link>
                    </logic:equal> <logic:equal name="page" property="hasNextPage"
                            value="true">
                            <html:link page="/query.do?action=nextPage">nextPage</html:link>
                    </logic:equal> <br />
                    Total Records: <bean:write name="page" property="totalRows" /><br />
                    Total Pages: <bean:write name="page" property="totalPages" /><br />
                    CurrentPage: <bean:write name="page" property="currentPage" /><br />
                    </TH>
            </TR>
    </TABLE>



    msn: Johnny_issc@hotmail.com
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    编辑推荐(新闻) SUN官方启动OpenSSO 项目
    XXYMJJ     
    user face
  • Matrix排名:1340
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:56
  • 总积分(Karma):273
  • 参与分(经验):262
  • 专家分(威望):40
  • 可用分(财富):100
  • 类型:普通用户
  • 注册:2005-10-19
  • 进入XXYMJJ的部落格
  • [信息] [引用] [回复] 第 4 楼 BACK TOP

    第一次查询的图片
    image,以及后面的图片
    image

    msn: Johnny_issc@hotmail.com
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    Norther     
    user photo
  • Matrix排名:29
  • 排名变化:  --
  • 用户等级:6
  • 总发贴数:480
  • 总积分(Karma):2474
  • 参与分(经验):1979
  • 专家分(威望):165
  • 可用分(财富):1849
  • 类型:普通用户
  • 昵称:草原上奔跑的烈马
  • 来自:Norther
  • 注册:2005-08-23
  • 进入Norther的部落格
  • [信息] [引用] [回复] 第 5 楼 BACK TOP

    不错  顶  加5分

    From Norther I Came!
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    编辑推荐(新闻) Eclipse 升级管理器TUM 发布
    XXYMJJ     
    user face
  • Matrix排名:1340
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:56
  • 总积分(Karma):273
  • 参与分(经验):262
  • 专家分(威望):40
  • 可用分(财富):100
  • 类型:普通用户
  • 注册:2005-10-19
  • 进入XXYMJJ的部落格
  • [信息] [引用] [回复] 第 6 楼 BACK TOP

    怎么加5分
    昨天晚上写了个PropertyFileManager~~ 然后把那些什么HQL,还有指定的那些全局的变量全部放到properies里面,感觉程序好看多了,不会这么感觉到处都写斯勒的感觉

    msn: Johnny_issc@hotmail.com
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    编辑推荐(文章) 意想不到的数据库
    wzs2004     
    user face
  • Matrix排名:5658
  • 排名变化:  --
  • 用户等级:2
  • 总发贴数:1
  • 总积分(Karma):104
  • 参与分(经验):4
  • 专家分(威望):7
  • 可用分(财富):190
  • 类型:普通用户
  • 注册:2004-08-02
  • [信息] [引用] [回复] 第 7 楼 BACK TOP

    setFirstResult,setMaxResult效率不高,如果在千万条数据分页时跟蜗牛一样,最高效的应该是直接在sql就分页好
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    goodsuperstar     
    user face
  • Matrix排名:478
  • 排名变化:  --
  • 用户等级:4
  • 总发贴数:54
  • 总积分(Karma):525
  • 参与分(经验):182
  • 专家分(威望):36
  • 可用分(财富):725
  • 类型:普通用户
  • 昵称:java man
  • 注册:2004-07-08
  • 进入goodsuperstar的部落格
  • [信息] [引用] [回复] 第 8 楼 BACK TOP

    这样子的分页,已经将程序逻辑与分页逻辑耦合,比较难通用
        
            
        

    非常好 还行 一般 扔鸡蛋 总得分: 投票人次:

    yrbmayu     
    user face
  • Matrix排名:1058
  • 排名变化:  --
  • 用户等级:3
  • 总发贴数:38
  • 总积分(Karma):320
  • 参与分(经验):162
  • 专家分(威望):7
  • 可用分(财富):400
  • 类型:普通用户
  • 注册:2006-03-20
  • [信息] [引用] [回复] 第 9 楼 BACK TOP