日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

將存儲過程封裝為EJB組件的方法

出處:woymoon 發(fā)布于:2007-04-29 10:35:05

集成 Web 應(yīng)用服務(wù)器和數(shù)據(jù)庫管理 (DBMS) 技術(shù)是很多新型商業(yè)應(yīng)用的常見需求。在本文中,我們將討論該集成的一個方面:如何在會話 Enterprise JavaBeans (EJB) 組件中設(shè)計與開發(fā)封裝或調(diào)用現(xiàn)有 DBMS 存儲過程的方法。您應(yīng)該熟悉 EJB 技術(shù)、結(jié)構(gòu)化查詢語言 (SQL) 和 Java 數(shù)據(jù)庫連接 (JDBC) 的基本知識,以便充分理解本文。  如果您正致力于需要訪問或修改在 DMBS 中數(shù)據(jù)的 Web 應(yīng)用程序開發(fā),那么可能已經(jīng)在向基于 EJB 的設(shè)計轉(zhuǎn)移。您可能會發(fā)現(xiàn),通過使會話 EJB 組件利用 DBMS 存儲過程,可以減少編碼和維護工作,并可能提高數(shù)據(jù)訪問性能。

  一些公司多年來一直在使用存儲過程(stored procedure),很大程度上是因為它們可以幫助減少網(wǎng)絡(luò)通信量,并提高分布式計算環(huán)境中的性能。通常,這些過程包含涉及多數(shù)據(jù)庫操作的重要業(yè)務(wù)邏輯。遠程應(yīng)用程序調(diào)用這些過程,在 DMBS 服務(wù)器上執(zhí)行它們所包含的 SQL 語句。當然,過程結(jié)束時,所有結(jié)果都返回給應(yīng)用程序。

  這些舊有存儲過程對 Web 應(yīng)用通常是有用的。與其在 EJB 組件中復(fù)制這些邏輯,為什么不將這些過程作為方法封裝在會話 bean 中呢?這樣可以避免 DBMS 服務(wù)器和 EJB 組件中的冗余代碼 -- 在考慮開發(fā)、調(diào)試和維護開銷時,冗余代碼將損耗開發(fā)效率。這還可能帶來提高性能的好處。調(diào)用存儲過程可以減少 EJB 組件原本不得不發(fā)出的 SQL 語句數(shù)量,從而減少與遠程 DBMS 的通信開銷。
 入門

  現(xiàn)在明白為什么要從會話 bean 調(diào)用存儲過程了吧,下面我們看看如何開始。首先,需要使用適當?shù)拈_發(fā)環(huán)境,該環(huán)境應(yīng)該包括一個帶有內(nèi)置 EJB 支持的 Java 開發(fā)工具,一個 Web 應(yīng)用服務(wù)器和一個關(guān)系 DBMS。我的參考配置包括 VisualAge for Java 企業(yè)版 3.0.2,WebSphere Application Server 版 3.0.2.1,以及 DB2 V7.1,所有這些都安裝在一個 Windows NT 系統(tǒng)上。有關(guān)如何配置該環(huán)境以支持本文所述工作的詳細信息,請參閱 "Leveraging DBMS Stored Procedures through Enterprise JavaBeans"(位于參考資料中)或參考產(chǎn)品手冊。

  有了正確的軟件環(huán)境,就可以開始了。雖然我們要討論的編碼模式可能適合于無狀態(tài)會話(stateless session) bean,但它也可使用有狀態(tài)會話(stateful session) bean 組件。但是,因為無狀態(tài)會話 bean 比有狀態(tài)會話 bean 消耗的系統(tǒng)資源更少,而且涉及的代碼也更少,所以通常建議使用無狀態(tài)會話 bean。

  首先要考慮的設(shè)計問題是如何在存儲過程和 EJB 組件之間映射數(shù)據(jù)。存儲過程可能需要多個輸入、輸出和輸入/輸出參數(shù),并返回一個或多個結(jié)果集(代表數(shù)據(jù)行)。除非要對不同類型的過程使用不同的編碼模式,您需要編寫 EJB 組件以便處理所有這些可能性。

  處理輸入(或者輸入/輸出)參數(shù)很簡單:將存儲過程需要的每個參數(shù)映射成 EJB 組件的輸入?yún)?shù)。但是,處理存儲過程的輸出比較棘手??赡苡卸鄠€輸出參數(shù)和多個結(jié)果集要傳回調(diào)用程序,需要將這些作為一個可序列化的對象返回,以符合 EJB 規(guī)范??梢跃帉懽约旱念?,使其可以將這些數(shù)據(jù)打包成一個對象,并在該對象中包括所有必須的元數(shù)據(jù)。(該元數(shù)據(jù)將描述對象的內(nèi)部結(jié)構(gòu),以便客戶機知道如何處理。)但這需要大量工作。

  如果正在使用 VisualAge for Java 和 WebSphere,那么,有個更好的選項:使用它們的數(shù)據(jù)訪問 Bean (DAB) 庫。該庫包含一些提供位于基本 JDBC 之上的函數(shù)層的類??赡軙l(fā)現(xiàn) com.ibm.db.CallableStatement 類特別方便,因為它允許創(chuàng)建一個可序列化的對象,該對象包含所有從存儲過程返回的輸出,包括多個結(jié)果集(如果有的話)和相關(guān)元數(shù)據(jù)。還有一個好處是,該庫設(shè)計成可以支持任何支持 JDBC 的數(shù)據(jù)源,因此,它可以使 bean“與 DBMS 無關(guān)”。有了 DAB 庫,就可以用一個編碼模式在會話 EJB 組件中封裝任何存儲過程。甚至可以在 EJB 客戶機中使用一個通用的編碼模式,來處理任何從封裝器方法返回的結(jié)果。

回顧開發(fā)任務(wù)

  我們來討論一下使用通用編碼模式,來集成 EJB 組件和 DBMS 存儲過程的步驟:

  確定要將哪個存儲過程封裝成 EJB 方法。如果該過程不存在,則遵循 DBMS 標準過程來創(chuàng)建和調(diào)試。

  確定要使用哪個無狀態(tài)會話 EJB 組件。如果該 EJB 不存在,則遵循 Java 開發(fā)環(huán)境的標準過程來創(chuàng)建和調(diào)試。

  擴展 EJB 組件的遠程接口,以包括用于封裝存儲過程的新方法。

  擴展 EJB 組件的實現(xiàn),以包括封裝存儲過程的新方法的邏輯。連接到數(shù)據(jù)庫、調(diào)用存儲過程、處理所有結(jié)果集和處理所有異常是后面要解決的問題。

  通過構(gòu)建一個客戶機應(yīng)用或 Servlet,來調(diào)用 EJB 組件封裝器方法,以測試所做的工作。

  頭兩項是基本編程任務(wù),您可能已經(jīng)熟悉。根據(jù)所用產(chǎn)品的不同,個別步驟可能會略有不同,但是大多數(shù)產(chǎn)品都有工具來提供幫助。例如,如果正在使用 VisualAge for Java 和 DB2,則可以利用“存儲過程構(gòu)建器”來完成步驟 1,以及利用 EJB 開發(fā)特性來完成步驟 2。本文將不集中講述頭兩步。但是,其余三步需要詳細講解。本文將在一個實際示例的環(huán)境下討論這些步驟中的每一步。

  瀏覽應(yīng)用方案

  假設(shè)需要構(gòu)建一個應(yīng)用,該應(yīng)用支持一家公司的市場營銷分部,該分部維護面向金融的 Web 站點。該站點允許人們注冊為客戶,跟蹤他們的投資總額,以及在電子公告板上發(fā)表意見。另外還假設(shè),支持該站點的數(shù)據(jù)存儲在 DB2 的表中。以下代碼樣本顯示如何創(chuàng)建這些表。

  在 DB2 中創(chuàng)建樣本表的 SQL 語句

create table client (

id int not null primary key,

name varchar(30),

email varchar(30),

phone varchar(12),

regdate date,

mktg char,

constraint check1 check (mktg in (‘y‘, ‘Y‘, ‘n‘, ‘N‘))

)

create table portfolio (

id int not null,

clientID int not null references client,

ticker varchar(10) not null,

cost decimal (9,2),

qty int,

date date,

primary key (id, clientID, ticker)

)

create table boards (

msgno varchar(15) not null primary key,

subject varchar(40),

date date,

clientID int not null references client

)


  該數(shù)據(jù)庫還包含一個特別重要的存儲過程。過程 CLIENTREPORT 提供注冊站點用戶的綜合概要,包括用戶投資和他們在公告板上討論的問題。這個還包括客戶名稱和電子郵件地址,以便在用戶提出有關(guān)有潛在價值的附加產(chǎn)品或服務(wù)方面的建議時,市場營銷人員可以與這些用戶聯(lián)絡(luò)。要在會話 EJB 組件中封裝的就是這個過程。

  因為此過程可能用多種語言(包括 Java 編程語言)編寫,這里就不顯示它的完整內(nèi)容。不管怎么說,源代碼確實不那么重要,因為您不能假設(shè)總是可獲得它們。但是,為了告訴您存儲過程有什么內(nèi)容,這里顯示了它包括的三個 SELECT 語句:

  CLIENTREPORT 存儲過程中的 SQL 語句:

select name, e-mail from client where id = ?

select id, ticker, cost, qty, date from portfolio where clientid = ?

select msgno, subject, date from boards where clientid = ?

  問號表示,該語句將依賴運行時來自調(diào)用程序的輸入,在這種情況下,調(diào)用程序必須提供一個代表感興趣的客戶標識的有效數(shù)據(jù)值。通過這些語句,您可以猜出,存儲過程將需要一個輸入?yún)?shù)(用于客戶標識),返回兩個輸出參數(shù)(用于客戶名稱和電子郵件地址),并返回兩個結(jié)果集(一個包含有關(guān)客戶投資總額的數(shù)據(jù),另一個包含有關(guān)客戶公告板發(fā)表內(nèi)容的數(shù)據(jù))。
修改 EJB 組件的遠程接口

  現(xiàn)在我們來開始 EJB 組件代碼工作。

  既然要使封裝器方法對 EJB 組件客戶機可用,我們需要擴展 bean 的遠程接口。將使用一個名為 Analysis 的無狀態(tài)會話,并包括一個 lookupClient 方法,以用于存儲過程封裝器。該方法需要一個整數(shù)作為輸入,以代表要的客戶標識,它返回一個 DAB CallableStatement 對象(位于 com.ibm.db.* 包中)。將把該過程返回的任何異常轉(zhuǎn)換成 RemoteExceptions(這適用于與 EJB 1.0 兼容的會話 bean)。

  以下編碼示例顯示了 EJB 組件遠程接口的修改部分。

  EJB 組件遠程接口

// Enterprise JavaBean Remote Interface for Analysis session bean

