1. 程式人生 > >SSH後臺分頁

SSH後臺分頁

版權 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}">第一頁&nbsp;上一頁&nbsp;
</s:if> <s:else> <a href="studentPageList.action?page=1">第一頁&nbsp;</a> <a href="studentPageList.action?page=<s:property value=‘%{pageBean.currentPage-1}‘/>">上一頁&nbsp;</a> </s:else> <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> <a href="studentPageList.action?page=<s:property value=‘%{pageBean.currentPage+1}‘/>">下一頁&nbsp;</a> <a href="studentPageList.action?page=<s:property value=‘pageBean.totalPage‘/>">最後一頁</a> </s:if> <s:else>下一頁&nbsp; 最後一頁
</s:else> </td> </tr> </table>

8.效果圖

技術分享圖片

struts.xml和applicationContext.xml配置文件這裏就省略了

這次寫分頁給我最大感覺,只要付出了足夠的時間,即使開始感覺很難做的東西都會寫著寫著,慢慢地就出來了,即使有些地方你不懂,但是你會很莫名其妙的去改正它,雖然你也不知道你為什麽要去改,就好像是你知道怎麽做一樣。。。

最後要感謝龍哥的熱心幫助,不僅寫了份開發文檔,還認真地指導了我很多,真是非常感謝!

此文部分內容來源網絡,如有侵犯您的版權問題,請來消息至電子郵件2147895584&qq.com(&換成@)及時與本人聯系。轉載亦請註明出處,謝謝。

SSH後臺分頁