本文記錄商品模塊的核心技術點:通用分頁查詢封裝、URL 編碼處理中文參數、多條件動態查詢實現。
public class PageBean<T> {
private int pc; // 當前頁碼
private int ps = 12; // 頁大小
private int tr; // 總記錄數
private List<T> beanList; // 當前頁資料
private String url; // 請求 URL(含參數,用於分頁導航)
// getter/setter 略
}
public PageBean<Book> findByCriteria(List<Expression> exprList, int pc) {
// 1. 建立 PageBean,設定 pc、url
// 2. 根據 exprList 動態構建 WHERE 子句
// 3. 查詢總記錄數 tr
// 4. 查詢當前頁資料 beanList (LIMIT offset, ps)
// 5. 返回 PageBean
}
關鍵點: url 欄位保存完整請求路徑(如 /BookServlet?method=findByCategory&cid=1&bname=Java),分頁導航直接複用,避免手動拼接參數出錯。
JSP 中直接輸出中文參數會導致亂碼,需使用 JSTL <c:url> 自動編碼:
<c:url value="/BookServlet" var="authorUrl">
<c:param name="method" value="findByAuthor"/>
<c:param name="author" value="${book.author }"/>
</c:url>
<a href="${authorUrl}" title='${book.author }'>${book.author }</a>
<c:url> 會自動對參數值進行 URL 編碼,生成類似 /BookServlet?method=findByAuthor&author=%E4%B8%AD%E6%96%87 的安全連結。
使用 Apache Commons DbUtils 的 Expression 構建動態 WHERE:
List<Expression> exprList = new ArrayList<>();
if (cid != null) exprList.add(new Expression("cid", "=", cid));
if (bname != null) exprList.add(new Expression("bname", "LIKE", "%" + bname + "%"));
if (author != null) exprList.add(new Expression("author", "LIKE", "%" + author + "%"));
// 價格區間
if (minPrice != null) exprList.add(new Expression("price", ">=", minPrice));
if (maxPrice != null) exprList.add(new Expression("price", "<=", maxPrice));
<div class="pagebar">
<c:if test="${pb.pc != 1}">
<a href="${pb.url}&pc=1">首頁</a>
<a href="${pb.url}&pc=${pb.pc-1}">上一頁</a>
</c:if>
<c:forEach begin="1" end="${pb.tp}" var="i">
<c:choose>
<c:when test="${i == pb.pc}">
<span class="current">${i}</span>
</c:when>
<c:otherwise>
<a href="${pb.url}&pc=${i}">${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pb.pc != pb.tp}">
<a href="${pb.url}&pc=${pb.pc+1}">下一頁</a>
<a href="${pb.url}&pc=${pb.tp}">尾頁</a>
</c:if>
</div>

通用分頁封裝 + <c:url> 編碼,讓分頁查詢代碼既乾淨又健壯,是 Java Web 開發的經典最佳實踐。