NetBeans Visual Web JSF 框架提供拖拽式組件綁定數據庫能力,無需手寫 JDBC 代碼即可構建主從頁面。本教程基於 GlassFish V2 與 Travel 示例數據庫,完整演示:下拉列表綁定 PERSON 表、表格綁定 TRIP 表、SQL 查詢修改關聯 TRIPTYPE、主從同步邏輯實現、分頁排序配置,掌握可視化數據庫開發全流程。
DataboundComponents,框架選 Visual Web JavaServer Faces。travel/travel)。Select Name:)和 Drop Down List(ID personIdDD),Ctrl+Shift 關聯 Label 的 for 屬性。Travel → Tables → PERSON,拖拽到 Drop Down List 組件上。PERSON.PERSONID(提交值)PERSON.NAME(顯示文本)personDataProvider、personRowSet (SessionBean1)。TRIP 表到表格標題欄,右鍵 → Table Layout,僅保留 DEPDATE、DEPCITY、DESTCITY 三列。SessionBean1 → tripRowSet 右鍵 → Edit SQL Statement。TRIPTYPE 表,自動建立關聯。TRIPTYPE.PERSONID,勾選 TRIPTYPE.DESCRIPTION 加入 Select 列表。DESCRIPTION 列。PERSONID 行右鍵 → Add Query Criteria,Comparison 選 =Equals,Parameter 模式。生成 WHERE TRAVEL.TRIP.PERSONID = ?。DEPDATE 行 Sort Type 選 Ascending。右鍵 Drop Down List → Bind to Data 旁邊的事件綁定,或雙擊組件生成 personIdDD_processValueChange:
public void personIdDD_processValueChange(ValueChangeEvent event) {
try {
getSessionBean1().getTripRowSet().setObject(1, personIdDD.getSelected());
tripDataProvider.refresh();
} catch (Exception e) {
error("Cannot switch to person " + personDataProvider.getValue("PERSON.PERSONID"));
log("Cannot switch to person ...", e);
}
}
setObject(1, ...) 綁定第一個參數,refresh() 重新執行查詢。
public void prerender() {
if (personIdDD.getSelected() == null) {
try {
personDataProvider.cursorFirst();
getSessionBean1().getTripRowSet().setObject(1, personDataProvider.getValue("PERSON.PERSONID"));
tripDataProvider.refresh();
} catch (Exception e) { ... }
}
}
首次加載頁面時,默認選中第一條人員記錄並同步表格。
右鍵 Drop Down List → Auto-Submit on Change,頁面將在選擇變化時自動提交觸發事件處理。
PERSON.JOBTITLE。prerender 增加 else 分支:else {
try {
personDataProvider.setCursorRow(
personDataProvider.findFirst("PERSON.PERSONID", personIdDD.getSelected()));
} catch (Exception e) { ... }
}
Trips。3。personIdDD_processValueChange 中 tripDataProvider.refresh() 後添加:tableRowGroup1.setFirst(0); 確保切換人員時顯示第一頁。服務器日誌顯示方法調用順序:
Constructor → prerender(構建響應,實例銷毀)。Constructor → personIdDD_processValueChange → prerender(值變更事件觸發刷新,prerender 忽略 if 分支)。每次請求創建新 Page Bean 實例,狀態通過請求參數自動恢復,不會重複刷新 RowSet**。