參考網址1:http://www.aygfsteel.com/BlogJava522935502/
參考網址2:http://blog.csdn.net/qq522935502/
資料部分借鑒:http://www.aygfsteel.com/rongxh7/
上節課,我們完成了一個SSH整合的CRUD操作案例,并且完善了其國際化以及校驗等內容,這節課,我們繼續加以完善,我們知道,當我們查詢數據庫的內容過多的時候,顯示在頁面上的內容就比較冗長,所以分頁的實現就顯的十分有必要了。分頁功能的實現是必不可少的,掌握一到兩種分頁技術在在實際開發前是有必要的,前兩天瀏覽博客的時候看到了一個程序員的博文寫的一個分頁功能的實現非常好,在這里,分享給大家。
在講解分頁功能實現之前,大家必須對分頁有一定的了解,知道分頁的幾個要素:總記錄數,每頁顯示數,共幾頁,當前頁等。
在上個例子的基礎上我們開始完善我們的程序。
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);
/**
* 查詢所有的記錄數
* @param hql 查詢條件
* @return 總記錄數
*/
public int getAllRowCount(String hql);
}
2.然后我們創建其實現類: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 {
/**
* 查詢所有的記錄數
* @param hql 查詢條件
* @return 總記錄數
*/
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;
}
大家可以看到,我們一共定義了兩個方法,第一個方式是獲取數據庫表的總記錄數,第二個方法是獲取我們想要獲取的某一頁的數據集合,傳遞的三個參數分別是:查詢條件、開始的記錄、結束的記錄。
細心的讀者會發現,這個類繼承了HibernateDaoSupport類,HibernateDaoSupport是Spring提供的對Hibernate支持的類,在其參數內,我們能像原生的Hibernate一樣調用query.setFirstResult(offset)和query.setMaxResults(length)來實現分頁查詢功能。
3.然后我們需要建立一個獲取分頁信息的pageBean.java:
import java.util.List;
import cn.zbvc.bean.User;
public class PageBean {
private List<User> 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; //是否有下一頁
Set and get方法

PageBean中的具體方法:
/**
* 初始化分頁信息
*/
public void init(){
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
}
/**
* 計算總頁數 靜態方法
* @param pageSize 每頁的記錄數
* @param allRow 總記錄數
* @return 總頁數
*/
public static int countTatalPage(final int pageSize,final int allRow){
int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;
return toalPage;
}
/**
* 計算當前頁開始的記錄
* @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;
} }
4.業務邏輯層的實現:我們現在就只操作User,現在我們在UserService中定義一個方法:
* 分頁查詢
* @param pageSize 每頁顯示多少記錄
* @param currentPage 當前頁
* @return 封裝了分頁信息的bean
*/
public PageBean queryForPage(int pageSize,int page);
5.使用UserServiceImpl實現這個具體方法:
* 分頁查詢
* @param pageSize 每頁顯示多少記錄
* @param currentPage 當前頁
* @return 封裝了分頁信息的bean
*/
public PageBean queryForPage(int pageSize, int page) {
final String hql = "from User user order by user.id"; //查詢語句
int allRow = memberDao.getAllRowCount(hql); //總記錄數
int totalPage = PageBean.countTatalPage(pageSize, allRow); //總頁數
final int offset = PageBean.countOffset(pageSize, page); //當前頁開始記錄
final int length = pageSize; // 每頁記錄數
final int currentPage = PageBean.countCurrentPage(page); // 當前頁
List list = memberDao.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;
}
6.然后我們為了不影響上一個例子,我們新創建一個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創建業務層對象 使用set方法依賴注入
private PageBean pageBean; //封裝了分頁信息和數據內容的pageBean
private List<User> listUser;//用于儲存pageBean當中被封裝的User信息
private int page = 1; //表示從網頁中返回的當前頁的值 默認為1 表示默認顯示第一頁內容
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);//獲取封裝了分頁信息和數據的pageBean
this.listUser = this.pageBean.getList(); //獲取數據
return SUCCESS;
}
}
7.配置applicationContext.xml和struts.xml的相關信息,這里省略了。
8.在listUser2.jsp頁面中添加分頁內容:
<tr>
<td colspan="6" align="center" bgcolor="#5BA8DE">
共<s:property value="allRow"/>條記錄
共<s:property value="totalPage"/>頁
當前第<s:property value="currentPage"/>頁<br>
<s:if test="%{currentPage == 1}">
第一頁 上一頁
</s:if>
<!-- currentPage為當前頁 -->
<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.思考總結
關于分頁功能實現,應該是有有很多種解決方法,我介紹的這種解決方案是為了給大家一個
范例,讓大家明白分頁功能實現的原理,其中,大部分的內容借鑒了之前提到的網址。接下來的時間,我會繼續學習關于分頁功能的其它實現方式,然后分享給大家,另外,還會繼續的整理SSH的整合。