目的:
学习使用struts+hibernate实现一个通用的分页程序。
内容:
    分页程序是网页设计经常需要实现的基本功能。但有的分页程序直接嵌在jsp页面上,不仅工作量较大,代码也难以重用。本次试验将使用struts+hibernate来实现通用的分页程序。不同功能的代码尽量分离,以满足通用性要求。
    首先需要建立一个表,如下Product,各字段设计如下(可自由更改):
    ID int primary key,
    Typeid varchar(20),
Name   varchar(50),
Price    varchar(20),
Memo   varchar(100).
步骤:
1 建立web工程,名字为”Fenye”.
2 添加hibernate,生成Product表的.hbm.xml和pojo类。这个很简单,不再赘述。
3 接着写数据访问层,我们将其分为Dao和ProDao两个类。其中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 阅读(1716) 
评论(5)  编辑  收藏  所属分类: 
分页