数据库分页的封装类编写和在SSH中的使用

jopen 12年前

      分页,简单说就是将一大页的数据分割成两页或更多页来显示。好处在于适应屏幕的大小,避免一拉到底出现数据的漏查;坏处就是加大了服务器的附和。现在的分页方式主要有两种:1.根据需求分批从数据库调取固定size的数据,2.使用集合类一次性从数据库调取数据,再进行分页处理。今天,我讲解的是第一种分页方式。

       首先,创建web工程并搭建好SSH框架环境。在bean包下新建分页的封装类PageBean和普通Bean 类User,编写User.hbm.xml。

详细代码如下:

        PageBean

import java.util.List;  @SuppressWarnings("unchecked")  public class PageBean {      private List list; // 要返回的某一页的记录列表     private int allRow; // 总记录数   private int totalPage; // 总页数   private int currentPage; // 当前页   private int pageSize; // 每页记录数        private boolean isFirstPage; // 是否为第一页   private boolean isLastPage; // 是否为最后一页   private boolean hasPreviousPage; // 是否有前一页   private boolean hasNextPage; // 是否有下一页     public List getList() {    return list;   }     public void setList(List list) {    this.list = list;   }     public int getAllRow() {    return allRow;   }     public void setAllRow(int allRow) {    this.allRow = allRow;   }     public int getTotalPage() {    return totalPage;   }     public void setTotalPage(int totalPage) {    this.totalPage = totalPage;   }     public int getCurrentPage() {    return currentPage;   }     public void setCurrentPage(int currentPage) {    this.currentPage = currentPage;   }     public int getPageSize() {    return pageSize;   }     public void setPageSize(int pageSize) {    this.pageSize = pageSize;   }     /** */   /**    * 初始化分页信息    */   public void init() {    this.isFirstPage = isFirstPage();    this.isLastPage = isLastPage();    this.hasPreviousPage = isHasPreviousPage();    this.hasNextPage = isHasNextPage();   }     /** */   /**    * 以下判断页的信息,只需getter方法(is方法)即可    *     * @return    */     public boolean isFirstPage() {        return (currentPage == 1);// 如是当前页是第1页       }    public boolean isLastPage() {       return currentPage == totalPage; //如果当前页是最后一页      }    public boolean isHasPreviousPage() {       return currentPage != 1; //只要当前页不是第1页      }    public boolean isHasNextPage() {       return currentPage != totalPage; //只要当前页不是最后1页      }    /** */   /**    * 计算总页数,静态方法,供外部直接通过类名调用    *     * @param pageSize    *            每页记录数    * @param allRow    *            总记录数    * @return 总页数    */   public static int countTotalPage(final int pageSize, final int allRow) {    int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow      / pageSize + 1;    return totalPage;   }     /** */   /**    * 计算当前页开始记录    *     * @param pageSize    *            每页记录数    * @param currentPage    *            当前第几页    * @return 当前页开始记录号    */   public static int countOffset(final int pageSize, final int currentPage) {    final int offset = pageSize * (currentPage - 1);    return offset;   }     /** */   /**    * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替    *     * @param page    *            传入的参数(可能为空,即0,则返回1)    * @return 当前页    */   public static int countCurrentPage(int page) {    final int curPage = (page == 0 ? 1 : page);    return curPage;   }  }
              User
package com.sram.bean;  import java.util.ArrayList;  import java.util.LinkedList;  import java.util.List;    /**   * 用户bean   *    */  public class User {     private int id;   private String username;  //用户名   private String password; //密码   private String picUrl;  //图片   private String email;  //邮箱   private String tel;   //电话   private String sex;  //性别   private String job; //工作     public int getId() {    return id;   }      public String getPicUrl() {    return picUrl;   }     public void setPicUrl(String picUrl) {    this.picUrl = picUrl;   }     public void setId(int id) {    this.id = id;   }   public String getUsername() {    return username;   }   public void setUsername(String username) {    this.username = username;   }   public String getPassword() {    return password;   }   public void setPassword(String password) {    this.password = password;   }   public String getEmail() {    return email;   }   public void setEmail(String email) {    this.email = email;   }   public String getTel() {    return tel;   }   public void setTel(String tel) {    this.tel = tel;   }   public String getSex() {    return sex;   }   public void setSex(String sex) {    this.sex = sex;   }   public String getJob() {    return job;   }   public void setJob(String job) {    this.job = job;   }        }

          然后,编写Dao层的相关代码。

              User的Dao接口IUserDao.java,部分代码如下:

        void addUser(User user);   //  登录验证   User testLogin(User user) ;   //得到所有用户   public List<User> queryForPage(final String hql, final int offset,     final int length);   //得到记录总数   int getAllRowCount(String hql);
            在实现类UserDaoImpl.java中,实现对数据的分页提取

       

 public List<User> queryForPage(final String hql, final int offset,     final int length) {    List list = hibernateTemplate.executeFind(new HibernateCallback() {       public Object doInHibernate(Session session)       throws HibernateException, SQLException {      Query query = session.createQuery(hql);      query.setFirstResult(offset);      query.setMaxResults(length);      List<User> list = query.list();      return list;       }    });      return list;   }     public int getAllRowCount(String hql) {        return this.hibernateTemplate.find(hql).size();   }

           之后 , 完成service层对Dao层类方法的封装,便于action调用

           User的service层接口IUserService.java关键代码如下:

 // 添加用户   void addUser(User user);   //登录验证   User testLogin(User user) ;   //得到对应页的数据信息   public PageBean queryForPage(int pageSize,int currentPage); 

          User的service层实现类UserServiceImpl.java,部门代码实现

     

@Repository  public class UserServiceImpl implements IUserService {     @Resource   private IUserDao ud;     public void addUser(User user) {    ud.addUser(user);   }     public List<User> listUser(final int offset,      final int length) {    return ud.listUser(offset,length);   }     public User testLogin(User user) {       return ud.testLogin(user);   }   @SuppressWarnings("unchecked")   public PageBean queryForPage(int pageSize, int page) {    final String hql = "from User"; // 查询语句    int allRow = this.ud.getAllRowCount(hql); // 总记录数    int totalPage = PageBean.countTotalPage(pageSize, allRow); // 总页数    final int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录    final int length = pageSize; // 每页记录数    final int currentPage = PageBean.countCurrentPage(page);    List<User> list =this.ud.queryForPage(hql, offset, length); // "一页"的记录      // 把分页信息保存到Bean中    PageBean pageBean = new PageBean();    pageBean.setPageSize(pageSize);    pageBean.setCurrentPage(currentPage);    pageBean.setAllRow(allRow);    pageBean.setTotalPage(totalPage);    pageBean.setList(list);    pageBean.init();    return pageBean;     }    }

              接下来,主要完成action包下对请求的获取和采取的响应。

              在这里,我只对分页信息的提取部分做简单介绍:

                 1.定义分页所需的属性:

         

private PageBean pageBean; // 包含分布信息的bean  private int page; // 第几页

                  上面的属性中没有每页要显示的记录条数,是因为在方法中默认显示条数为常量。如果你需要实现分页记录的调整时,将此属性设为变量并编写其get/set方法即可获取。

                 2.对页面请求调用service方法。

 @Resource   private IUserService us;

 //查看所有用户列表   public String enterUserList() {         this.pageBean = us.queryForPage(5, page);       ServletActionContext.getRequest().setAttribute("userList",       pageBean.getList());     return "query_user";   }

               关于Struts的xml,和Spring的xml配置 就不做过多阐述。

        最后来看最终显示页面的代码如何编写:

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  <%@taglib prefix="s" uri="/struts-tags" %>  <%  String path = request.getContextPath();  String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  %>    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>    <head>      <base href="<%=basePath%>">            <title>My JSP 'index.jsp' starting page</title>   <meta http-equiv="pragma" content="no-cache">   <meta http-equiv="cache-control" content="no-cache">   <meta http-equiv="expires" content="0">       <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">   <meta http-equiv="description" content="This is my page">   <!--   <link rel="stylesheet" type="text/css" href="styles.css">   -->    </head>        <body><table>     <tr>   <th>用户名 </th>   <th>用户密码    </th>   </tr>   <s:iterator value="#request.userList" var="frist">   <tr class="gradec">   <td align="center">   <s:property value="#frist.id" />   </td>   <td align="center">   <s:property value="#frist.username" />   </td>   <td align="center">           <s:property value="#frist.password" />   </td>   </tr>   </s:iterator>   <tr class="odd">   <td>   </td>   <td>   <s:if test="%{pageBean.currentPage == 1}">         首页  上一页      </s:if>   <s:else>   <a href="user/userAction!enterUserList?page=1">首页</a>   <a href="user/userAction!enterUserList?page=<s:property value="%{pageBean.currentPage-1}"/>" />上一页</a>          </s:else>   </td>   <td>   <s:if test="%{pageBean.currentPage != pageBean.totalPage}">  <a href="user/userAction!enterUserList?page=<s:property value="%{pageBean.currentPage+1}"/>">下一页</a>
<a href="user/userAction!enterUserList?page=<s:property value="pageBean.totalPage"/>">尾页</a>          </s:if>   <s:else>       下一页  尾页       </s:else>   </td>          <td>   <div align="center">   页次   <s:property value="pageBean.currentPage" />/<s:property value="pageBean.totalPage" />共<s:property value="pageBean.allRow" />记录   </div>   <div align="center"></div>   </td>   </tr>  </table></body>  </html>
        

            至此,分页代码操作基本完成,希望初学者看懂分页原理,设计自己满意的翻页效果,不要一味复制粘贴插件代码。


来自:http://blog.csdn.net/qiyuexuel/article/details/8898021