封裝分頁所需所有屬性,支援前端直接渲染。
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;
}
}
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(); // 示意,實際應優化
}
}
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;
}
}
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 略
}
<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>
<!-- 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>
getAllRowCount 勿用 find(hql).size(),改用 SELECT COUNT(*) 或 Criteria.setProjection(Projections.rowCount())。OFFSET 深分頁效能劣化。allRow 放入 Redis 快取,減少 DB 壓力。SSH2 分頁核心在於 PageBean 統一模型、DAO 使用 Hibernate setFirstResult/setMaxResults、Service 組裝分頁資訊、Action 傳遞給前端。掌握此模式,可快速在傳統 SSH2 專案中實現穩定、可維護的分頁功能。