丄諦啲仇魜ヤ
如 果 敌 人 让 你 生 气 , 那 说 明 你 没 有 胜 他 的 把 握!
posts - 6,comments - 56,trackbacks - 1

  目的:

学习使用struts+hibernate实现一个通用的分页程序。

内容:

    分页程序是网页设计经常需要实现的基本功能。但有的分页程序直接嵌在jsp页面上,不仅工作量较大,代码也难以重用。本次试验将使用struts+hibernate来实现通用的分页程序。不同功能的代码尽量分离,以满足通用性要求。

    首先需要建立一个表,如下Product,各字段设计如下(可自由更改):

    ID int primary key,

    Typeid varchar(20),

Name   varchar(50),

Price    varchar(20),

Memo   varchar(100).

步骤:

建立web工程,名字为”Fenye”.

2 添加hibernate,生成Product表的.hbm.xmlpojo类。这个很简单,不再赘述。

3 接着写数据访问层,我们将其分为DaoProDao两个类。其中Dao是个公共的基类;ProDao继承它,并与action通信取得参数。这样设计的好处是:如果需要对User这个表进行分页显示,只需添加一个UserDao类,并让它继承Dao类。

Dao类的代码如下,可以根据需要添加:头文件自己导入。

public class Dao {

        private Session session=null;

        public Dao() {

           }

          

           public Session getSession()

        {

             session = HibernateSessionFactory.getSession();

               return session;       

        }

          public int getCount(String pojo)

        {

             String sql="select count(*) from "+pojo ;

             this.getSession();

           try {

           Query q = getSession().createQuery(sql);

             List cc = q.list();

             Integer rows = (Integer) cc.get(0);

           return rows.intValue();

           } catch (HibernateException ex) {

               System.out.print("ex::"+ex.getMessage());

               return 0;

           }

        }

        public List getlist(Query query, String pojo,int pagesize,int currow) throws HibernateException

       {

             List list = null;

             this.getSession();

            query.setFirstResult(currow);

             query.setMaxResults(pagesize);

             list=query.list();

             //session.flush();

             if(session!=null)

                     session.close();     

             return list;

        }

        public List getlist(Query query,int pagesize,int currow)

              {                  

                      String[] str = query.getQueryString().split("from");       

                      String[] table =str[1].trim().split(" ");        

                      System.out.println("table:"+table[0]);

                      return getlist(query,table[0],pagesize,currow);         

              }

}

ProDao类的代码如下:

public class PinfoDao extends Dao{

       private Session session;

       public PinfoDao() {

              super();

    }

       public List list(int pagesize,int currow)

       {

             

              Query query =getSession().createQuery("from PInfo");

              List li=getlist(query, pagesize, currow);

              return li;

             

       }

        public Session getSession()

        {

             // Configuration config=null;

          

             session = HibernateSessionFactory.getSession();

               return session; 

        }

       public int getCount()

       {

              String sql="select count(*) from PInfo";

              Query q = getSession().createQuery(sql);

              List cc = q.list();

              Integer a = (Integer) cc.get(0);    

              System.out.println("count:"+a.intValue());

              return a.intValue();

       }    

}

4         下面写页面控制程序,同样将代码分离为两个类Page类和Pagehelp类。

Page类处理页面相关的一些设置,如一页显示多少条记录,计算共有多少页,共有多少记录,当前页码等。

PageHelp类接收jsp页面传来的参数,并调用Page类处理。

Page类代码:

public class Page {

        private int totalRows; //总行数

           private int pageSize = 3; //每页显示的行数

           private int currentPage; //当前页号

           private int totalPages; //总页数

           private int startRow; //当前页在数据库中的起始行

           public Page(int totalRows1) {

            totalRows = totalRows1;

            totalPages=totalRows/pageSize;

            int mod=totalRows%pageSize;

            if(mod>0){

              totalPages++;

            }

            currentPage = 1;

            startRow = 0;

          }

          public int getStartRow() {

            return startRow;

          }

          public int getTotalPages() {

            return totalPages;

          }

          public int getCurrentPage() {

            return currentPage;

          }

          public int getPageSize() {

            return pageSize;

          }

          public void setTotalRows(int totalRows) {

            this.totalRows = totalRows;

          }

          public void setStartRow(int startRow) {

            this.startRow = startRow;

          }

          public void setTotalPages(int totalPages) {

            this.totalPages = totalPages;

          }

          public void setCurrentPage(int currentPage) {

            this.currentPage = currentPage;

          }

          public void setPageSize(int pageSize) {

            this.pageSize = pageSize;

          }

          public int getTotalRows() {

            return totalRows;

          }

          public void first() {

            currentPage = 1;

            startRow = 0;

          }

