數據庫分頁的封裝類編寫和在SSH中的使用

jopen 11年前發布 | 22K 次閱讀 分頁 JEE框架

      分頁,簡單說就是將一大頁的數據分割成兩頁或更多頁來顯示。好處在于適應屏幕的大小,避免一拉到底出現數據的漏查;壞處就是加大了服務器的附和。現在的分頁方式主要有兩種: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;
}

}</pre>              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;
    

    }

}</pre>

          然后,編寫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();
}</pre><br />

           之后 , 完成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;

}

}</pre>
              接下來,主要完成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";
}</pre><br />

               關于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></pre>

<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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!