參考網(wǎng)址1:http://www.aygfsteel.com/BlogJava522935502/
參考網(wǎng)址2:http://blog.csdn.net/qq522935502/
資料部分借鑒:http://www.aygfsteel.com/rongxh7/
上節(jié)課,我們完成了一個SSH整合的CRUD操作案例,并且完善了其國際化以及校驗等內(nèi)容,這節(jié)課,我們繼續(xù)加以完善,我們知道,當(dāng)我們查詢數(shù)據(jù)庫的內(nèi)容過多的時候,顯示在頁面上的內(nèi)容就比較冗長,所以分頁的實現(xiàn)就顯的十分有必要了。分頁功能的實現(xiàn)是必不可少的,掌握一到兩種分頁技術(shù)在在實際開發(fā)前是有必要的,前兩天瀏覽博客的時候看到了一個程序員的博文寫的一個分頁功能的實現(xiàn)非常好,在這里,分享給大家。
在講解分頁功能實現(xiàn)之前,大家必須對分頁有一定的了解,知道分頁的幾個要素:總記錄數(shù),每頁顯示數(shù),共幾頁,當(dāng)前頁等。
在上個例子的基礎(chǔ)上我們開始完善我們的程序。
1.首先我們先新建立一個接口MemberDao.java,把所需要用到的方法列出來:
package cn.zbvc.dao;
import java.util.List;
import cn.zbvc.bean.User;
public interface MemberDao {
/**
* 分頁查詢
* @param hql 查詢條件
* @param offset 開始記錄
* @param length 一次查詢幾條記錄
* @return 查詢的記錄集合
*/
public List<User> queryForPage(final String hql,final int offset,final int length);
/**
* 查詢所有的記錄數(shù)
* @param hql 查詢條件
* @return 總記錄數(shù)
*/
public int getAllRowCount(String hql);
}
2.然后我們創(chuàng)建其實現(xiàn)類:MemberDaoImpl.java
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.zbvc.bean.User;
import cn.zbvc.dao.MemberDao;
public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
/**
* 查詢所有的記錄數(shù)
* @param hql 查詢條件
* @return 總記錄數(shù)
*/
public int getAllRowCount(String hql) {
return this.getHibernateTemplate().find(hql).size();
}
/**
* 分頁查詢
* @param hql 查詢條件
* @param offset 開始記錄
* @param length 一次查詢幾條記錄
* @return 查詢的記錄集合
*/
@SuppressWarnings("unchecked")
public List<User> queryForPage(final String hql, final int offset, final int length) {
Session session = this.getSession();
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
List<User> list = q.list();
System.out.println(list.size());
session.close();
return list;
}
大家可以看到,我們一共定義了兩個方法,第一個方式是獲取數(shù)據(jù)庫表的總記錄數(shù),第二個方法是獲取我們想要獲取的某一頁的數(shù)據(jù)集合,傳遞的三個參數(shù)分別是:查詢條件、開始的記錄、結(jié)束的記錄。
細(xì)心的讀者會發(fā)現(xiàn),這個類繼承了HibernateDaoSupport類,HibernateDaoSupport是Spring提供的對Hibernate支持的類,在其參數(shù)內(nèi),我們能像原生的Hibernate一樣調(diào)用query.setFirstResult(offset)和query.setMaxResults(length)來實現(xiàn)分頁查詢功能。
3.然后我們需要建立一個獲取分頁信息的pageBean.java:
import java.util.List;
import cn.zbvc.bean.User;
public class PageBean {
private List<User> list; //要返回的某一頁的記錄列表
private int allRow; //總記錄數(shù)
private int totalPage; //總頁數(shù)
private int currentPage; //當(dāng)前頁
private int pageSize; //每頁的記錄數(shù)
private boolean isFirstPage; //是否為當(dāng)前第一頁
private boolean isLastPage; //是否為最后一頁
private boolean hasPreviousPage; //是否有前一頁
private boolean hasNextPage; //是否有下一頁
Set and get方法

PageBean中的具體方法:
/**
* 初始化分頁信息
*/
public void init(){
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
}
/**
* 計算總頁數(shù) 靜態(tài)方法
* @param pageSize 每頁的記錄數(shù)
* @param allRow 總記錄數(shù)
* @return 總頁數(shù)
*/
public static int countTatalPage(final int pageSize,final int allRow){
int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;
return toalPage;
}
/**
* 計算當(dāng)前頁開始的記錄
* @param pageSize 每頁記錄數(shù)
* @param currentPage 當(dāng)前第幾頁
* @return 當(dāng)前頁開始記錄號
*/
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize * (currentPage - 1);
return offset;
}
/**
* 計算當(dāng)前頁,若為0或者請求的URL中沒有“?page = ”則用1代替
* @param page 傳入的參數(shù)(可能為空,即0 則返回1)
* @return
*/
public static int countCurrentPage(int page){
final int curpage = (page == 0 ? 1 : page);
return curpage;
} }
4.業(yè)務(wù)邏輯層的實現(xiàn):我們現(xiàn)在就只操作User,現(xiàn)在我們在UserService中定義一個方法:
* 分頁查詢
* @param pageSize 每頁顯示多少記錄
* @param currentPage 當(dāng)前頁
* @return 封裝了分頁信息的bean
*/
public PageBean queryForPage(int pageSize,int page);
5.使用UserServiceImpl實現(xiàn)這個具體方法:
* 分頁查詢
* @param pageSize 每頁顯示多少記錄
* @param currentPage 當(dāng)前頁
* @return 封裝了分頁信息的bean
*/
public PageBean queryForPage(int pageSize, int page) {
final String hql = "from User user order by user.id"; //查詢語句
int allRow = memberDao.getAllRowCount(hql); //總記錄數(shù)
int totalPage = PageBean.countTatalPage(pageSize, allRow); //總頁數(shù)
final int offset = PageBean.countOffset(pageSize, page); //當(dāng)前頁開始記錄
final int length = pageSize; // 每頁記錄數(shù)
final int currentPage = PageBean.countCurrentPage(page); // 當(dāng)前頁
List list = memberDao.queryForPage(hql, offset, length); //
//把分頁信息保存到Bean當(dāng)中
PageBean pageBean = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
return pageBean;
}
6.然后我們?yōu)榱瞬挥绊懮弦粋€例子,我們新創(chuàng)建一個ListUserAction2.java:
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.zbvc.bean.User;
import cn.zbvc.service.UserService;
import cn.zbvc.util.PageBean;
public class ListUserAction2 extends ActionSupport {
private UserService service;//通過Spring創(chuàng)建業(yè)務(wù)層對象 使用set方法依賴注入
private PageBean pageBean; //封裝了分頁信息和數(shù)據(jù)內(nèi)容的pageBean
private List<User> listUser;//用于儲存pageBean當(dāng)中被封裝的User信息
private int page = 1; //表示從網(wǎng)頁中返回的當(dāng)前頁的值 默認(rèn)為1 表示默認(rèn)顯示第一頁內(nèi)容
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<User> getListUser() {
return listUser;
}
public void setListUser(List<User> listUser) {
this.listUser = listUser;
}
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public void setService(UserService service) {
this.service = service;
}
public String execute()throws Exception{
this.pageBean = service.queryForPage(5, page);//獲取封裝了分頁信息和數(shù)據(jù)的pageBean
this.listUser = this.pageBean.getList(); //獲取數(shù)據(jù)
return SUCCESS;
}
}
7.配置applicationContext.xml和struts.xml的相關(guān)信息,這里省略了。
8.在listUser2.jsp頁面中添加分頁內(nèi)容:
<tr>
<td colspan="6" align="center" bgcolor="#5BA8DE">
共<s:property value="allRow"/>條記錄
共<s:property value="totalPage"/>頁
當(dāng)前第<s:property value="currentPage"/>頁<br>
<s:if test="%{currentPage == 1}">
第一頁 上一頁
</s:if>
<!-- currentPage為當(dāng)前頁 -->
<s:else>
<a href="listUser2.action?page=1">第一頁</a>
<a href="listUser2.action?page=<s:property value="%{currentPage-1}"/>">上一頁</a>
</s:else>
<s:if test="%{currentPage != totalPage}">
<a href="listUser2.action?page=<s:property value="%{currentPage+1}"/>">下一頁</a>
<a href="listUser2.action?page=<s:property value="totalPage"/>">最后一頁</a>
</s:if>
<s:else>
下一頁 最后一頁
</s:else>
</td>
</tr>
</s:iterator>
9.查看效果:
10.思考總結(jié)
關(guān)于分頁功能實現(xiàn),應(yīng)該是有有很多種解決方法,我介紹的這種解決方案是為了給大家一個
范例,讓大家明白分頁功能實現(xiàn)的原理,其中,大部分的內(nèi)容借鑒了之前提到的網(wǎng)址。接下來的時間,我會繼續(xù)學(xué)習(xí)關(guān)于分頁功能的其它實現(xiàn)方式,然后分享給大家,另外,還會繼續(xù)的整理SSH的整合。