SSH後臺分頁
阿新 • • 發佈:2017-12-27
版權 end turn 大神 足夠 reat targe port pre
初學SSH,開始用的Struts2+Hibernate3+Spring3,Hibernate中用的HibernateTemplate進行數據庫的操作。之後在進行前臺頁面顯示的時候,要用到分頁,查了一下資料,Spring 整合 Hibernate 時候用的 HibernateTemplate 不支持分頁,因此需要自己包裝一個類進行分頁,具體實現感覺有點不懂,就沒怎麽看了。
之後決定把框架都換成跟書上一樣的,Struts2.3.34+Hibernate4.3.5+Spring4.0.4,把映射方式改成了註解(其中也遇到了很多問題,卡了很久,見《註解改成映射遇到的問題》),能夠正常的List和Delete之後便準備又開始進行分頁的工作。
剛剛開始真的是一點頭緒都沒有,就到處找代碼,問人,去GitHub找現成的項目,反正過程很艱難╮(╯﹏╰)╭。
現在把能用的代碼整理如下,主體還是借鑒了大神的源碼:http://www.blogjava.net/DyEnigma/articles/352773.html
1.數據庫建表
2.PO
student.java
1 package po; 2 3 import javax.persistence.Column; 4 import javax.persistence.Entity; 5 import javax.persistence.GeneratedValue;6 import javax.persistence.GenerationType; 7 import javax.persistence.Id; 8 import javax.persistence.Table; 9 10 @Entity 11 @Table(name = "student") 12 public class Student { 13 @Id @Column(name="id") 14 @GeneratedValue(strategy = GenerationType.AUTO) 15 private Integer id;16 17 @Column(name="sid") 18 private String sid; 19 20 @Column(name="sname") 21 private String sname; 22 23 @Column(name="sex") 24 private String sex; 25 26 //setter和getter 27 }
3.DAO
BaseDAO
package dao; import java.util.List; import java.io.Serializable; public interface BaseDAO<T> { // 根據ID加載實體 T get(Class<T> entityClazz , Serializable id); // 保存實體 Serializable save(T entity); // 更新實體 void update(T entity); // 刪除實體 void delete(T entity); // 根據ID刪除實體 void delete(Class<T> entityClazz , Serializable id); // 獲取所有實體 List<T> findAll(Class<T> entityClazz); // 獲取實體總數 long findCount(Class<T> entityClazz); //分頁獲取 List<T> findByPage(String hql, int pageNo, int pageSize); }
BaseDAOImpl
package dao; import org.hibernate.*; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.io.Serializable; public class BaseDAOImpl<T> implements BaseDAO<T> { // DAO組件進行持久化操作底層依賴的SessionFactory組件 private SessionFactory sessionFactory; // 依賴註入SessionFactory所需的setter方法 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public SessionFactory getSessionFactory() { return this.sessionFactory; } // 根據ID加載實體 @SuppressWarnings("unchecked") @Transactional public T get(Class<T> entityClazz , Serializable id) { return (T)getSessionFactory().getCurrentSession() .get(entityClazz , id); } // 保存實體 @Transactional public Serializable save(T entity) { return getSessionFactory().getCurrentSession() .save(entity); } // 更新實體 @Transactional public void update(T entity) { getSessionFactory().getCurrentSession().saveOrUpdate(entity); } // 刪除實體 @Transactional public void delete(T entity) { getSessionFactory().getCurrentSession().delete(entity); } // 根據ID刪除實體 @Transactional public void delete(Class<T> entityClazz , Serializable id) { getSessionFactory().getCurrentSession() .createQuery("delete " + entityClazz.getSimpleName() + " en where en.id = ?0") .setParameter("0" , id) .executeUpdate(); } // 獲取所有實體 @Transactional public List<T> findAll(Class<T> entityClazz) { return find("select en from " + entityClazz.getSimpleName() + " en"); } // 獲取實體總數 @Transactional public long findCount(Class<T> entityClazz) { List<?> l = find("select count(*) from " + entityClazz.getSimpleName()); // 返回查詢得到的實體總數 if (l != null && l.size() == 1 ) { return (Long)l.get(0); } return 0; } /** * 使用hql 語句進行分頁查詢操作 * @param hql 需要查詢的hql語句 * @param pageNo 查詢第pageNo頁的記錄 * @param pageSize 每頁需要顯示的記錄數 * @return 當前頁的所有記錄 */ @SuppressWarnings("unchecked") @Transactional public List<T> findByPage(String hql, int pageNo, int pageSize) { // 創建查詢 return getSessionFactory().getCurrentSession() .createQuery(hql) // 執行分頁 .setFirstResult(pageNo) .setMaxResults(pageSize) .list(); } }
StudentDAO和StudentDAOImpl直接繼承以上即可無須修改
4.創建一個PageBean
package vo; import java.util.List; public class PageBean { @SuppressWarnings("rawtypes") private List list;// 要返回的某一頁的記錄列表 private int allRow; // 總記錄數 private int totalPage; // 總頁數 private int currentPage; // 當前頁 private int pageSize;// 每頁記錄數 @SuppressWarnings("unused") private boolean isFirstPage; // 是否為第一頁 @SuppressWarnings("unused") private boolean isLastPage;// 是否為最後一頁 @SuppressWarnings("unused") private boolean hasPreviousPage; // 是否有前一頁 @SuppressWarnings("unused") private boolean hasNextPage;// 是否有下一頁 @SuppressWarnings("rawtypes") public List getList() { return list; } @SuppressWarnings("rawtypes") 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代替 * * @paramPage 傳入的參數(可能為空,即0,則返回1) * @return 當前頁 */ public static int countCurrentPage(int page) { final int curPage = (page == 0 ? 1 : page); return curPage; } }
5.Service層
StudentService.java
package service; import java.util.List; import po.Student; import vo.PageBean; public interface StudentService {//分頁查詢 PageBean queryForPage(int pageSize, int currentPage); }
StudentServiceImpl.java
package service; import java.util.List; import po.Student; import vo.PageBean; import dao.StudentDAO; public class StudentServiceImpl implements StudentService{ private StudentDAO studentDAO; public void setStudentDAO(StudentDAO studentDAO) { this.studentDAO = studentDAO; } @Override public PageBean queryForPage(int pageSize, int page) { int count = (int) studentDAO.findCount(Student.class); // 總記錄數 int totalPage = PageBean.countTotalPage(pageSize, count); // 總頁數 int offset = PageBean.countOffset(pageSize, page); // 當前頁開始記錄 int length = pageSize; // 每頁記錄數 int currentPage = PageBean.countCurrentPage(page); List<Student> list = studentDAO.findByPage("from Student", offset, length); // 該分頁的記錄 // 把分頁信息保存到Bean中 PageBean pageBean = new PageBean(); pageBean.setPageSize(pageSize); pageBean.setCurrentPage(currentPage); pageBean.setAllRow(count); pageBean.setTotalPage(totalPage); pageBean.setList(list); pageBean.init(); return pageBean; } }
6.action
package action; import java.util.List; import po.Student; import service.StudentService; import vo.PageBean; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class StudentAction extends ActionSupport{ private StudentService studentService; public void setStudentService(StudentService studentService) { this.studentService = studentService; } private int page; private PageBean pageBean; public int getPage() { return page; } public void setPage(int page) { this.page = page; } public PageBean getPageBean() { return pageBean; } public void setPageBean(PageBean pageBean) { this.pageBean = pageBean; } public String pageList(){ this.pageBean = studentService.queryForPage(4, page); return SUCCESS; } }
7.前端界面
<table width="800px" border="1px"> <s:iterator value="pageBean.list"> <tr> <td ><s:property value="sid"/></td> <td ><s:property value="sname"/></td> <td ><s:property value="sex"/></td> </tr> </s:iterator> <tr> <td>共<s:property value="pageBean.totalPage" />頁 共<s:property value="pageBean.allRow" />條記錄 當前第<s:property value="pageBean.currentPage" />頁
<s:if test="%{pageBean.currentPage == 1}">第一頁 上一頁
</s:if> <s:else> <a href="studentPageList.action?page=1">第一頁 </a> <a href="studentPageList.action?page=<s:property value=‘%{pageBean.currentPage-1}‘/>">上一頁 </a> </s:else> <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> <a href="studentPageList.action?page=<s:property value=‘%{pageBean.currentPage+1}‘/>">下一頁 </a> <a href="studentPageList.action?page=<s:property value=‘pageBean.totalPage‘/>">最後一頁</a> </s:if> <s:else>下一頁 最後一頁
</s:else> </td> </tr> </table>
8.效果圖
struts.xml和applicationContext.xml配置文件這裏就省略了
這次寫分頁給我最大感覺,只要付出了足夠的時間,即使開始感覺很難做的東西都會寫著寫著,慢慢地就出來了,即使有些地方你不懂,但是你會很莫名其妙的去改正它,雖然你也不知道你為什麽要去改,就好像是你知道怎麽做一樣。。。
最後要感謝龍哥的熱心幫助,不僅寫了份開發文檔,還認真地指導了我很多,真是非常感謝!
此文部分內容來源網絡,如有侵犯您的版權問題,請來消息至電子郵件2147895584&qq.com(&換成@)及時與本人聯系。轉載亦請註明出處,謝謝。
SSH後臺分頁