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