          public void previous() {

            if (currentPage == 1) {

              return;

            }

            currentPage--;

            startRow = (currentPage - 1) * pageSize;

          }

          public void next() {

            if (currentPage < totalPages) {

              currentPage++;

            }

            startRow = (currentPage - 1) * pageSize;

          }

          public void last() {

            currentPage = totalPages;

            startRow = (currentPage - 1) * pageSize;

          }

          public void refresh(int _currentPage) {

            currentPage = _currentPage;

            if (currentPage > totalPages) {

              last();

            }

          }

}

Pagehelp类代码如下:

public class Pagehelp {

        public static Page getPager(HttpServletRequest httpServletRequest,int totalRows) {

      //定义pager对象,用于传到页面

      Page pager = new Page(totalRows);

      //Request对象中获取当前页号

      String currentPage = httpServletRequest.getParameter("currentPage");

      //如果当前页号为空,表示为首次查询该页

      //如果不为空,则刷新page对象,输入当前页号等信息

      if (currentPage != null) {

        pager.refresh(Integer.parseInt(currentPage));

      }

      //获取当前执行的方法,首页,前一页,后一页,尾页。

      String pagerMethod = httpServletRequest.getParameter("pageMethod");

      if (pagerMethod != null) {

        if (pagerMethod.equals("first")) {

          pager.first();

        } else if (pagerMethod.equals("previous")) {

          pager.previous();

        } else if (pagerMethod.equals("next")) {

          pager.next();

        } else if (pagerMethod.equals("last")) {

          pager.last();

        }

      }

      return pager;

    }

}

5         一切准备工作结束后,下面写action来调用这些类。

List list = null;//用于输出到页面的记录集合

               int totalRows;//记录总行数

               PinfoDao dao=new PinfoDao();

               totalRows=dao.getCount();

               System.out.print("总行数=="+totalRows);

               Page page=Pagehelp.getPager(request,totalRows);

               try {

                      list= dao.list(page.getPageSize(), page.getStartRow());

               } catch (HibernateException ex) {

                   System.out.print("action里的错误="+ex.getMessage());

               }

               request.setAttribute("page",page);

               request.setAttribute("list",list);

               return mapping.findForward("list");

6         最后是显示页面plist。在struts-config.xml文件中添加forward语句,<forward name="list" path="/plist.jsp"></forward>

plist.jsp页面部分代码如下:

<table align="center" border="1">

   <tr>

   <td>产品类别</td>

   <td>产品名称</td>

   <td>产品价格</td>

   <td>产品备注</td>

   </tr>

<!—下面打印list中的各属性-->

       <tr >

   <td colspan="4">

<bean:write name="page" property="currentPage"/>

<bean:write name="page" property="totalPages" />

<html:link action="/page.do?pageMethod=first"

paramName="page" paramProperty="currentPage"

paramId="currentPage">首页</html:link>

   <html:link action="/page.do?pageMethod=previous"

paramName="page" paramProperty="currentPage"

paramId="currentPage">上一页</html:link>

   <html:link action="/page.do?pageMethod=next"

paramName="page" paramProperty="currentPage"

paramId="currentPage">下一页</html:link>

   <html:link action="/page.do?pageMethod=last"

paramName="page" paramProperty="currentPage"

paramId="currentPage">尾页</html:link>

</td>

</tr>        

</table>

7 测试:

按照上述步骤完成后,在浏览器中输入http://localhost:8080/Fenye/page.do查看页面。

posted on 2007-09-22 13:53 Crying 阅读(1677) 评论(5)  编辑  收藏 所属分类: 分页

FeedBack:
# re: hibernate分页1
2008-10-15 16:26 | 456
我用你的分面在PreDao类的 List li=getlist(query, pagesize, currow);
报错。找不到方法。请问怎么样解决?  回复  更多评论
  
# re: hibernate分页1[未登录]
2008-10-19 11:21 | Crying
@456
在DAO类中啊  回复  更多评论
  
# re: hibernate分页1
2008-10-20 15:09 | 456
你好,上次是我没有搞清楚,不好意思 。 但这次是真的报了个错。
Integer a = (Integer) cc.get(0); 类型转化不了。  回复  更多评论
  
# re: hibernate分页1
2009-01-16 16:09 | Luck_Li
不错的资源,实现了,很感谢wangsq,针对上面提出 的类型转换可以改一下,我是这样实现的:Integer rows = Integer.parseInt(cc.get(0).toString());

希望可以帮到忙。  回复  更多评论
  
# re: hibernate分页1
2012-12-14 18:41 | 婉儿
对不上号啊,你的项目不全,我也出现以上错误!!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
相关文章: