在企業級應用中,常需根據用戶偏好動態調整列表顯示的列。本文展示一種結合 Hibernate、Struts2、Cookie 的實現方案:用戶可在頁面勾選想顯示的字段,系統記住偏好,下次訪問自動套用。

使用 Struts2 標簽庫動態渲染表頭與數據行:
<s:iterator value="showItems"> 遍歷用戶選定的顯示列,生成表頭#st1.count)渲染不同控件:第一列為 checkbox,第二列為超鏈接,其餘顯示文本public String execute() throws Exception {
// 分頁參數初始化
page = (page == null) ? 1 : page;
pageSize = (pageSize == null) ? 10 : pageSize;
pager = new Page<Object[]>();
pager.setPageNo(page);
pager.setPageSize(pageSize);
// 1. 從 Cookie 讀取用戶偏好字符串(格式:cusNation|cusCity|...)
// 2. 若無 Cookie 或參數為空,使用默認字段集合
// 3. 將字符串解析為 LinkedHashMap 保持順序
// 4. 調用 Manager 層查詢數據
// 5. 準備 selectItems(可選字段)、searchItems(搜索字段)供頁面使用
}
getMapFromStr()private Map<String, String> getMapFromStr(String str) {
str = str.trim();
if (str == null || str.equals("")) return null;
Map<String, String> map = new LinkedHashMap<>();
String[] strs = str.split("\\|");
for (String s : strs) {
map.put(s, getCusStringMap().get(s));
}
return map;
}
getCusStringMap()private Map<String, String> getCusStringMap() {
Map<String, String> map = new LinkedHashMap<>();
map.put("id", "序號");
map.put("cusName", "客戶名稱");
map.put("cusEmail", "電子郵件");
// ... 其他字段映射
return map;
}
Manager 層根據用戶選定字段動態拼裝 HQL:
public Page<Object[]> getLinkmans(Page<Object[]> page, String showItemsStr) {
String hql = "select " + showItemsStr.trim().replaceAll("\\|", ",") + " from Linkman";
page.setAutoCount(false);
int totalCount = linkmanDao.sum("select count(*) from Linkman").intValue();
page.setTotalCount(totalCount);
page.setResult(linkmanDao.find(hql, page.getFirst(), page.getPageSize()));
return page;
}
注意:此處直接拼接 HQL 存在注入風險,生產環境建議使用 Criteria API 或參數綁定方式構建安全查詢。
showItemsStr60 * 60 * 24 * 30 秒)/(全站有效)該方案實現了「所見即所得」的列表配置體驗,結合 Cookie 實現無狀態偏好記憶,適合中小型項目快速落地。擴展時可考慮將偏好遷移至數據庫,支持多設備同步。