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

Struts2 整合 Hibernate 實現數據分頁完整教程

     編輯:Java 相關知識

前言

在企業級 Web 應用中,數據分頁是基礎且關鍵的功能。本文詳細介紹如何結合 Struts2 與 Hibernate 實現高效的數據分頁,涵蓋 DAO 層分頁邏輯、Action 處理、Struts 配置與 JSP 顯示層。

1. Hibernate DAO 層分頁實現

使用 HibernateCallback 配合 setFirstResult 與 setMaxResults 實現物理分頁:

@SuppressWarnings("unchecked")
public List findByPage(final String hql, final int offset, final int pageSize) {
    List list = getHibernateTemplate().executeFind(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            List result = session.createQuery(hql)
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
            return result;
        }
    });
    return list;
}

// 獲取總記錄數
public int getRows(String hql) {
    return getHibernateTemplate().find(hql).size();
}

2. Action 層調用分頁邏輯

@SuppressWarnings("unchecked")
public String paging() {
    String hql = "from Income";
    int pageSize = 3; // 每頁顯示條數
    int allRows = service.getRows(hql); // 總記錄數
    int allPage = (allRows - 1) / pageSize + 1; // 總頁數
    int offset = getPage() + 1; // 當前頁索引(從 0 開始)

    List<Income> income = service.findByPage(hql, (offset - 1) * pageSize, pageSize);
    request.setAttribute("allPage", allPage);
    request.setAttribute("offset", offset);
    request.setAttribute("income", income);
    return "paging";
}

3. struts.xml 配置

<action name="income" class="com.xqh.action.IncomeAction">
    <result name="error">/error.jsp</result>
    <result name="paging">/income/income_list.jsp</result>
    <result name="update">/income/income_edit.jsp</result>
</action>

4. JSP 顯示層 (income_list.jsp)

<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <title>支出列表</title>
    <link rel="stylesheet" type="text/css" href="../images/styles.css">
</head>
<body>
<div class="div1">
    <table width="100%" cellpadding="0" cellspacing="0" border="0" align="center">
        <tr>
            <td class="td_title1">·當前位置:支出管理 >> 查看支出</td>
        </tr>
        <tr>
            <td bgcolor="#FFFFFF" height="50">
                <table border="1" align="center" width="700" cellpadding="1" cellspacing="1" bgcolor="#036500">
                    <tr bgcolor="#FFFFFF">
                        <td class="tb_tl" align="center">支出編號</td>
                        <td class="tb_tl" align="center">日期</td>
                        <td class="tb_tl" align="center">方式</td>
                        <td class="tb_tl" align="center">金額</td>
                        <td class="tb_tl" align="center">項目</td>
                        <td class="tb_tl" align="center">來源</td>
                        <td class="tb_tl" align="center">人員</td>
                        <td class="tb_tl" align="center">備註</td>
                        <td class="tb_tl" align="center">操作</td>
                    </tr>
                    <s:iterator value="#request.income">
                    <tr bgcolor="#FFFFFF">
                        <td align="center"><s:property value="id"/></td>
                        <td align="center"><s:date name="date" format="yyyy-MM-dd"/></td>
                        <td align="center"><s:property value="style"/></td>
                        <td align="center"><s:property value="money"/></td>
                        <td align="center"><s:property value="project"/></td>
                        <td align="center"><s:property value="source"/></td>
                        <td align="center"><s:property value="personnel"/></td>
                        <td align="center"><s:property value="remarks"/></td>
                        <td align="center">
                            <a href="javascript:if(confirm('確定要刪除${id}嗎?'))location='income!del?id=${id}'">刪除</a>
                            <a href="javascript:if(confirm('確定要修改${id}嗎?'))location='income!updateTo?id=${id}'">修改</a>
                        </td>
                    </tr>
                    </s:iterator>
                </table>
                <center>
                    總共有${allPage}頁, 當前是第${offset}頁
                    <a href="income!paging?page=0"><font size="2" color="blue">首頁</font></a>
                    <a href="javascript:if(${offset}>1)location='income!paging?page=${page-1}'"><font size="2" color="red">上一頁</font></a>
                    <a href="javascript:if(${offset}<${allPage})location='income!paging?page=${page+1}'"><font size="2" color="red">下一頁</font></a>
                    <a href="income!paging?page=${allPage-1}"><font size="2" color="blue">末頁</font></a>
                </center>
            </td>
        </tr>
    </table>
</div>
</body>
</html>

5. 關鍵優化建議

  • 使用 ScrollableResults 配合服務端游標處理超大數據集。
  • 採用 HQL 批量更新/刪除語法(UPDATE ... SET ... WHERE ...)避免逐條加載實體。
  • 合理配置二級緩存減少數據庫查詢壓力。

總結

本文展示了 Struts2 + Hibernate 分頁的完整實現鏈路。核心在於 DAO 層利用 Hibernate 的 setFirstResult/setMaxResults 實現物理分頁,Action 層計算分頁參數,JSP 使用 Struts 標籤庫渲染數據與分頁導航。實際項目中可根據數據量選擇游標或 HQL 批量操作進一步優化性能。

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