執(zhí)行插入、更新和刪除操作
<!-- END VNV3 PAGETITLE, two-level variation --><!-- BEGIN WRAPPER TABLE, 2 COLUMN, MAIN/RIGHT --><!-- BEGIN CENTRAL COLUMN COMPONENTS --><!--startindex--><!-- ============ --><!-- MAIN CONTENT --><!-- ============ --> <!-- BEGIN VCD4 BYLINE AND TOOLS -->2006 年 12 月 [修訂號(hào):V1-1] |
本教程介紹了如何使用 NetBeans Visual Web Pack 5.5 構(gòu)建一個(gè)可以創(chuàng)建、檢索、更新和刪除數(shù)據(jù)庫行的 Web 應(yīng)用程序。該應(yīng)用程序提供一個(gè)主數(shù)據(jù)的下拉列表以及一個(gè)同步的詳細(xì)信息表。該應(yīng)用程序的用戶可以在詳細(xì)信息表及其關(guān)聯(lián)數(shù)據(jù)庫中添加、更新和刪除記錄。 本教程使用了其他基礎(chǔ)教程中介紹的一些概念。如果您不具備 IDE 及其設(shè)計(jì)組件的基本知識(shí),請(qǐng)考慮首先閱讀基礎(chǔ)教程,如 NetBeans Visual Web Pack 5.5 入門指南 和 使用數(shù)據(jù)綁定組件訪問數(shù)據(jù)庫 。 |
目錄
|
|
本教程將使用以下資源
NetBeans Visual Web Pack 5.5 可以與所有支持的服務(wù)器以及 Java EE 1.4 和 Java EE 5 平臺(tái)配合使用。本教程向您介紹了 Visual Web Pack 的各種功能,這些功能需要利用下表中帶有復(fù)選標(biāo)記的資源。有關(guān)支持的服務(wù)器和 Java EE 平臺(tái)的詳細(xì)信息,請(qǐng)參見 NetBeans Visual Web Pack 5.5 安裝說明 。
應(yīng)用服務(wù)器 |
Sun Java System Application Server 9
Tomcat JBoss BEA WebLogic |
JavaServer Faces 組件/
Java EE 平臺(tái) |
1.2/Java EE 5*
1.1/J2EE 1.4 |
Travel 數(shù)據(jù)庫 | 必需 |
BluePrints AJAX 組件庫 | 不是必需的 |
* 該教程發(fā)布時(shí),只有 Sun Java System Application Server 支持 Java EE 5。
<!-- END RESOURCE MATRIX --><!-- BEGIN EXAMPLES BOX --><!-- <table border="0" cellpadding="2" cellspacing="0"> <tr> <td> <div class="headerpadding2"><b>Example used in this tutorial</b></div> </td> </tr> <tr valign="top"> <td> <div class="headerpadding2"> » <a href="inserts_updates_deletes/insert_update_delete_ex.zip">insert_update_delete_ex.zip (zip)</a> </div> </td> </tr> </table> --><!-- END CODE EXAMPLES BOX -->創(chuàng)建項(xiàng)目
在本教程中,將創(chuàng)建包含一個(gè)頁面的 Web 應(yīng)用程序。您可以先從設(shè)計(jì)頁面布局入手,該頁面包含一個(gè)人名及其相應(yīng)的行程,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 1 :初始頁面布局 |
-
創(chuàng)建一個(gè)新的 Visual Web 應(yīng)用程序,并將其命名為
InsertUpdateDelete
。 -
將一個(gè)“下拉列表”組件從組件面板的“基本”類別拖動(dòng)到該頁的左上角。在“屬性”窗口中,將其
id
屬性更改為personDD
。 -
將一個(gè)“消息組”組件從組件面板的“基本”類別拖放到下拉列表的右側(cè)。
“消息組”組件可用來顯示驗(yàn)證錯(cuò)誤和轉(zhuǎn)換錯(cuò)誤,以及由info()
和error()
方法寫入到 Java Server Faces 上下文的消息。如果需要調(diào)試項(xiàng)目,這些消息將會(huì)非常有用。 - 將一個(gè)“表”組件放在這兩個(gè)組件的下方。
-
打開“運(yùn)行環(huán)境”窗口,展開“數(shù)據(jù)庫”節(jié)點(diǎn)并檢查是否已連接 TRAVEL 數(shù)據(jù)庫。
如果 TRAVEL 數(shù)據(jù)庫的 jdbc 節(jié)點(diǎn)標(biāo)記顯示為連接中斷,并且無法展開該節(jié)點(diǎn),則表明 IDE 未連接該數(shù)據(jù)庫。要連接 TRAVEL 數(shù)據(jù)庫,請(qǐng)右鍵單擊 TRAVEL 數(shù)據(jù)庫的 jdbc 節(jié)點(diǎn),然后從彈出式菜單中選擇“連接”。如果出現(xiàn)“連接”對(duì)話框,請(qǐng)輸入travel
作為口令,然后單擊“確定”。如果看不到 TRAVEL 數(shù)據(jù)庫的 jdbc 節(jié)點(diǎn),請(qǐng)參見 NetBeans Visual Web Pack 5.5 安裝說明 以了解如何為 IDE 提供可用的數(shù)據(jù)庫。 -
展開 TRAVEL 數(shù)據(jù)庫的 jdbc 節(jié)點(diǎn),然后展開“表”節(jié)點(diǎn)。
注意: 在本教程的其余部分中,將 TRAVEL 數(shù)據(jù)庫的 jdbc 節(jié)點(diǎn)稱為 "Travel" 節(jié)點(diǎn)。 -
將 "PERSON" 節(jié)點(diǎn)拖動(dòng)到可視設(shè)計(jì)器的下拉列表上。
“概要”窗口的 "Page1" 部分中將顯示 "personDataProvider" 節(jié)點(diǎn),"SessionBean1" 部分中將顯示 "personRowSet" 節(jié)點(diǎn)。 -
右鍵單擊“下拉列表”組件,然后從彈出式菜單中選擇“更改時(shí)自動(dòng)提交”。
此設(shè)置使得每當(dāng)您從列表中選擇新值時(shí),則會(huì)將該頁面發(fā)送到服務(wù)器。 -
右鍵單擊下拉列表,然后從彈出式菜單中選擇“配置虛擬表單”。
在出現(xiàn)的對(duì)話框中,請(qǐng)注意personDD
顯示在窗口的左上角中,這表明下拉列表已被選定。 -
單擊“新建”。在“名稱”列中輸入
<!-- BEGIN FIGURE COMPONENT -->person
。雙擊“參與”列下面的字段,并將其設(shè)置為“是”,然后對(duì)“提交”列執(zhí)行相同的操作,如下圖所示。
圖 2 :配置虛擬表單
通過使用虛擬表單,應(yīng)用程序可避免對(duì)表中的數(shù)據(jù)進(jìn)行不必要的驗(yàn)證。 - 單擊“確定”。
-
單擊可視設(shè)計(jì)器工具欄中的“顯示虛擬表單”按鈕,如圖 3 所示。
通過查看虛擬表單,您可以看到可視設(shè)計(jì)器中的組件與您已經(jīng)配置的任何虛擬表單之間的關(guān)系。
<!-- BEGIN FIGURE COMPONENT -->圖 3 :顯示虛擬表單
- 將 "Travel" >“表”> "TRIP" 節(jié)點(diǎn)從“運(yùn)行環(huán)境”窗口拖放到可視設(shè)計(jì)器中的“表”組件上。
-
右鍵單擊該表,然后從彈出式菜單中選擇“表布局”。
該對(duì)話框顯示了您剛創(chuàng)建的 tripDataProvider 中可用的字段,并允許您控制要在表中顯示哪些字段。 -
使用 "<" 按鈕,從右側(cè)的“選定”列表中刪除 TRIP.TRIPID、TRIP.PERSONID 和 TRIP.LASTUPDATED,如下圖所示。
-
單擊“選項(xiàng)”標(biāo)簽,并將標(biāo)題更改為
Trips Summary
。 -
單擊“確定”。
現(xiàn)在,可視設(shè)計(jì)器中的“表”組件應(yīng)如下圖所示。請(qǐng)注意,如果未按下圖順序顯示各列,可通過重新打開“表布局”對(duì)話框,單擊“列”標(biāo)簽并使用“上移”和“下移”按鈕重新對(duì)其進(jìn)行排列。
<!-- BEGIN FIGURE COMPONENT -->圖 5 :Page1 表布局 -
在“概要”窗口中,右鍵單擊 "SessionBean1" 下的 "tripRowSet",然后從彈出式菜單中選擇“編輯 SQL 語句”。
SQL 查詢編輯器將顯示在編輯區(qū)域中。 -
在窗口中心附近的網(wǎng)格區(qū)域,在 PERSONID 行中單擊鼠標(biāo)右鍵,然后選擇“添加查詢條件”,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 6 :添加查詢條件 -
在對(duì)話框中,將“比較”下拉列表設(shè)置為“= 等于”并選中“參數(shù)”單選按鈕,然后單擊“確定”。
<!-- BEGIN FIGURE COMPONENT -->圖 7 :“添加查詢條件”對(duì)話框
字符 "=?" 將出現(xiàn)在 PERSONID 的“條件”字段中,而條件 "WHERE TRAVEL.TRIP.PERSONID=?" 則出現(xiàn)在編輯器底部 SQL 窗格中的 SQL 語句結(jié)尾處。 - 關(guān)閉 tripRowSet 的 SQL 編輯器。
更改列組件
-
右鍵單擊“表”組件,然后選擇“表布局”。
將打開“表布局”對(duì)話框。 -
在“列”標(biāo)簽中,從右側(cè)的“選定”列表中選擇 "TRIP.DEPDATE"。在對(duì)話框底部的“列詳細(xì)信息”區(qū)域中,將“組件類型”從“靜態(tài)文本”更改為“文本字段”,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 8 :更改列的外觀 - 對(duì) TRIP.DEPCITY 和 TRIP.DESTCITY 執(zhí)行相同的操作。
- 在“選定”列表中選擇 "TRIP.TRIPTYPEID",然后將“組件類型”從“靜態(tài)文本”更改為“下拉列表”。
-
單擊“確定”。
注意: 如果執(zhí)行上述步驟后表列太寬,則可以通過選擇每列中的第一個(gè)組件并拖動(dòng)其選擇句柄來調(diào)整列的大小。 -
將 "Travel" >“表”> "TRIPTYPE" 節(jié)點(diǎn)拖動(dòng)到“表”組件中的下拉列表上。
此操作將創(chuàng)建triptypeDataProvider
。
為表配置虛擬表單
- 在可視設(shè)計(jì)器中,使用 Ctrl 鍵的同時(shí)單擊“表”組件中的三個(gè)“文本字段”組件和一個(gè)“下拉列表”組件。右鍵單擊其中一個(gè)選定的組件,然后從彈出式菜單中選擇“配置虛擬表單”。
- 在“配置虛擬表單”對(duì)話框中,確保窗口左上角列出了三個(gè)文本字段和一個(gè)下拉列表。如果未按下圖所示的方式列出這些內(nèi)容,請(qǐng)關(guān)閉對(duì)話框,重新選擇它們,然后再試一次。如果已正確列出這些內(nèi)容,則單擊“新建”。
-
將新虛擬表單的名稱更改為
<!-- BEGIN FIGURE COMPONENT -->save
,將“參與”設(shè)置更改為“是”(如下圖所示),然后單擊“確定”以關(guān)閉窗口。圖 9 :為表元素配置虛擬表單
添加事件代碼和初始化代碼
- 雙擊 personDD 下拉列表以創(chuàng)建值更改事件方法(將打開 Java 編輯器,并且插入點(diǎn)將位于該方法內(nèi))。
-
在值更改事件方法中,找到注釋行
<!-- BEGIN CODE SAMPLE COMPONENT -->// 待做事項(xiàng):替換為您的代碼
。使用代碼樣例 1 中的粗體文本替換此行。代碼樣例 1:下拉列表事件處理程序 public void personDD_processValueChange(ValueChangeEvent event) { Object selectedPersonId = personDD.getSelected(); try { personDataProvider.setCursorRow( personDataProvider.findFirst("PERSON.PERSONID", selectedPersonId)); getSessionBean1().getTripRowSet().setObject(1, selectedPersonId); tripDataProvider.refresh(); form1.discardSubmittedValues("save"); } catch (Exception e) { error("Cannot switch to person " + selectedPersonId); log("Cannot switch to person " + selectedPersonId, e); } }
位于try
子句結(jié)尾處的form1.discardSubmittedValues("save")
語句可確保每當(dāng)用戶從下拉列表中選擇新的人員時(shí),將使用新的所選人員的相關(guān)信息替換當(dāng)前行程信息。請(qǐng)您回想一下,顯示行程信息的用戶界面元素都參與了名為 save 的虛擬表單。請(qǐng)注意,事件處理程序并不拋出異常,而是在server.log
文件中記錄異常。事件處理程序還將調(diào)用error
方法,當(dāng)出現(xiàn)錯(cuò)誤時(shí)就會(huì)將消息顯示在“消息組”組件中。 -
在 Java 源代碼中滾動(dòng)至
<!-- BEGIN CODE SAMPLE COMPONENT -->prerender()
方法(或者,如果愿意,請(qǐng)按 Ctrl-F 組合鍵以打開“查找”對(duì)話框并搜索prerender
)。將下面以粗體顯示的代碼添加到該方法中。代碼樣例 2:Prerender 方法 public void prerender() { if ( personDD.getSelected() == null ) { Object firstPersonId = null; try { personDataProvider.cursorFirst(); firstPersonId = personDataProvider.getValue("PERSON.PERSONID"); personDD.setSelected(firstPersonId); getSessionBean1().getTripRowSet().setObject( 1, firstPersonId); tripDataProvider.refresh(); } catch (Exception e) { error("Cannot switch to person " + firstPersonId); log("Cannot switch to person " + firstPersonId, e); } } }
- 在 Java 編輯器中單擊鼠標(biāo)右鍵,然后選擇“重新設(shè)置代碼格式”以便對(duì)代碼進(jìn)行適當(dāng)?shù)呐帕小?
測(cè)試應(yīng)用程序 - 第 1 部分
在主工具欄上單擊“運(yùn)行主項(xiàng)目”按鈕以生成、部署和運(yùn)行項(xiàng)目。當(dāng) Web 瀏覽器呈現(xiàn)此頁面時(shí),您會(huì)看到一些名字填充了下拉列表,并且表也由一些數(shù)據(jù)進(jìn)行了填充。當(dāng)您從列表中選擇其他名字時(shí),與該名字關(guān)聯(lián)的行程將會(huì)顯示在表中。
<!-- BEGIN FIGURE COMPONENT -->圖 10 :部署的應(yīng)用程序,測(cè)試 1 |
添加插入功能
- 在可視設(shè)計(jì)器中查看 Page1。
- 在組件面板的“基本”類別中,將“消息”組件分別拖動(dòng)到表的前三列中最上面的文本字段上。
-
選擇第一個(gè)“消息”組件。在“屬性”窗口中,滾動(dòng)至
for
屬性,然后從下拉列表中選擇textField1
。只有當(dāng)消息與文本字段正確關(guān)聯(lián)時(shí),消息文本才會(huì)顯示關(guān)聯(lián)信息,如圖 11 所示。 -
選擇第二個(gè)“消息”組件并將其
for
屬性設(shè)置為textField2
。 -
將第三個(gè)“消息”組件的
<!-- BEGIN FIGURE COMPONENT -->for
屬性設(shè)置為textField3
。圖 11 :將“消息”組件與文本字段關(guān)聯(lián) - 在組件面板的“基本”類別中,將一個(gè)“按鈕”組件拖動(dòng)到 Page1 上,并將它放置在“表”組件上方靠近第二列的頂部,如圖 12 所示。
-
將其 text 屬性由“
按鈕
”更改為 "Add
Trip
"。 -
在“屬性”窗口中,將按鈕的
id
屬性更改為add
。 - 在可視設(shè)計(jì)器中,雙擊該按鈕以打開 Java 編輯器,插入點(diǎn)將位于該按鈕的事件處理程序中。
-
修改按鈕的事件代碼(
<!-- BEGIN CODE SAMPLE COMPONENT -->add_action()
方法),使其如下所示:代碼樣例 3:添加行程操作的代碼 public String add_action() { try { RowKey rk = tripDataProvider.appendRow(); tripDataProvider.setCursorRow(rk); tripDataProvider.setValue("TRIP.TRIPID", new Integer(0)); tripDataProvider.setValue("TRIP.PERSONID", personDD.getSelected()); tripDataProvider.setValue("TRIP.TRIPTYPEID", new Integer(1)); } catch (Exception ex) { log("Error Description", ex); error(ex.getMessage()); } return null; }
-
在 Java 編輯器中單擊鼠標(biāo)右鍵,然后選擇“修復(fù)導(dǎo)入”以解決“找不到
RowKey
”的錯(cuò)誤。IDE 將在
Page1.java
的 import 語句塊中添加下列包:import com.sun.data.provider.RowKey;
測(cè)試應(yīng)用程序 - 第 2 部分
生成、部署和運(yùn)行項(xiàng)目。當(dāng) Web 瀏覽器呈現(xiàn)此頁面時(shí),將顯示 "Add Trip" 按鈕,如下圖所示。每次單擊該按鈕時(shí),都會(huì)在表的底部附加一個(gè)新的空行。您可以編輯行中的信息,但由于尚未提供行集的保存機(jī)制,因此,從下拉列表中選擇其他名字時(shí),所做的更改將會(huì)丟失。
<!-- BEGIN FIGURE COMPONENT -->圖 12 :部署的應(yīng)用程序,測(cè)試 2 |
修改頁面以保存行集
- 在編輯器窗口中單擊 "Design" 以返回到可視設(shè)計(jì)器中的 Page1。
-
從“運(yùn)行環(huán)境”窗口中選擇“數(shù)據(jù)庫”> "Travel" >“表”> "TRIP" 表,然后將它拖動(dòng)到“概要”窗口中的 "SessionBean1" 節(jié)點(diǎn)上。
<!-- BEGIN FIGURE COMPONENT -->圖 13 :將 TRIP 表拖動(dòng)到 SessionBean1 上
此操作將會(huì)打開“添加新的數(shù)據(jù)提供器”對(duì)話框。 -
單擊“創(chuàng)建 SessionBean1/tripRowSet1”單選按鈕,將數(shù)據(jù)提供器的名稱更改為
maxTripRowSet
,然后單擊“確定”。注意: 行集在對(duì)話框中出現(xiàn)了兩次。這是一個(gè)已知問題,請(qǐng)予以忽略。它不會(huì)影響本教程中的應(yīng)用程序。
<!-- BEGIN FIGURE COMPONENT -->圖 14 :將新的數(shù)據(jù)提供器添加到 SessionBean1 中
此操作將在 SessionBean1 中創(chuàng)建 maxTripDataProvider 和 maxTripRowSet。 -
在“概要”窗口中,雙擊 "SessionBean1" > "maxTripRowSet" 以打開查詢編輯器。在源代碼窗格(上數(shù)第三個(gè)窗格)中單擊鼠標(biāo)左鍵。刪除此處現(xiàn)有的 SQL 查詢,然后輸入以下查詢:
SELECT MAX(TRAVEL.TRIP.TRIPID)+1 AS MAXTRIPID FROM TRAVEL.TRIP
MAXTRIPID
值將用在 "Save" 按鈕(接下來,將添加此按鈕)的操作處理程序中。 - 關(guān)閉查詢編輯器。請(qǐng)注意,查詢編輯器的圖形編輯器不支持此查詢。如果您看到一個(gè)提示出現(xiàn)語法錯(cuò)誤的警報(bào)對(duì)話框,可通過單擊“繼續(xù)”安全地將其關(guān)閉。
- 將一個(gè)“按鈕”組件放在表的第一列上方。
-
將按鈕的 text 屬性由“按鈕”
更改為 "
Save Changes
"。 -
在“屬性”窗口中,將其
id
屬性更改為save
。 - 右鍵單擊 "Save Changes" 按鈕,然后從彈出式菜單中選擇“配置虛擬表單”。
-
在“配置虛擬表單”對(duì)話框中,確保左上角的列表中顯示的是
save
,以便此窗口中的更改可以應(yīng)用于 "Save Changes" 按鈕。然后,選擇save
虛擬表單,將“提交”值更改為“是”并單擊“確定”。 - 在可視設(shè)計(jì)器中,雙擊 "Save Changes" 按鈕以打開 Java 編輯器。在 Java 編輯器中,插入點(diǎn)將位于該按鈕的事件處理程序中。
-
修改該按鈕的事件代碼(
<!-- BEGIN CODE SAMPLE COMPONENT -->save_action()
方法),使其如下所示:代碼樣例 4:保存操作的代碼 public String save_action() { try { // Get the next key, using result of query on MaxTrip data provider CachedRowSetDataProvider maxTrip = getSessionBean1().getMaxTripDataProvider(); maxTrip.refresh(); maxTrip.cursorFirst(); int newTripId = ((Integer) maxTrip.getValue("MAXTRIPID")).intValue(); // Navigate through rows with data provider if (tripDataProvider.getRowCount() > 0) { tripDataProvider.cursorFirst(); do { if (tripDataProvider.getValue("TRIP.TRIPID").equals (new Integer(0))) { tripDataProvider.setValue("TRIP.TRIPID", new Integer(newTripId)); newTripId++; } } while (tripDataProvider.cursorNext()); }; tripDataProvider.commitChanges(); } catch (Exception ex) { log("Error Description", ex); error("Error :"+ex.getMessage()); } return null; }
測(cè)試應(yīng)用程序 - 第 3 部分
通過單擊“運(yùn)行主項(xiàng)目”按鈕以生成、部署和運(yùn)行項(xiàng)目。應(yīng)用程序?qū)⒖梢詫?shí)現(xiàn)以下功能:
- 可以添加行程并進(jìn)行保存。行程將會(huì)顯示在表中,并且在選擇其他人員后重新返回時(shí),該行程仍然存在。
- 可以編輯現(xiàn)有的行程信息,并保存所做的更改。
- 如果在 "Date" 字段中輸入除日期之外的內(nèi)容,則應(yīng)用程序?qū)⑻峁┮粭l錯(cuò)誤消息。
- 在保存之前可以多處單擊 "Add Trip",這是一次添加多行的簡便方法。
- 如果在保存之前切換到其他人員,則會(huì)丟失所有更新(包括在所添加的行上正在填寫的信息)。
- 如果修改了某些值,然后單擊某個(gè)列標(biāo)題(使之按該列進(jìn)行排序),則表組件會(huì)記住這些暫掛的更改,并在隨后可以保存這些更改。
添加刪除功能
<!-- InsertUpdateDelete12-TP3.zip -->
現(xiàn)在,將刪除功能添加到表中。利用此功能,用戶能夠通過從數(shù)據(jù)庫中刪除某行來刪除行程。在本教程中,"Delete" 按鈕的操作是即時(shí)的,并且從數(shù)據(jù)庫中刪除行時(shí)并不需要使用 "Save Changes" 按鈕。實(shí)際上,由于 "Delete" 按鈕的事件處理程序使用
commitChanges()
方法,因此它也像 "Save Changes" 按鈕一樣保存所有暫掛的更改。
-
在可視設(shè)計(jì)器中,右鍵單擊“表”組件,然后從彈出式菜單中選擇“表布局”。
將打開“表布局”對(duì)話框。 - 單擊“列”標(biāo)簽,然后單擊“新建”,將一個(gè)新列添加到表中。
-
在“選定”列表中選擇新列的名稱后,在“列詳細(xì)信息”區(qū)域中進(jìn)行如下更改:
- 表頭文本和頁腳文本: <刪除“表頭文本”字段和“頁腳文本”字段中的任何缺省文本,使其保持空白>
-
組件類型:
按鈕
-
值表達(dá)式:
Delete
- 寬度: <刪除任何缺省值,使其保持空白>
-
水平對(duì)齊:
居中
-
垂直對(duì)齊:
居中
- 單擊“確定”
-
選擇位于表中最上面的 "Delete" 按鈕,并在“屬性”窗口中將
id
屬性設(shè)置為delete
。
-
雙擊 "Delete" 列中的第一個(gè)按鈕,將打開 Java 編輯器,且插入點(diǎn)位于
delete_action()
事件處理程序中。 -
更改
delete_action()
方法,使其如下所示:代碼樣例 5:刪除操作的代碼 public String delete_action() { form1.discardSubmittedValues("save"); try { RowKey rk = tableRowGroup1.getRowKey(); if (rk != null) { tripDataProvider.removeRow(rk); tripDataProvider.commitChanges(); tripDataProvider.refresh();} } catch (Exception ex) { log("ErrorDescription", ex); error(ex.getMessage()); } return null; }
測(cè)試應(yīng)用程序 - 第 4 部分
通過單擊“運(yùn)行主項(xiàng)目”按鈕以生成、部署和運(yùn)行項(xiàng)目。下圖顯示了運(yùn)行的應(yīng)用程序。
部署后,您應(yīng)該可以從表中刪除行,進(jìn)而將其從數(shù)據(jù)庫中刪除。刪除操作還會(huì)將所有暫掛的更改提交到數(shù)據(jù)庫中。
<!-- BEGIN FIGURE COMPONENT -->圖 15 :測(cè)試應(yīng)用程序,第 4 部分 |
添加恢復(fù)功能
<!-- InsertUpdateDelete12-TP4.zip -->現(xiàn)在,將恢復(fù)功能添加到頁面中。使用此功能,用戶可以放棄其編輯的內(nèi)容,恢復(fù)為以前保存的數(shù)據(jù)。請(qǐng)注意,恢復(fù)功能并不能恢復(fù)已保存或已刪除的行;因?yàn)?"Save Changes" 和 "Delete" 按鈕會(huì)將更改提交到數(shù)據(jù)庫中。
- 在可視設(shè)計(jì)器中,將一個(gè)“按鈕”組件從組件面板拖動(dòng)到 Page1 上。將新的按鈕放在 "Add Trip" 按鈕的右側(cè)。
-
將按鈕的 text 屬性更改為
Revert
Changes
。 -
在“屬性”窗口中,將“按鈕”組件的
id
屬性更改為revert
。 -
雙擊 "Revert Changes" 按鈕,將打開 Java 編輯器,且插入點(diǎn)會(huì)位于
revert_action()
方法中。 -
將下面代碼樣例中以粗體顯示的代碼添加到
<!-- BEGIN CODE SAMPLE COMPONENT -->revert_action()
方法中。代碼樣例 6:恢復(fù)操作的代碼 public String revert_action() { form1.discardSubmittedValues("save"); try { tripDataProvider.refresh(); } catch (Exception ex) { log("Error Description", ex); error(ex.getMessage()); } return null; }
配置虛擬表單
如果應(yīng)用程序使用目前的配置,則會(huì)出現(xiàn)一些不理想的行為。例如,如果用戶在現(xiàn)有行的第一列中輸入一個(gè)無效日期,然后單擊 "Add" 按鈕,操作將會(huì)失敗。由于日期轉(zhuǎn)換錯(cuò)誤拒絕提交表單,因此不會(huì)將任何新行添加到表中。理想的行為是先處理表中的輸入字段,以便在忽略現(xiàn)有行的暫掛內(nèi)容的情況下添加新行。
同樣,當(dāng)用戶單擊 "Delete" 按鈕刪除行時(shí),不論對(duì)該行或其他現(xiàn)有行進(jìn)行了哪些編輯,都應(yīng)該刪除該行。而當(dāng)用戶單擊 "Revert" 按鈕時(shí),其目的是放棄所有編輯的內(nèi)容,這又應(yīng)該忽略以上情況的編輯內(nèi)容。
-
在可視設(shè)計(jì)器中,選中 "Add"、"Delete" 和 "Revert" 按鈕,單擊鼠標(biāo)右鍵,然后從彈出式菜單中選擇“配置虛擬表單”。
在“配置虛擬表單”窗口中,add
、delete
和revert
應(yīng)該出現(xiàn)在其左上角,以表示這些按鈕處于選定狀態(tài)。 -
在“配置虛擬表單”窗口中,單擊“新建”,將新的虛擬表單命名為
<!-- BEGIN FIGURE COMPONENT -->add/delete/revert
,然后將“提交”設(shè)置為“是”。單擊“確定”。圖 16 :為 "Add"、"Revert" 和 "Delete" 按鈕配置虛擬表單
測(cè)試應(yīng)用程序 - 第 5 部分
通過單擊“運(yùn)行主項(xiàng)目”按鈕以生成、部署和運(yùn)行項(xiàng)目。下面的圖 17 顯示了正在運(yùn)行的應(yīng)用程序。
部署后,程序可執(zhí)行以下功能:
- 從下拉列表中選擇一個(gè)名字時(shí),會(huì)顯示出此人的行程摘要。
- 編輯現(xiàn)有的行程信息,并將更改保存到數(shù)據(jù)庫中。
- 在表中添加行,填寫行程字段,并將更改保存到數(shù)據(jù)庫中。
- 從表中(同時(shí)從數(shù)據(jù)庫中)刪除行。
-
放棄編輯內(nèi)容,并恢復(fù)為數(shù)據(jù)庫中最近保存的數(shù)據(jù)。
圖 17 :測(cè)試應(yīng)用程序,第 5 部分 |
小結(jié)
在本教程中,您將表組件、文本字段組件和下拉列表組件與數(shù)據(jù)庫中的信息進(jìn)行了關(guān)聯(lián);此外,為組件設(shè)置了屬性,添加了 prerender 和事件代碼,從而可以插入、更新和刪除數(shù)據(jù)庫中的數(shù)據(jù)并恢復(fù)所做的更改。您還使用了虛擬表單,這使得應(yīng)用程序使用一個(gè)頁面即可,并且提交數(shù)據(jù)時(shí)繞過了有效性檢查。
FROM:http://www.netbeans.org/kb/55/vwp-inserts_updates_deletes_zh_CN.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
