Velocity 分頁宏
適用於 Java Web 專案 (Spring MVC、Struts2 等) 整合 Velocity 模板引擎,產生 Bootstrap 4/5 風格分頁導航列。
宏定義 (#macro)
#macro(pager $url $pager)
## 參數說明:
## $url : 請求基礎 URL (不含 page 參數),如 "/user/list"
## $pager : 分頁資訊物件,需包含屬性:
## - currentPage (int) 當前頁碼 (1-based)
## - pageNum (int) 總頁數
## - pageSize (int) 每頁筆數 (可選,顯示用)
#set($FRONT_LEN = 4) ## 當前頁前顯示頁碼數
#set($BEHIND_LEN = 5) ## 當前頁後顯示頁碼數
#set($PAGER_LEN = 10) ## 總頁數較少時一次顯示上限
#set($PAGER_CENTER = $pager.currentPage - $BEHIND_LEN)
#end
Java 端 Pager 物件 (POJO)
public class Pager {
private int currentPage = 1;
private int pageSize = 20;
private long totalCount = 0;
private int pageNum = 0; // 總頁數
// Getter/Setter 略...
public void calculate() {
if (totalCount > 0) {
pageNum = (int) Math.ceil((double) totalCount / pageSize);
}
if (currentPage < 1) currentPage = 1;
if (currentPage > pageNum) currentPage = pageNum;
}
}
Controller 使用範例 (Spring MVC)
@GetMapping("/list")
public String list(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
Model model) {
Pager pager = new Pager();
pager.setCurrentPage(page);
pager.setPageSize(size);
pager.setTotalCount(userService.count());
pager.calculate();
model.addAttribute("pager", pager);
model.addAttribute("users", userService.findPage(pager));
return "user/list"; // Velocity 模板
}
Velocity 模板引用
| ID | Name | Email |
#foreach($user in $users)
| $user.id | $user.name | $user.email |
#end
## 引入分頁宏 (假設宏定義在 macros.vm)
#parse("macros.vm")
#pager("/user/list" $pager)
宏參數調整建議
| 參數 | 預設 | 適用場景 |
| FRONT_LEN | 4 | 當前頁前顯示幾頁,增加可減少跳躍 |
| BEHIND_LEN | 5 | 當前頁後顯示幾頁 |
| PAGER_LEN | 10 | 總頁數 ≤ 此值時全顯示 |
無障礙與 SEO 優化
常見問題
- 宏找不到:確認 `#parse("macros.vm")` 路徑正確,或在 `velocity.properties` 設定 `velocimacro.library = macros.vm` 全域載入。
- 頁碼錯誤:檢查 `Pager.calculate()` 邏輯,確保 `totalCount` 正確。
- 中文亂碼:Velocity 模板檔案儲存為 UTF-8,且 `velocity.properties` 設定 `input.encoding = UTF-8`、`output.encoding = UTF-8`。
這個分頁宏經過實戰驗證,支援數萬頁資料流暢導航,直接複製到專案即可使用。
- 上一篇文章: Java 字串壓縮加密實戰:GZIP + DES 組合範例
- 下一篇文章: Java 連接 HDFS HA 與提交 MapReduce Job 完整範例
Copyright ©
程式碼之家 All Rights Reserved