本教學將帶領您使用 NetBeans IDE 6.5,打造一個雙頁面的 JavaServer Faces (JSF) 1.2 應用程式。首頁利用 Woodstock Tree 元件,從 Travel 範例資料庫動態載入人員與行程層級節點;次頁則顯示行程詳細資訊。全程採用視覺化拖拉開發,輔以少量程式碼綁定,約 30 分鐘即可完成。
DatabaseTree。id="displayTree"、clientSide="true"(所有節點一次傳至客戶端,展開無延遲)。travel 連線節點,確認 person、trip 等資料表存在。trip 表拖至設計器,自動生成 tripDataProvider 與 tripRowSet。person 表,於查詢編輯器設計網格中建立聯結關係。person.name 升冪(依姓氏字母序)、trip.depdate 升冪(依日期先後)。prerender() 動態建構樹狀結構於 Page1 的 RequestBean1 新增 personId 屬性(含 getter/setter),用於記錄從詳情頁返回時需展開的節點。修改 prerender() 方法核心邏輯如下:
public void prerender() {
Integer expandedPersonId = getRequestBean1().getPersonId();
try {
if (displayTree.getChildCount() == 0) { // 僅首次載入建構
List outerChildren = displayTree.getChildren();
outerChildren.clear();
List innerChildren = null;
tripDataProvider.refresh();
boolean hasNext = tripDataProvider.cursorFirst();
Integer currentPersonId = -1;
while (hasNext) {
Integer newPersonId = (Integer) tripDataProvider.getValue("TRIP.PERSONID");
if (!newPersonId.equals(currentPersonId)) { // 新人員 → 新一級節點
currentPersonId = newPersonId;
TreeNode personNode = new TreeNode();
personNode.setId("person" + newPersonId);
personNode.setText((String) tripDataProvider.getValue("person.name"));
personNode.setExpanded(newPersonId.equals(expandedPersonId)); // 還原展開狀態
outerChildren.add(personNode);
innerChildren = personNode.getChildren();
}
// 建立二級行程節點
TreeNode tripNode = new TreeNode();
tripNode.setId("trip" + tripDataProvider.getValue("trip.tripid"));
tripNode.setText(tripDataProvider.getValue("trip.depdate").toString());
tripNode.setUrl("/faces/Trip.jsp?tripId=" + tripDataProvider.getValue("trip.tripid"));
innerChildren.add(tripNode);
hasNext = tripDataProvider.cursorNext();
}
}
} catch (Exception ex) { error("Exception gathering tree data: " + ex); }
}
修復匯入 (com.sun.webui.jsf.component.TreeNode, java.util.List) 後執行專案,即可見姓名按字母序、日期按時間序排列的樹狀結構。
Trip.jsp 建立與導航Trip.jsp。trip 表至設計器,於 SessionBean1 建立 tripRowSet1,SQL 加入 WHERE trip.tripid = ? 參數條件。depdate, depcity 等欄位,並綁定至 tripDataProvider1)。Trip.jsp 的 prerender() 從請求參數取得 tripId,設定 tripRowSet1 參數並刷新。hyperlink1_action 將 personId 寫回 RequestBean1,以便首頁還原展開狀態。Tree 節點 URL → Trip.jsp、超連結 → Page1.jsp。若需在伺服器端處理節點選取邏輯,可改用 actionExpression 綁定至 tripNode_action 方法,透過 displayTree.getSelected() 取得節點 ID,解析 tripId 後存入 Request Bean,導航案例設為 case1。此法避免 Cookie 相容性問題,適用於 JSF 1.2 環境。
本教學示範了從資料庫動態建構樹狀 UI 的完整流程:查詢編輯器定義資料、prerender 邏輯組裝節點、虛擬表單管理提交行為、頁面導航與狀態保持。掌握此模式,可輕鬆擴展至任意階層式資料呈現場景。