首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SSH2 (Struts2 + Spring + Hibernate) 實現資料庫與前端分頁完整架構

     編輯:Java 相關知識

核心設計:通用 PageBean

封裝分頁所需所有屬性,支援前端直接渲染。

package com.fishing.common.bean;

import java.util.List;

public class PageBean {
    private List 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;

    // Getter/Setter 略

    /** 初始化衍生屬性 */
    public void init() {
        this.isFirstPage = (currentPage == 1);
        this.isLastPage = (currentPage == totalPage);
        this.hasPreviousPage = (currentPage != 1);
        this.hasNextPage = (currentPage != totalPage);
    }

    /** 靜態工具:計算總頁數 */
    public static int countTotalPage(int pageSize, int allRow) {
        return allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;
    }
    /** 靜態工具:計算 OFFSET */
    public static int countOffset(int pageSize, int currentPage) {
        return pageSize * (currentPage - 1);
    }
    /** 靜態工具:修正當前頁 */
    public static int countCurrentPage(int page) {
        return page == 0 ? 1 : page;
    }
}

DAO 層:Hibernate 分頁查詢

基礎介面

public interface BaseDao {
    List queryForPage(String hql, int offset, int length);
    int getAllRowCount(String hql);
}

實作類別

public class JianSheDWDaoImpl extends HibernateDaoSupport implements BaseDao {
    @Override
    public List queryForPage(final String hql, final int offset, final int length) {
        return getHibernateTemplate().executeFind(session -> {
            Query query = session.createQuery(hql);
            query.setFirstResult(offset);
            query.setMaxResults(length);
            return query.list();
        });
    }

    @Override
    public int getAllRowCount(String hql) {
        // 簡易實作:select count(*) ... 或用 Criteria 投影
        return getHibernateTemplate().find(hql).size(); // 示意,實際應優化
    }
}

Service 層:組裝 PageBean

public interface JianSheDWService {
    PageBean queryForPage(int pageSize, int currentPage);
}

public class JianSheDWServiceImpl implements JianSheDWService {
    private BaseDao baseDao;

    @Override
    public PageBean queryForPage(int pageSize, int page) {
        String hql = "from JianSheDWBean";
        int allRow = baseDao.getAllRowCount(hql);
        int totalPage = PageBean.countTotalPage(pageSize, allRow);
        int offset = PageBean.countOffset(pageSize, page);
        int currentPage = PageBean.countCurrentPage(page);

        List<JianSheDWBean> list = baseDao.queryForPage(hql, offset, pageSize);

        PageBean pb = new PageBean();
        pb.setPageSize(pageSize);
        pb.setCurrentPage(currentPage);
        pb.setAllRow(allRow);
        pb.setTotalPage(totalPage);
        pb.setList(list);
        pb.init();
        return pb;
    }
}

Action 層:接收頁碼、傳遞 PageBean

package com.fishing.action.lcq;

import com.fishing.common.bean.PageBean;
import com.fishing.service.lcq.JianSheDWService;
import com.opensymphony.xwork2.ActionSupport;

public class GetInfoJSDWListAction extends ActionSupport {
    private int page;                    // 前端傳入頁碼
    private PageBean pageBean;           // 輸出模型
    private JianSheDWService jianSheDWService;

    @Override
    public String execute() {
        this.pageBean = jianSheDWService.queryForPage(10, page);
        return SUCCESS;
    }
    // Getter/Setter 略
}

JSP 前端:Struts2 標籤渲染分頁列

<tr class="odd">
  <td></td>
  <td>
    <s:if test="%{pageBean.currentPage == 1}">
      首頁 上一頁
    </s:if>
    <s:else>
      <a href="jianguan/getJSDWInfos.action?page=1">首頁</a>
      <a href="jianguan/getJSDWInfos.action?page=<s:property value='%{pageBean.currentPage-1}'/>">上一頁</a>
    </s:else>
  </td>
  <td>
    <s:if test="%{pageBean.currentPage != pageBean.totalPage}">
      <a href="jianguan/getJSDWInfos.action?page=<s:property value='%{pageBean.currentPage+1}'/>">下一頁</a>
      <a href="jianguan/getJSDWInfos.action?page=<s:property value='pageBean.totalPage'/>">尾頁</a>
    </s:if>
    <s:else>
      下一頁 尾頁
    </s:else>
  </td>
  <td>
    <div align="center">
      頁次 <s:property value="pageBean.currentPage"/> / <s:property value="pageBean.totalPage"/>
      共 <s:property value="pageBean.allRow"/> 筆
    </div>
  </td>
</tr>

Spring 設定檔片段(struts.xml / applicationContext.xml 需自行配置)

<!-- Service 注入 -->
<bean id="jianSheDWService" class="com.fishing.service.lcq.JianSheDWServiceImpl">
  <property name="baseDao" ref="baseDao"/>
</bean>

<!-- Action 原型模式 -->
<bean id="getInfoJSDWListAction" class="com.fishing.action.lcq.GetInfoJSDWListAction" scope="prototype">
  <property name="jianSheDWService" ref="jianSheDWService"/>
</bean>

效能優化建議

  1. 計數查詢優化:getAllRowCount 勿用 find(hql).size(),改用 SELECT COUNT(*) 或 Criteria.setProjection(Projections.rowCount())。
  2. 大資料量:採用 延遲載入 或 游標分頁(Keyset Pagination),避免 OFFSET 深分頁效能劣化。
  3. 快取總筆數:若資料變動低頻,可將 allRow 放入 Redis 快取,減少 DB 壓力。

總結

SSH2 分頁核心在於 PageBean 統一模型、DAO 使用 Hibernate setFirstResult/setMaxResults、Service 組裝分頁資訊、Action 傳遞給前端。掌握此模式,可快速在傳統 SSH2 專案中實現穩定、可維護的分頁功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved