第二個範例 (Part IV):新增
The following examples had been tested on Mozilla's Firefox and Microsoft's IE. The document is provided as is. You are welcomed to use it for non-commercial purpose.Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
請勿轉貼
看其他教材
新增存貨資料
顯示完所有的待辦事項後,需要完成的就剩下視窗下半部的新增、修改、以及 刪除。一般來說,這三個步驟習慣上會先實作新增;新增的資料顯示後,我們 緊接著實作修改;等到修改後的資料也正確了,最後就實作刪除,把剛剛新增的 資料除去;這樣的順序可以確保所有的功能都被完成,而且不會留下不必要的 測試資料。 資料的新增、修改、以及刪除在程式設計上需要考量的部分比較多,讓我們拿 之前 Part II 的顯示來說明。由於存貨資料不但儲存在資料庫中,為了能夠讓資料能夠 在畫面上正確的處理,程式裡面還有兩個地方包含有存貨資料,一個是 allItems,另一個是在 id 為 box 的 <listbox> 內(嚴格來說,是在其子元素 <listitem> 內);也就是說,每一次資料庫內的資料改變,其相對應的 allItems 以及 box 都需要跟著改變。有了以上的概念,我們先說明資料的新增處理;新增存貨資料的步驟如下:使用者 在輸入欄位內輸入資料之後,點選"新增"按鈕;在按下"新增"按鈕之後, 資料庫、allItems、以及 box 的資料隨之增加,最後,將輸入欄位內的資料 清除。
點選"新增"按鈕的處理機制: 在使用者按下"新增"按鈕之後,這會觸發一個事件,因此我們需要定義一個 該事件的處理方法,在本範例中稱之為 add()。add() 方法需要完成的事情包含 從輸入欄位取得資料,然後把資料新增到資料庫,最後重新更新畫面。首先, 我們先註冊事件,必須更改新增的按鈕標籤如下:
<button label="新增" width="36px" height="24px" onClick="add()"/>
void add() { }
Product newp = new Product(num.value.intValue(), name.value, price.value.doubleValue(), qty.value.intValue()); allItems.add(newp);
try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/eric", "jlu", "newpasswd"); stmt = conn.createStatement(); String iSQL = "insert into Product values(" + num.value + ",'" + name.value + "'," + price.value + "," + qty.value + ")"; if (stmt.executeUpdate(iSQL) <= 0) throw new SQLException("資料新增失敗"); } catch (SQLException e) { e.printStackTrace(); } finally { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } }
01 Listitem li = new Listitem(); 02 li.setValue(newp); // 在之後的 update, delete 會用到 03 li.appendChild(new Listcell(num.value.toString())); 04 li.appendChild(new Listcell(name.value)); 05 li.appendChild(new Listcell(price.value.toString())); 06 li.appendChild(new Listcell(qty.value.toString())); 07 box.appendChild(li);
最後,就是把欄位資料清空,清空的方式非常簡單,直接把欄位值設定為 null 即可;例如,把 name 欄位的資料清空的方式就是 name.value = null;; 其他三個欄位也比照辦理即可。執行整個程式碼,並新增資料後的畫面如下:
void add() { // 確保新增的資料也在 allItems 內 Product newp = new Product(num.value.intValue(), name.value, price.value.doubleValue(), qty.value.intValue()); allItems.add(newp); // 經資料新增至資料庫 try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/eric", "jlu", "newpasswd"); stmt = conn.createStatement(); String iSQL = "insert into Product values(" + num.value + ",'" + name.value + "'," + price.value + "," + qty.value + ")"; if (stmt.executeUpdate(iSQL) <= 0) throw new SQLException("資料新增失敗"); } catch (SQLException e) { e.printStackTrace(); } finally { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } // 將新增資料形成一個 Listitem 物件(或者節點) Listitem li = new Listitem(); li.setValue(newp); // 在之後的 update, delete 會用到 li.appendChild(new Listcell(num.value.toString())); li.appendChild(new Listcell(name.value)); li.appendChild(new Listcell(price.value.toString())); li.appendChild(new Listcell(qty.value.toString())); // 將 Listitem 物件變成 box 的子節點 // box 是 listbox 的 id 值 box.appendChild(li); // 清除輸入欄位 num.value = null; name.value = null; // 嗯,在 XP + Tomcat 6.x + ZK 5.0.x 的組合下,price.value 會出現 // NullPointerException;需要改成 price.setText(""); // 但是,Win7 x64 + Tomcat 5.5.x + ZK 5.0.x 的組合下, // price.null 卻 OK。 //price.value = null; price.setText(""); qty.value = null; }
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu
沒有留言:
張貼留言