SSH分頁

  1. 參考網址1:http://www.blogjava.net/BlogJava522935502/  
  2.   
  3. 參考網址2:http://blog.csdn.net/qq522935502/  
  4.   
  5. 資料部分借鑑:http://www.blogjava.net/rongxh7/  

  6. 資料借鑑:http://blog.csdn.net/guangmingfupin/article/details/8474151
  7.   
  8. 上節課,我們完成了一個SSH整合的CRUD操作案例,並且完善了其國際化以及校驗等內容,這節課,我們繼續加以完善,我們知道,當我們查詢數據庫的內容過多的時候,顯示在頁面上的內容就比較冗長,所以分頁的實現就顯的十分有必要了。分頁功能的實現是必不可少的,掌握一到兩種分頁技術在在實際開發前是有必要的,前兩天瀏覽博客的時候看到了一個程序員的博文寫的一個分頁功能的實現非常好,在這裏,分享給大家。  
  9.   
  10. 在講解分頁功能實現之前,大家必須對分頁有一定的瞭解,知道分頁的幾個要素:總記錄數,每頁顯示數,共幾頁,當前頁等。  
  11.   
  12. 在上個例子的基礎上我們開始完善我們的程序。  
  13.   
  14. 1.首先我們先新建立一個接口MemberDao.java,把所需要用到的方法列出來:  
  15.   
  16. [java] view plaincopyprint?  
  17. package cn.zbvc.dao;    
  18. import java.util.List;    
  19. import cn.zbvc.bean.User;    
  20. public interface MemberDao {    
  21. /**   
  22.  * 分頁查詢   
  23.  * @param hql  查詢條件   
  24.  * @param offset  開始記錄   
  25.  * @param length  一次查詢幾條記錄   
  26.  * @return 查詢的記錄集合   
  27.  */    
  28. public List<User> queryForPage(final String hql,final int offset,final int length);    
  29. /**   
  30.  * 查詢所有的記錄數   
  31.  * @param hql 查詢條件   
  32.  * @return 總記錄數   
  33.  */    
  34. public int getAllRowCount(String hql);    
  35. }    
  36.   
  37.   
  38. 2.然後我們創建其實現類:MemberDaoImpl.java  
  39.   
  40. [java] view plaincopyprint?  
  41. package cn.zbvc.dao.impl;    
  42. import java.util.List;    
  43. import org.hibernate.Query;    
  44. import org.hibernate.Session;    
  45. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;    
  46. import cn.zbvc.bean.User;    
  47. import cn.zbvc.dao.MemberDao;    
  48. public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {    
  49. /**   
  50.  * 查詢所有的記錄數   
  51.  * @param hql 查詢條件   
  52.  * @return 總記錄數   
  53.  */    
  54. public int getAllRowCount(String hql) {    
  55. return this.getHibernateTemplate().find(hql).size();    
  56. }    
  57. /**   
  58.  * 分頁查詢   
  59.  * @param hql  查詢條件   
  60.  * @param offset  開始記錄   
  61.  * @param length  一次查詢幾條記錄   
  62.  * @return 查詢的記錄集合   
  63.  */    
  64. @SuppressWarnings("unchecked")    
  65. public List<User> queryForPage(final String hql, final int offset, final int length) {    
  66. Session session = this.getSession();    
  67. Query q = session.createQuery(hql);    
  68. q.setFirstResult(offset);    
  69. q.setMaxResults(length);    
  70. List<User> list = q.list();    
  71. System.out.println(list.size());    
  72. session.close();    
  73. return list;    
  74. }    
  75.   
  76.   
  77. 大家可以看到,我們一共定義了兩個方法,第一個方式是獲取數據庫表的總記錄數,第二個方法是獲取我們想要獲取的某一頁的數據集合,傳遞的三個參數分別是:查詢條件、開始的記錄、結束的記錄。  
  78.   
  79. 細心的讀者會發現,這個類繼承了HibernateDaoSupport類,HibernateDaoSupport是Spring提供的對Hibernate支持的類,在其參數內,我們能像原生的Hibernate一樣調用query.setFirstResult(offset)和query.setMaxResults(length)來實現分頁查詢功能。  
  80.   
  81. 3.然後我們需要建立一個獲取分頁信息的pageBean.java:  
  82.   
  83. [java] view plaincopyprint?  
  84. package cn.zbvc.util;    
  85. import java.util.List;    
  86. import cn.zbvc.bean.User;    
  87. public class PageBean {    
  88. private List<User> list;  //要返回的某一頁的記錄列表    
  89. private int allRow; //總記錄數    
  90. private int totalPage;  //總頁數    
  91. private int currentPage;  //當前頁    
  92. private int pageSize;  //每頁的記錄數    
  93. private boolean isFirstPage;  //是否爲當前第一頁    
  94. private boolean isLastPage;  //是否爲最後一頁    
  95. private boolean hasPreviousPage;  //是否有前一頁    
  96. private boolean hasNextPage;  //是否有下一頁    
  97. Set and get方法...    
  98. PageBean中的具體方法:    
  99. /**   
  100.  * 初始化分頁信息   
  101.  */    
  102. public void init(){    
  103. this.isFirstPage = isFirstPage;    
  104. this.isLastPage = isLastPage;    
  105. this.hasPreviousPage = hasPreviousPage;    
  106. this.hasNextPage = hasNextPage;    
  107. }    
  108. /**   
  109.  * 計算總頁數  靜態方法   
  110.  * @param pageSize  每頁的記錄數   
  111.  * @param allRow  總記錄數   
  112.  * @return 總頁數   
  113.  */    
  114. public static int countTatalPage(final int pageSize,final int allRow){    
  115. int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;    
  116. return toalPage;    
  117. }    
  118. /**   
  119.  * 計算當前頁開始的記錄   
  120.  * @param pageSize 每頁記錄數   
  121.  * @param currentPage 當前第幾頁   
  122.  * @return 當前頁開始記錄號   
  123.  */    
  124. public static int countOffset(final int pageSize,final int currentPage){    
  125. final int offset = pageSize * (currentPage - 1);    
  126. return offset;    
  127. }    
  128. /**   
  129.  * 計算當前頁,若爲0或者請求的URL中沒有“?page = ”則用1代替   
  130.  * @param page 傳入的參數(可能爲空,即0  則返回1)   
  131.  * @return   
  132.  */    
  133. public static int countCurrentPage(int page){    
  134. final int curpage = (page == 0 ? 1 : page);    
  135. return curpage;    
  136. }   }    
  137.   
  138.   
  139. 4.業務邏輯層的實現:我們現在就只操作User,現在我們在UserService中定義一個方法:  
  140.   
  141. [java] view plaincopyprint?  
  142. /**   
  143.  * 分頁查詢     
  144.  * @param pageSize  每頁顯示多少記錄   
  145.  * @param currentPage 當前頁   
  146.  * @return 封裝了分頁信息的bean   
  147.  */    
  148. public PageBean queryForPage(int pageSize,int page);    
  149. 5.使用UserServiceImpl實現這個具體方法:    
  150. /**   
  151.  * 分頁查詢     
  152.  * @param pageSize  每頁顯示多少記錄   
  153.  * @param currentPage 當前頁   
  154.  * @return 封裝了分頁信息的bean   
  155.  */    
  156. public PageBean queryForPage(int pageSize, int page) {    
  157. final String hql = "from User user order by user.id"; //查詢語句    
  158. int allRow = memberDao.getAllRowCount(hql);  //總記錄數    
  159. int totalPage = PageBean.countTatalPage(pageSize, allRow); //總頁數    
  160. final int offset = PageBean.countOffset(pageSize, page); //當前頁開始記錄    
  161. final int length = pageSize; // 每頁記錄數    
  162. final int currentPage = PageBean.countCurrentPage(page); // 當前頁    
  163. List list = memberDao.queryForPage(hql, offset, length); //    
  164. //把分頁信息保存到Bean當中    
  165. PageBean pageBean  = new PageBean();    
  166. pageBean.setPageSize(pageSize);    
  167. pageBean.setCurrentPage(currentPage);    
  168. pageBean.setAllRow(allRow);    
  169. pageBean.setTotalPage(totalPage);    
  170. pageBean.setList(list);    
  171. pageBean.init();    
  172. return pageBean;    
  173. }    
  174.   
  175.   
  176. 6.然後我們爲了不影響上一個例子,我們新創建一個ListUserAction2.java:  
  177.   
  178. [java] view plaincopyprint?  
  179. package cn.zbvc.action.user;    
  180. import java.util.List;    
  181. import com.opensymphony.xwork2.ActionSupport;    
  182. import cn.zbvc.bean.User;    
  183. import cn.zbvc.service.UserService;    
  184. import cn.zbvc.util.PageBean;    
  185. public class ListUserAction2 extends ActionSupport {    
  186. private UserService service;//通過Spring創建業務層對象  使用set方法依賴注入    
  187. private PageBean pageBean; //封裝了分頁信息和數據內容的pageBean    
  188. private List<User> listUser;//用於儲存pageBean當中被封裝的User信息    
  189. private int page = 1; //表示從網頁中返回的當前頁的值  默認爲1 表示默認顯示第一頁內容    
  190. public int getPage() {    
  191. return page;    
  192. }    
  193. public void setPage(int page) {    
  194. this.page = page;    
  195. }    
  196. public List<User> getListUser() {    
  197. return listUser;    
  198. }    
  199. public void setListUser(List<User> listUser) {    
  200. this.listUser = listUser;    
  201. }    
  202. public PageBean getPageBean() {    
  203. return pageBean;    
  204. }    
  205. public void setPageBean(PageBean pageBean) {    
  206. this.pageBean = pageBean;    
  207. }    
  208. public void setService(UserService service) {    
  209. this.service = service;    
  210. }    
  211. public String execute()throws Exception{    
  212. this.pageBean = service.queryForPage(5, page);//獲取封裝了分頁信息和數據的pageBean    
  213. this.listUser = this.pageBean.getList(); //獲取數據    
  214. return SUCCESS;    
  215. }    
  216. }    
  217.   
  218.   
  219. 7.配置applicationContext.xml和struts.xml的相關信息,這裏省略了。  
  220.   
  221. 8.在listUser2.jsp頁面中添加分頁內容:  
  222.   
  223. [html] view plaincopyprint?  
  224. <s:iterator value="pageBean">    
  225.         <tr>    
  226.          <td colspan="6" align="center" bgcolor="#5BA8DE">    
  227.          共<s:property value="allRow"/>條記錄        
  228.          共<s:property value="totalPage"/>頁        
  229.          當前第<s:property value="currentPage"/><br>    
  230.         
  231.          <s:if test="%{currentPage == 1}">    
  232.            第一頁  上一頁    
  233.          </s:if>    
  234.          <!-- currentPage爲當前頁 -->    
  235.          <s:else>    
  236.            <a href="listUser2.action?page=1">第一頁</a>    
  237.            <a href="listUser2.action?page=<s:property value="%{currentPage-1}"/>">上一頁</a>    
  238.          </s:else>    
  239.         
  240.          <s:if test="%{currentPage != totalPage}">    
  241.          <a href="listUser2.action?page=<s:property value="%{currentPage+1}"/>">下一頁</a>    
  242.          <a href="listUser2.action?page=<s:property value="totalPage"/>">最後一頁</a>    
  243.          </s:if>    
  244.         
  245.          <s:else>    
  246.          下一頁  最後一頁    
  247.          </s:else>    
  248.          </td>    
  249.         </tr>    
  250. </s:iterator>    
  251.   
  252.   
  253. 9.查看效果:  
  254.   
  255.   
  256. 10.思考總結  
  257.   
  258. 關於分頁功能實現,應該是有有很多種解決方法,我介紹的這種解決方案是爲了給大家一個  
  259.   
  260. 範例,讓大家明白分頁功能實現的原理,其中,大部分的內容借鑑了之前提到的網址。接下來的時間,我會繼續學習關於分頁功能的其它實現方式,然後分享給大家,另外,還會繼續的整理SSH的整合。  (本片文章摘自網絡,如有不當,聯繫我,我會及時刪除,謝謝!)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章