public interface Analysis extends javax.ejb.EJBObject {

// remote interface for our lookupClient method

com.ibm.db.CallableStatement lookupClient(java.lang.Integer clientId)

throws java.rmi.RemoteException;

. . .

}


  請注意,如果使用 VisualAge EJB 組件向?qū)В瑒t無需對此進行手工編碼。替代方法是,在 bean 的實現(xiàn)類中對此方法編碼之后,通過菜單項來將該方法提升(promote)到 bean 的遠程接口,然后,將自動添加必需的代碼。

  編碼存儲過程封裝器方法

  現(xiàn)在可以集中講述 bean 實現(xiàn)類本身,將在該實現(xiàn)類中包括調(diào)用存儲過程的代碼,并將其所有輸出作為 com.ibm.db.CallableStatement 對象返回。包含調(diào)用 CLIENTREPORT 存儲過程的 lookupClient(...) 方法的完整實現(xiàn)。將在后續(xù)章節(jié)中詳細講解每個代碼塊(參考代碼中的注釋)的邏輯,以便您更好地理解如何為自己的存儲過程實現(xiàn)類似的方法。

  連接到數(shù)據(jù)庫

  讓我們更詳細地查看此代碼的各部分。

  在調(diào)用存儲過程之前,需要建立一個到 DBMS 的連接。有兩種方法做得到:使用 1.0 樣式的連接,或者使用 JDBC 2.0 樣式的 DataSource。在 WebSphere 環(huán)境中,通常選用后者,因為它提供連接池(connection pooling),這可以更有效地使用系統(tǒng)資源。出于這種原因,我們的編碼模式使用 DataSource。

  除了確定要建立的連接類型之外,還應(yīng)該考慮要將連接邏輯放在 bean 中的什么地方。有多個選擇:

  直接放在封裝器方法(wrapper method)中

  放在私有輔助方法(helper method)中

  放在 ejbCreate() 方法中(并將相應(yīng)的斷開邏輯放在 ejbRemove() 方法中)

  這些方法的利弊超出了本文的范圍。為簡單起見,樣本代碼將所有連接/斷開邏輯直接放在方法中。

  代碼塊 1 顯示了在使用 VisualAge for Java 3.0.2 和 WebSphere 3.0.2.1 時,如何使用 DataSource 進行連接。我們創(chuàng)建了一個散列表,在其中填充適合于 WebSphere 環(huán)境的值,然后建立一個 InitialContext。代碼的以下幾行利用該初始上下文和 Java 命名和目錄接口 (JNDI) 服務(wù),來獲得期望的 DataSource 的索引,我們以前在 WebSphere 中用“管理控制臺”創(chuàng)建了該 DataSource。本例中的 DataSource 名為 LocalDB2Sample。下一步,使用該 DataSource 來獲得一個連接,并向其傳遞合適的數(shù)據(jù)庫用戶標識和口令。從連接池獲得連接之后,可以將該信息提供給 DAB DatabaseConnection 對象,來設(shè)置它所需的連接規(guī)范。,將 autoCommitMode 設(shè)置成 false,因為 EJB 組件負責處理事務(wù)管理服務(wù)。

  測試時,在 VisualAge for Java WebSphere 測試環(huán)境中運行使用 DataSource 的 EJB 組件會很方便。有關(guān)如何在產(chǎn)品發(fā)行版 3.0.2 中這樣做的指示,請參閱 David Zimmerman 所著的 "Creating DataSources in the VisualAge for Java WebSphere Test EnvIRonment"(在參考資料中)。

 調(diào)用存儲過程

  建立了連接之后,可以集中講述如何調(diào)用存儲過程了。如封裝器方法編碼示例中的代碼塊 2 所示,首先創(chuàng)建一個 DAB StatementMetaData 對象,該對象中有存儲過程的規(guī)范。下一步,定義要執(zhí)行的 SQL 語句。在這里將要調(diào)用 CLIENTREPORT 過程,該過程需要一個輸入?yún)?shù)(用于客戶標識)和兩個輸出參數(shù)(用于客戶名稱和電子郵件地址)。下一步,將參數(shù)添加到規(guī)范中。對于每個過程參數(shù),都指定了參數(shù)名,其數(shù)據(jù)類型及其參數(shù)模式。

  代碼塊 3 創(chuàng)建即將執(zhí)行的 DAB CallableStatement 對象。CallableStatement 代表可用來執(zhí)行存儲過程的 SQL。創(chuàng)建完對象之后,將其元數(shù)據(jù)設(shè)置成在代碼塊 2 中指定的形式。然后將 DatabaseConnection(在代碼塊 1 中創(chuàng)建)與該 CallableStatement 關(guān)聯(lián)。

  下一個任務(wù)很簡單:需要執(zhí)行 CallableStatement 對象,這將使 DBMS 運行存儲過程。但是,在這樣做之前,必須通過 EJB 客戶機應(yīng)用程序,將過程的輸入?yún)?shù)設(shè)置成傳入方法的值。代碼塊 4 中顯示了這種邏輯。

  檢索存儲過程的輸出并返回到調(diào)用程序

  在封裝器方法編碼示例的代碼塊 5 中,將檢索存儲過程返回的輸出參數(shù)。想起來了嗎?這些參數(shù)代表 Web 站點客戶的名稱和電子郵件地址。但是,不需要顯式地檢索存儲過程返回的結(jié)果集。(這些結(jié)果集包含有關(guān)客戶投資總額和公告板發(fā)表信息的數(shù)據(jù))。您可能要問:為什么會這樣呢?

  某些 DBMS 要求,在獲得任何輸出參數(shù)值之前,要從存儲過程返回的結(jié)果集檢索所有需要的值。由于這種要求,在通過 getParameter() 方法進行特別請求之前,CallableStatement bean 不從數(shù)據(jù)庫獲得任何輸出參數(shù),因為何時從結(jié)果集檢索數(shù)據(jù)是由用戶控制的。缺省情況下,在執(zhí)行存儲過程之后,將自動檢索結(jié)果集,并將其存儲在高速緩存中。但是,必須顯式檢索輸出參數(shù),并將其存儲在高速緩存。

  檢索完輸出參數(shù)之后,將 DAB CallableStatement 返回給 EJB 組件的調(diào)用程序。該對象現(xiàn)在包含過程返回的所有輸出(包括結(jié)果集),和幫助調(diào)用程序正確分析對象語法的適當?shù)脑獢?shù)據(jù)。當我們查看調(diào)用會話 bean 封裝器方法的樣本客戶機應(yīng)用程序時,將看到如何去做。

  如果您熟悉 JDBC,可能會問:為什么不在此代碼塊中顯式發(fā)出 commit 語句。確實,如果使用的是 JDBC 1.0 樣式的連接,可能需要(否則,當在 "finally" 塊中關(guān)閉數(shù)據(jù)庫連接時,將逆序恢復(fù)所做的工作)。但是,使用 DataSource 并接受 WebSphere 缺省的 EJB 組件屬性 (TX_REQUIRED),WebSphere 將自動為我們的工作提供事務(wù)管理。因此,不再需要顯式的 commit 語句。

  處理異常與關(guān)閉打開的資源

  當然,在執(zhí)行會話 bean 時可能會出錯。因此,需要提供異常處理。代碼塊 6 包括適合于與 EJB 1.0 兼容的 bean 的簡單異常處理程序。它只是捕獲遇到的任何異常,包括一個適當?shù)腻e誤消息,并將異常作為新的 RemoteException 拋回給調(diào)用程序。

  另外,該代碼塊還包含一個 "finally" 塊,以確保關(guān)閉所有打開的資源。在這里,釋放任何與 CallableStatement 對象關(guān)聯(lián)的資源。下一步,除去在工作中所用的任何對連接的 DAB 引用。,確保關(guān)閉 WebSphere 連接。

  構(gòu)建客戶機應(yīng)用程序

  構(gòu)建了 EJB 封裝器方法之后,該集中講述客戶機應(yīng)用程序了。與 EJB 組件一樣,首先展示客戶機應(yīng)用程序的完整代碼樣本。然后,將詳細講述個別代碼塊。

  這里顯示的客戶機應(yīng)用程序 -- ClientAnalysis -- 使用 RMI/IIOP 與 EJB 組件通信。其工作很簡單:創(chuàng)建會話 bean,調(diào)用它的 lookupClient(...) 方法,處理該方法返回的 DAB CallableStatement 對象,然后除去 bean。將該應(yīng)用程序編寫成處理 CallableStatement 的通用客戶機,即,假設(shè)事先不知道有關(guān) CallableStatement 內(nèi)部結(jié)構(gòu)的任何信息。相反,我們嚴格依賴其中包含的元數(shù)據(jù),來分析對象的語法,并使用其相關(guān)組件,如過程返回的輸出參數(shù)和結(jié)果集。這種方法演示了通用的編碼模式,可以在處理 CallableStatement 的任何應(yīng)用程序中使用。就這樣,它補充了在無狀態(tài)會話 EJB 組件中對封裝存儲過程所用的通用編碼模式。

  創(chuàng)建 EJB 組件并調(diào)用其封裝器方法

  客戶機應(yīng)用程序的代碼塊 1 以 main(...) 方法開始。它指定感興趣的客戶標識,并調(diào)用一個私有輔助方法,來獲得正在使用的會話 EJB 組件。執(zhí)行完 bean 之后,調(diào)用 lookupClient(...) 方法。這是封裝 CLIENTREPORT 存儲過程并返回 DAB CallableStatement 的方法。

  需要詳細講述私有輔助方法 -- createEJB()。因為 EJB 組件創(chuàng)建工作可能會根據(jù)所用的 Web 應(yīng)用程序而略有不同,所以,選擇將這個工作隔離成單獨的方法。特別是,由于與該上下文相關(guān)的特定屬性將會改變,所以,獲得 JNDI InitialContext 的方法可能不同。

  該 createEJB() 方法創(chuàng)建一個散列表,然后用適合于軟件環(huán)境的值填充。下一步,創(chuàng)建一個新的 InitialContext 對象,該對象用于通過 JNDI 服務(wù)獲得對 EJB 組件的遠程引用。因為從 JNDI 上下文返回 JNDI(這是在 IIOP 之上使用 RMI 的編碼需求),所以,限制了該遠程引用。獲得 EJB 組件宿主之后,創(chuàng)建一個無狀態(tài)會話 bean,然后將其返回給客戶機應(yīng)用程序的 main 方法。


  處理返回的對象

  客戶機應(yīng)用程序的代碼塊 2 處理 EJB 組件返回的 DAB CallableStatement 對象。首先定位與 CallableStatement 關(guān)聯(lián)的根元數(shù)據(jù)對象。因為 CallableStatements 可以獲得多個結(jié)果集,所以,多個 StatementMetaData 對象可以鏈接在一起,并包括在 CallableStatement 中。而鏈的根總包含描述 SQL 語句的元數(shù)據(jù)和相關(guān)參數(shù),因此,這就是我們的開始之處。這允許我們獲得 CallableStatement 中包括的參數(shù)數(shù)目。返回的數(shù)目將包括過程的所有 IN、INOUT 和 OUT 參數(shù)。通過使用循環(huán),可以處理所有參數(shù)并打印每個參數(shù)的相關(guān)信息,包括參數(shù)名、相應(yīng)的 Java 類和模式(指明 IN、INOUT 或 OUT 模式的數(shù)字)。

  下一步,查看結(jié)果集并處理它們。首先,確定 CallableStatement 對象中包括的結(jié)果集數(shù)目。通過使用循環(huán),可以獲得每個用 DAB SelectResult 對象表示的結(jié)果集。然后,使用另一個私有輔助方法 processRS(...) 來處理結(jié)果集。processRS(...) 方法確定傳遞給 SelectResult 并包含在其中的行和列的數(shù)目。假設(shè)有一些行存在,它使用嵌套循環(huán)來打印有關(guān)所有行中的所有列的信息。該信息包括列名和它的值。

  目前為止,客戶機應(yīng)用程序的工作幾乎完成。代碼塊 3 除去會話 bean,打印一行表明已完成,然后終止。當然,在代碼塊 3 之后的代碼處理任何遇到的異常。在這里,只打印一個堆棧跟蹤。

  總結(jié)

  希望您已理解會話 EJB 組件如何利用封裝在舊有 DBMS 存儲過程中的商業(yè)邏輯。這樣做的其它可能的好處包括:減少 EJB 服務(wù)器和 DBMS 之間的網(wǎng)絡(luò)通信量,提高生產(chǎn)力,以及降低總體軟件維護成本。如果遵循本文中列出的編碼模式,則無論與過程相關(guān)的參數(shù)或結(jié)果集如何,您都可以將任何類型的存儲過程作為方法封裝在無狀態(tài)會話 bean 中。而且,您將可以使用通用編碼模式來調(diào)用任何這樣的 EJB 組件,并處理它返回的對象,而不必事先知道該對象的內(nèi)部結(jié)構(gòu)。

  
關(guān)鍵詞:將存儲過程封裝為EJB組件的方法

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!