執行插入、更新和刪除操作
<!-- 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 月 [修訂號:V1-1] |
本教程介紹了如何使用 NetBeans Visual Web Pack 5.5 構建一個可以創建、檢索、更新和刪除數據庫行的 Web 應用程序。該應用程序提供一個主數據的下拉列表以及一個同步的詳細信息表。該應用程序的用戶可以在詳細信息表及其關聯數據庫中添加、更新和刪除記錄。 本教程使用了其他基礎教程中介紹的一些概念。如果您不具備 IDE 及其設計組件的基本知識,請考慮首先閱讀基礎教程,如 NetBeans Visual Web Pack 5.5 入門指南 和 使用數據綁定組件訪問數據庫 。 |
目錄
|
|
本教程將使用以下資源
NetBeans Visual Web Pack 5.5 可以與所有支持的服務器以及 Java EE 1.4 和 Java EE 5 平臺配合使用。本教程向您介紹了 Visual Web Pack 的各種功能,這些功能需要利用下表中帶有復選標記的資源。有關支持的服務器和 Java EE 平臺的詳細信息,請參見 NetBeans Visual Web Pack 5.5 安裝說明 。
應用服務器 |
Sun Java System Application Server 9
Tomcat JBoss BEA WebLogic |
JavaServer Faces 組件/
Java EE 平臺 |
1.2/Java EE 5*
1.1/J2EE 1.4 |
Travel 數據庫 | 必需 |
BluePrints AJAX 組件庫 | 不是必需的 |
* 該教程發布時,只有 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 -->創建項目
在本教程中,將創建包含一個頁面的 Web 應用程序。您可以先從設計頁面布局入手,該頁面包含一個人名及其相應的行程,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 1 :初始頁面布局 |
-
創建一個新的 Visual Web 應用程序,并將其命名為
InsertUpdateDelete
。 -
將一個“下拉列表”組件從組件面板的“基本”類別拖動到該頁的左上角。在“屬性”窗口中,將其
id
屬性更改為personDD
。 -
將一個“消息組”組件從組件面板的“基本”類別拖放到下拉列表的右側。
“消息組”組件可用來顯示驗證錯誤和轉換錯誤,以及由info()
和error()
方法寫入到 Java Server Faces 上下文的消息。如果需要調試項目,這些消息將會非常有用。 - 將一個“表”組件放在這兩個組件的下方。
-
打開“運行環境”窗口,展開“數據庫”節點并檢查是否已連接 TRAVEL 數據庫。
如果 TRAVEL 數據庫的 jdbc 節點標記顯示為連接中斷,并且無法展開該節點,則表明 IDE 未連接該數據庫。要連接 TRAVEL 數據庫,請右鍵單擊 TRAVEL 數據庫的 jdbc 節點,然后從彈出式菜單中選擇“連接”。如果出現“連接”對話框,請輸入travel
作為口令,然后單擊“確定”。如果看不到 TRAVEL 數據庫的 jdbc 節點,請參見 NetBeans Visual Web Pack 5.5 安裝說明 以了解如何為 IDE 提供可用的數據庫。 -
展開 TRAVEL 數據庫的 jdbc 節點,然后展開“表”節點。
注意: 在本教程的其余部分中,將 TRAVEL 數據庫的 jdbc 節點稱為 "Travel" 節點。 -
將 "PERSON" 節點拖動到可視設計器的下拉列表上。
“概要”窗口的 "Page1" 部分中將顯示 "personDataProvider" 節點,"SessionBean1" 部分中將顯示 "personRowSet" 節點。 -
右鍵單擊“下拉列表”組件,然后從彈出式菜單中選擇“更改時自動提交”。
此設置使得每當您從列表中選擇新值時,則會將該頁面發送到服務器。 -
右鍵單擊下拉列表,然后從彈出式菜單中選擇“配置虛擬表單”。
在出現的對話框中,請注意personDD
顯示在窗口的左上角中,這表明下拉列表已被選定。 -
單擊“新建”。在“名稱”列中輸入
<!-- BEGIN FIGURE COMPONENT -->person
。雙擊“參與”列下面的字段,并將其設置為“是”,然后對“提交”列執行相同的操作,如下圖所示。
圖 2 :配置虛擬表單
通過使用虛擬表單,應用程序可避免對表中的數據進行不必要的驗證。 - 單擊“確定”。
-
單擊可視設計器工具欄中的“顯示虛擬表單”按鈕,如圖 3 所示。
通過查看虛擬表單,您可以看到可視設計器中的組件與您已經配置的任何虛擬表單之間的關系。
<!-- BEGIN FIGURE COMPONENT -->圖 3 :顯示虛擬表單
- 將 "Travel" >“表”> "TRIP" 節點從“運行環境”窗口拖放到可視設計器中的“表”組件上。
-
右鍵單擊該表,然后從彈出式菜單中選擇“表布局”。
該對話框顯示了您剛創建的 tripDataProvider 中可用的字段,并允許您控制要在表中顯示哪些字段。 -
使用 "<" 按鈕,從右側的“選定”列表中刪除 TRIP.TRIPID、TRIP.PERSONID 和 TRIP.LASTUPDATED,如下圖所示。
-
單擊“選項”標簽,并將標題更改為
Trips Summary
。 -
單擊“確定”。
現在,可視設計器中的“表”組件應如下圖所示。請注意,如果未按下圖順序顯示各列,可通過重新打開“表布局”對話框,單擊“列”標簽并使用“上移”和“下移”按鈕重新對其進行排列。
<!-- BEGIN FIGURE COMPONENT -->圖 5 :Page1 表布局 -
在“概要”窗口中,右鍵單擊 "SessionBean1" 下的 "tripRowSet",然后從彈出式菜單中選擇“編輯 SQL 語句”。
SQL 查詢編輯器將顯示在編輯區域中。 -
在窗口中心附近的網格區域,在 PERSONID 行中單擊鼠標右鍵,然后選擇“添加查詢條件”,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 6 :添加查詢條件 -
在對話框中,將“比較”下拉列表設置為“= 等于”并選中“參數”單選按鈕,然后單擊“確定”。
<!-- BEGIN FIGURE COMPONENT -->圖 7 :“添加查詢條件”對話框
字符 "=?" 將出現在 PERSONID 的“條件”字段中,而條件 "WHERE TRAVEL.TRIP.PERSONID=?" 則出現在編輯器底部 SQL 窗格中的 SQL 語句結尾處。 - 關閉 tripRowSet 的 SQL 編輯器。
更改列組件
-
右鍵單擊“表”組件,然后選擇“表布局”。
將打開“表布局”對話框。 -
在“列”標簽中,從右側的“選定”列表中選擇 "TRIP.DEPDATE"。在對話框底部的“列詳細信息”區域中,將“組件類型”從“靜態文本”更改為“文本字段”,如下圖所示。
<!-- BEGIN FIGURE COMPONENT -->圖 8 :更改列的外觀 - 對 TRIP.DEPCITY 和 TRIP.DESTCITY 執行相同的操作。
- 在“選定”列表中選擇 "TRIP.TRIPTYPEID",然后將“組件類型”從“靜態文本”更改為“下拉列表”。
-
單擊“確定”。
注意: 如果執行上述步驟后表列太寬,則可以通過選擇每列中的第一個組件并拖動其選擇句柄來調整列的大小。 -
將 "Travel" >“表”> "TRIPTYPE" 節點拖動到“表”組件中的下拉列表上。
此操作將創建triptypeDataProvider
。
為表配置虛擬表單
- 在可視設計器中,使用 Ctrl 鍵的同時單擊“表”組件中的三個“文本字段”組件和一個“下拉列表”組件。右鍵單擊其中一個選定的組件,然后從彈出式菜單中選擇“配置虛擬表單”。
- 在“配置虛擬表單”對話框中,確保窗口左上角列出了三個文本字段和一個下拉列表。如果未按下圖所示的方式列出這些內容,請關閉對話框,重新選擇它們,然后再試一次。如果已正確列出這些內容,則單擊“新建”。
-
將新虛擬表單的名稱更改為
<!-- BEGIN FIGURE COMPONENT -->save
,將“參與”設置更改為“是”(如下圖所示),然后單擊“確定”以關閉窗口。圖 9 :為表元素配置虛擬表單
添加事件代碼和初始化代碼
- 雙擊 personDD 下拉列表以創建值更改事件方法(將打開 Java 編輯器,并且插入點將位于該方法內)。
-
在值更改事件方法中,找到注釋行
<!-- BEGIN CODE SAMPLE COMPONENT -->// 待做事項:替換為您的代碼
。使用代碼樣例 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
子句結尾處的form1.discardSubmittedValues("save")
語句可確保每當用戶從下拉列表中選擇新的人員時,將使用新的所選人員的相關信息替換當前行程信息。請您回想一下,顯示行程信息的用戶界面元素都參與了名為 save 的虛擬表單。請注意,事件處理程序并不拋出異常,而是在server.log
文件中記錄異常。事件處理程序還將調用error
方法,當出現錯誤時就會將消息顯示在“消息組”組件中。 -
在 Java 源代碼中滾動至
<!-- BEGIN CODE SAMPLE COMPONENT -->prerender()
方法(或者,如果愿意,請按 Ctrl-F 組合鍵以打開“查找”對話框并搜索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 編輯器中單擊鼠標右鍵,然后選擇“重新設置代碼格式”以便對代碼進行適當的排列。
測試應用程序 - 第 1 部分
在主工具欄上單擊“運行主項目”按鈕以生成、部署和運行項目。當 Web 瀏覽器呈現此頁面時,您會看到一些名字填充了下拉列表,并且表也由一些數據進行了填充。當您從列表中選擇其他名字時,與該名字關聯的行程將會顯示在表中。
<!-- BEGIN FIGURE COMPONENT -->圖 10 :部署的應用程序,測試 1 |
添加插入功能
- 在可視設計器中查看 Page1。
- 在組件面板的“基本”類別中,將“消息”組件分別拖動到表的前三列中最上面的文本字段上。
-
選擇第一個“消息”組件。在“屬性”窗口中,滾動至
for
屬性,然后從下拉列表中選擇textField1
。只有當消息與文本字段正確關聯時,消息文本才會顯示關聯信息,如圖 11 所示。 -
選擇第二個“消息”組件并將其
for
屬性設置為textField2
。 -
將第三個“消息”組件的
<!-- BEGIN FIGURE COMPONENT -->for
屬性設置為textField3
。圖 11 :將“消息”組件與文本字段關聯 - 在組件面板的“基本”類別中,將一個“按鈕”組件拖動到 Page1 上,并將它放置在“表”組件上方靠近第二列的頂部,如圖 12 所示。
-
將其 text 屬性由“
按鈕
”更改為 "Add
Trip
"。 -
在“屬性”窗口中,將按鈕的
id
屬性更改為add
。 - 在可視設計器中,雙擊該按鈕以打開 Java 編輯器,插入點將位于該按鈕的事件處理程序中。
-
修改按鈕的事件代碼(
<!-- 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 編輯器中單擊鼠標右鍵,然后選擇“修復導入”以解決“找不到
RowKey
”的錯誤。IDE 將在
Page1.java
的 import 語句塊中添加下列包:import com.sun.data.provider.RowKey;
測試應用程序 - 第 2 部分
生成、部署和運行項目。當 Web 瀏覽器呈現此頁面時,將顯示 "Add Trip" 按鈕,如下圖所示。每次單擊該按鈕時,都會在表的底部附加一個新的空行。您可以編輯行中的信息,但由于尚未提供行集的保存機制,因此,從下拉列表中選擇其他名字時,所做的更改將會丟失。
<!-- BEGIN FIGURE COMPONENT -->圖 12 :部署的應用程序,測試 2 |
修改頁面以保存行集
- 在編輯器窗口中單擊 "Design" 以返回到可視設計器中的 Page1。
-
從“運行環境”窗口中選擇“數據庫”> "Travel" >“表”> "TRIP" 表,然后將它拖動到“概要”窗口中的 "SessionBean1" 節點上。
<!-- BEGIN FIGURE COMPONENT -->圖 13 :將 TRIP 表拖動到 SessionBean1 上
此操作將會打開“添加新的數據提供器”對話框。 -
單擊“創建 SessionBean1/tripRowSet1”單選按鈕,將數據提供器的名稱更改為
maxTripRowSet
,然后單擊“確定”。注意: 行集在對話框中出現了兩次。這是一個已知問題,請予以忽略。它不會影響本教程中的應用程序。
<!-- BEGIN FIGURE COMPONENT -->圖 14 :將新的數據提供器添加到 SessionBean1 中
此操作將在 SessionBean1 中創建 maxTripDataProvider 和 maxTripRowSet。 -
在“概要”窗口中,雙擊 "SessionBean1" > "maxTripRowSet" 以打開查詢編輯器。在源代碼窗格(上數第三個窗格)中單擊鼠標左鍵。刪除此處現有的 SQL 查詢,然后輸入以下查詢:
SELECT MAX(TRAVEL.TRIP.TRIPID)+1 AS MAXTRIPID FROM TRAVEL.TRIP
MAXTRIPID
值將用在 "Save" 按鈕(接下來,將添加此按鈕)的操作處理程序中。 - 關閉查詢編輯器。請注意,查詢編輯器的圖形編輯器不支持此查詢。如果您看到一個提示出現語法錯誤的警報對話框,可通過單擊“繼續”安全地將其關閉。
- 將一個“按鈕”組件放在表的第一列上方。
-
將按鈕的 text 屬性由“按鈕”
更改為 "
Save Changes
"。 -
在“屬性”窗口中,將其
id
屬性更改為save
。 - 右鍵單擊 "Save Changes" 按鈕,然后從彈出式菜單中選擇“配置虛擬表單”。
-
在“配置虛擬表單”對話框中,確保左上角的列表中顯示的是
save
,以便此窗口中的更改可以應用于 "Save Changes" 按鈕。然后,選擇save
虛擬表單,將“提交”值更改為“是”并單擊“確定”。 - 在可視設計器中,雙擊 "Save Changes" 按鈕以打開 Java 編輯器。在 Java 編輯器中,插入點將位于該按鈕的事件處理程序中。
-
修改該按鈕的事件代碼(
<!-- 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; }
測試應用程序 - 第 3 部分
通過單擊“運行主項目”按鈕以生成、部署和運行項目。應用程序將可以實現以下功能:
- 可以添加行程并進行保存。行程將會顯示在表中,并且在選擇其他人員后重新返回時,該行程仍然存在。
- 可以編輯現有的行程信息,并保存所做的更改。
- 如果在 "Date" 字段中輸入除日期之外的內容,則應用程序將提供一條錯誤消息。
- 在保存之前可以多處單擊 "Add Trip",這是一次添加多行的簡便方法。
- 如果在保存之前切換到其他人員,則會丟失所有更新(包括在所添加的行上正在填寫的信息)。
- 如果修改了某些值,然后單擊某個列標題(使之按該列進行排序),則表組件會記住這些暫掛的更改,并在隨后可以保存這些更改。
添加刪除功能
<!-- InsertUpdateDelete12-TP3.zip -->
現在,將刪除功能添加到表中。利用此功能,用戶能夠通過從數據庫中刪除某行來刪除行程。在本教程中,"Delete" 按鈕的操作是即時的,并且從數據庫中刪除行時并不需要使用 "Save Changes" 按鈕。實際上,由于 "Delete" 按鈕的事件處理程序使用
commitChanges()
方法,因此它也像 "Save Changes" 按鈕一樣保存所有暫掛的更改。
-
在可視設計器中,右鍵單擊“表”組件,然后從彈出式菜單中選擇“表布局”。
將打開“表布局”對話框。 - 單擊“列”標簽,然后單擊“新建”,將一個新列添加到表中。
-
在“選定”列表中選擇新列的名稱后,在“列詳細信息”區域中進行如下更改:
- 表頭文本和頁腳文本: <刪除“表頭文本”字段和“頁腳文本”字段中的任何缺省文本,使其保持空白>
-
組件類型:
按鈕
-
值表達式:
Delete
- 寬度: <刪除任何缺省值,使其保持空白>
-
水平對齊:
居中
-
垂直對齊:
居中
- 單擊“確定”
-
選擇位于表中最上面的 "Delete" 按鈕,并在“屬性”窗口中將
id
屬性設置為delete
。
-
雙擊 "Delete" 列中的第一個按鈕,將打開 Java 編輯器,且插入點位于
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; }
測試應用程序 - 第 4 部分
通過單擊“運行主項目”按鈕以生成、部署和運行項目。下圖顯示了運行的應用程序。
部署后,您應該可以從表中刪除行,進而將其從數據庫中刪除。刪除操作還會將所有暫掛的更改提交到數據庫中。
<!-- BEGIN FIGURE COMPONENT -->圖 15 :測試應用程序,第 4 部分 |
添加恢復功能
<!-- InsertUpdateDelete12-TP4.zip -->現在,將恢復功能添加到頁面中。使用此功能,用戶可以放棄其編輯的內容,恢復為以前保存的數據。請注意,恢復功能并不能恢復已保存或已刪除的行;因為 "Save Changes" 和 "Delete" 按鈕會將更改提交到數據庫中。
- 在可視設計器中,將一個“按鈕”組件從組件面板拖動到 Page1 上。將新的按鈕放在 "Add Trip" 按鈕的右側。
-
將按鈕的 text 屬性更改為
Revert
Changes
。 -
在“屬性”窗口中,將“按鈕”組件的
id
屬性更改為revert
。 -
雙擊 "Revert Changes" 按鈕,將打開 Java 編輯器,且插入點會位于
revert_action()
方法中。 -
將下面代碼樣例中以粗體顯示的代碼添加到
<!-- BEGIN CODE SAMPLE COMPONENT -->revert_action()
方法中。代碼樣例 6:恢復操作的代碼 public String revert_action() { form1.discardSubmittedValues("save"); try { tripDataProvider.refresh(); } catch (Exception ex) { log("Error Description", ex); error(ex.getMessage()); } return null; }
配置虛擬表單
如果應用程序使用目前的配置,則會出現一些不理想的行為。例如,如果用戶在現有行的第一列中輸入一個無效日期,然后單擊 "Add" 按鈕,操作將會失敗。由于日期轉換錯誤拒絕提交表單,因此不會將任何新行添加到表中。理想的行為是先處理表中的輸入字段,以便在忽略現有行的暫掛內容的情況下添加新行。
同樣,當用戶單擊 "Delete" 按鈕刪除行時,不論對該行或其他現有行進行了哪些編輯,都應該刪除該行。而當用戶單擊 "Revert" 按鈕時,其目的是放棄所有編輯的內容,這又應該忽略以上情況的編輯內容。
-
在可視設計器中,選中 "Add"、"Delete" 和 "Revert" 按鈕,單擊鼠標右鍵,然后從彈出式菜單中選擇“配置虛擬表單”。
在“配置虛擬表單”窗口中,add
、delete
和revert
應該出現在其左上角,以表示這些按鈕處于選定狀態。 -
在“配置虛擬表單”窗口中,單擊“新建”,將新的虛擬表單命名為
<!-- BEGIN FIGURE COMPONENT -->add/delete/revert
,然后將“提交”設置為“是”。單擊“確定”。圖 16 :為 "Add"、"Revert" 和 "Delete" 按鈕配置虛擬表單
測試應用程序 - 第 5 部分
通過單擊“運行主項目”按鈕以生成、部署和運行項目。下面的圖 17 顯示了正在運行的應用程序。
部署后,程序可執行以下功能:
- 從下拉列表中選擇一個名字時,會顯示出此人的行程摘要。
- 編輯現有的行程信息,并將更改保存到數據庫中。
- 在表中添加行,填寫行程字段,并將更改保存到數據庫中。
- 從表中(同時從數據庫中)刪除行。
-
放棄編輯內容,并恢復為數據庫中最近保存的數據。
圖 17 :測試應用程序,第 5 部分 |
小結
在本教程中,您將表組件、文本字段組件和下拉列表組件與數據庫中的信息進行了關聯;此外,為組件設置了屬性,添加了 prerender 和事件代碼,從而可以插入、更新和刪除數據庫中的數據并恢復所做的更改。您還使用了虛擬表單,這使得應用程序使用一個頁面即可,并且提交數據時繞過了有效性檢查。
FROM:http://www.netbeans.org/kb/55/vwp-inserts_updates_deletes_zh_CN.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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