在企業級 Web 應用中,數據分頁是基礎且關鍵的功能。本文詳細介紹如何結合 Struts2 與 Hibernate 實現高效的數據分頁,涵蓋 DAO 層分頁邏輯、Action 處理、Struts 配置與 JSP 顯示層。
使用 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();
}
@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";
}
<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>
<%@ 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>
ScrollableResults 配合服務端游標處理超大數據集。UPDATE ... SET ... WHERE ...)避免逐條加載實體。本文展示了 Struts2 + Hibernate 分頁的完整實現鏈路。核心在於 DAO 層利用 Hibernate 的 setFirstResult/setMaxResults 實現物理分頁,Action 層計算分頁參數,JSP 使用 Struts 標籤庫渲染數據與分頁導航。實際項目中可根據數據量選擇游標或 HQL 批量操作進一步優化性能。