自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

J2EE架構(gòu)和過程

開發(fā) 后端
本文介紹了J2EE平臺的四個關(guān)鍵部分:規(guī)格說明、參考實現(xiàn)、兼容性測試套件和藍圖(BluePrint)計劃。通過閱讀這篇文章,你可以了解許多重要的J2EE架構(gòu)的話題,并且能夠擴展和修改這個簡單的方法來解決自己特有的業(yè)務(wù)問題。

Java2企業(yè)版(J2EE)平臺由四個關(guān)鍵部分構(gòu)成:規(guī)格說明、參考實現(xiàn)、兼容性測試套件和藍圖(BluePrint)計劃。藍圖描繪了分布式組件架構(gòu)最好的實踐和設(shè)計指導方針。本文基于Rational統(tǒng)一過程和BluePrint示例程序介紹一個八步驟J2EE開發(fā)方法學。

通過閱讀這篇文章,你可以了解許多重要的J2EE架構(gòu)的話題,并且能夠擴展和修改這個簡單的方法來解決自己特有的業(yè)務(wù)問題。在商業(yè)世界里,我們使用Java2企業(yè)版(J2EE)解決業(yè)務(wù)問題、開發(fā)商業(yè)軟件或者提供轉(zhuǎn)包服務(wù)。如果一家公司想使用多層體系結(jié)構(gòu)建造一個電子商務(wù)網(wǎng)站,通常在整個開發(fā)生命周期中需要涉及到管理者、架構(gòu)師,設(shè)計人員、編程人員、測試人員和數(shù)據(jù)庫專家。為了使不同部門能高效率地工作,他們經(jīng)常需要一個軟件開發(fā)過程。一些經(jīng)典的開發(fā)過程包括瀑布模型、快速應(yīng)用開發(fā)(RAD)和極限編程(XP)。

本文我們將集中于一個流行的軟件工程過程,即Rational統(tǒng)一過程(RUP)。RUP提供了一個給角色分配任務(wù)和責任的嚴格方法。它的目標是保證我們在預期的進度和預算內(nèi)開發(fā)出滿足用戶需求的高質(zhì)量軟件。

在J2EE開發(fā)中使用RUP出于以下三個原因。首先,RUP以架構(gòu)為中心;在將資源分配給全面開發(fā)之前,它先開發(fā)一個可執(zhí)行的架構(gòu)原型。其次,RUP是迭代并基于構(gòu)件的。該架構(gòu)基線通常包括一個框架或基礎(chǔ)設(shè)施以便于通過迭代增加構(gòu)件,在不影響系統(tǒng)其他部分的前提下定制和擴展一個系統(tǒng)的功能。最后,RUP利用一門工業(yè)標準語言--UML,可視化建模系統(tǒng)的架構(gòu)和構(gòu)件。RUP有四個不同的開發(fā)階段:初始、細化、構(gòu)造和移交。然而,本文從技術(shù)角度覆蓋了J2EE開發(fā)的八個必要活動,主要集中在系統(tǒng)架構(gòu)。

1、需求分析需求分析描述系統(tǒng)應(yīng)該做什么或不應(yīng)該做什么使得開發(fā)者和客戶可以簽署一份原始的商業(yè)合同。可以使用業(yè)務(wù)概念、領(lǐng)域術(shù)語、用例和用戶界面(UI)模型形成功能需求文檔。對于非功能需求,如性能和事務(wù),可以在需求文檔附件中詳細說明。根據(jù)參與項目深度的不同,確定在紙上還是使用HTML建造高層UI模型。

在一個典型電子商務(wù)系統(tǒng)中的兩個用例。查看訂單(viewOrder)用例告訴我們一個用戶通過Web界面登陸系統(tǒng)、查看訂單列表,點擊鏈接查看特定訂單的詳細信息。增加訂單項(addLineItem)用例告訴我們?yōu)g覽產(chǎn)品列表、選擇感興趣的產(chǎn)品并將它們添加到購買訂單中。

2、面向?qū)ο蠓治龇治鋈藛T構(gòu)造問題領(lǐng)域模型:類、對象和交互。分析應(yīng)該與技術(shù)和實現(xiàn)細節(jié)無關(guān),并包含一個理想的模型。對象分析可以幫助理解問題并獲得關(guān)于問題領(lǐng)域的知識。因為業(yè)務(wù)過程的改變比信息技術(shù)的改變要慢得多,所以必須要維持一個不含技術(shù)細節(jié)的純領(lǐng)域模型。這兩個步驟--需求分析和面向?qū)ο蠓治?-不是J2EE特有的;對許多面向?qū)ο蠓椒▽W來說,它們都非常通用。

一個寵物店示例程序的高層對象分析模型。它用圖例說明了我們從需求分析用例中識別的主要概念。我們把這些概念建模成對象并標識它們的關(guān)系。為了開發(fā)架構(gòu),可以選擇一個縱向聯(lián)合部分(verticalpiece)--經(jīng)常是關(guān)鍵部分,如訂單領(lǐng)域?qū)ο竽P?-進行對象設(shè)計、實現(xiàn)、測試和部署。(縱向聯(lián)合部分,一個RUP概念,是指系統(tǒng)的一小部分。起始點是圖1所示的用例子集和圖3所示的領(lǐng)域分析模型。一個縱向聯(lián)合部分的實現(xiàn)結(jié)果是一個全功能的微小系統(tǒng),包括UI層的JSP,中間層業(yè)務(wù)對象如EJB和后端數(shù)據(jù)庫。)可以將從原型中獲得的經(jīng)驗應(yīng)用于領(lǐng)域?qū)ο蟛⒆鳛閷ο笤O(shè)計階段的指導。

3、架構(gòu)規(guī)格說明經(jīng)過前面兩個步驟,業(yè)務(wù)領(lǐng)域問題和需求應(yīng)該比較明確了?,F(xiàn)在,我們將工作集中在技術(shù)策略和架構(gòu)上。架構(gòu)是指所有構(gòu)件組合定義系統(tǒng)的一個藍圖:結(jié)構(gòu)、接口和通訊機制。我們可以進一步將架構(gòu)分為企業(yè)級和應(yīng)用級架構(gòu)。企業(yè)級系統(tǒng)架構(gòu)企業(yè)級系統(tǒng)架構(gòu)包括硬件和軟件基礎(chǔ)設(shè)施、網(wǎng)絡(luò)布局、開發(fā)、測試、生產(chǎn)環(huán)境等等。它反映了一個企業(yè)的長期投資。開發(fā)前,需要評估已存在的軟件和硬件基礎(chǔ)設(shè)施,如果不完全支持J2EE的話,增加新構(gòu)件更新已存在系統(tǒng)。你需要徹底地評估硬件,包括計算機、路由器、網(wǎng)絡(luò)轉(zhuǎn)換器和網(wǎng)絡(luò)布局,因為它們都影響到系統(tǒng)的性能和可靠性。

4企業(yè)級架構(gòu):一個多層企業(yè)級架構(gòu)包括以下幾個主要構(gòu)件:一個Web瀏覽器客戶端,可能在也可能不在客戶端組織的防火墻內(nèi)一個HTTP服務(wù)器,是一個對公眾開放的Web服務(wù)器。它通常位于一個稱作DMZ的子網(wǎng)內(nèi)Web容器主表示層和可能的業(yè)務(wù)邏輯構(gòu)件應(yīng)用程序容器主業(yè)務(wù)邏輯構(gòu)件關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)和數(shù)據(jù)庫主數(shù)據(jù)、數(shù)據(jù)邏輯你使用的系統(tǒng)架構(gòu)類型依賴于安全、性能和可靠性的需求,也依賴于組織的財政狀況。在缺少經(jīng)驗的情況下,也可以適當?shù)貜囊粋€修理廠電話訂購一臺簡單地二手計算機。

Internet上有許多開放源代碼的操作系統(tǒng)、Web服務(wù)器、應(yīng)用程序服務(wù)器和數(shù)據(jù)庫管理系統(tǒng)。得到這些系統(tǒng)的代價只是幾百美元和熬幾個通宵。象許多華爾街金融機構(gòu)這樣的高端客戶也許需要一個連續(xù)支持安全、高吞吐量交易和不可預料網(wǎng)絡(luò)通訊的系統(tǒng)。在這種情況下,為了容錯,通常需要將Web服務(wù)器和應(yīng)用程序服務(wù)器集群配置成一個n層架構(gòu)。還需要評估軟件基礎(chǔ)設(shè)施,包括Web服務(wù)器、安全管理軟件、應(yīng)用程序服務(wù)器、域名管理服務(wù)器、數(shù)據(jù)庫管理系統(tǒng)和第三方軟件構(gòu)件。如果還沒有購買應(yīng)用程序服務(wù)器,選擇一個J2EE供應(yīng)商將是評估過程的一個重要方面。應(yīng)該注意到不同的供應(yīng)商對J2EE的實現(xiàn)程度是不同的,一些供應(yīng)商只支持老的J2EE版本。

另外,一些Web容器或應(yīng)用程序容器可能比其他的速度要快。除了實現(xiàn)J2EE規(guī)范外,許多供應(yīng)商還出售J2EE基礎(chǔ)構(gòu)件或框架。選擇一個穩(wěn)定的提供支持的J2EE供應(yīng)商也非常關(guān)鍵。你可以在系統(tǒng)基礎(chǔ)設(shè)施層面上購買或開發(fā)的通用功能包括:事務(wù)國際化和本地化集群和對象分布應(yīng)用程序性能度量和剖析通訊工作流管理入口和個性化管理層對層通訊協(xié)議安全和防火墻應(yīng)用架構(gòu)應(yīng)用架構(gòu)參考一個特定的項目和規(guī)范建立在企業(yè)級系統(tǒng)架構(gòu)的上層。在基礎(chǔ)設(shè)施完成后,架構(gòu)師研究怎樣構(gòu)造一個特定的應(yīng)用。如果你的企業(yè)級架構(gòu)僅部分支持老的J2EE版本,可以先升級你的系統(tǒng)。如果由于預算或時間關(guān)系不能升級,那么必須在更老版本規(guī)定的技術(shù)范圍內(nèi)開展工作。雖然構(gòu)造企業(yè)級重用構(gòu)件非常重要,但是必須首先要能夠使用。這里的最終目標是滿足客戶的需求--一次一個項目。

架構(gòu)師不是設(shè)計師;架構(gòu)和設(shè)計是完全不同。一個應(yīng)用架構(gòu)的范圍包括系統(tǒng)的主要結(jié)構(gòu)、架構(gòu)設(shè)計模式和可以在上面增加構(gòu)件的框架。架構(gòu)主要關(guān)注的是非功能性方面,而設(shè)計關(guān)注應(yīng)用業(yè)務(wù)用例將領(lǐng)域?qū)ο竽P娃D(zhuǎn)換成技術(shù)對象模型。應(yīng)用架構(gòu)是項目的結(jié)構(gòu),一個特殊的應(yīng)用程序。通過應(yīng)用架構(gòu)開發(fā),你通常必須要做的應(yīng)用架構(gòu)決定包括:層之間進行功能劃分領(lǐng)域?qū)ο蠼RWo的遺留系統(tǒng)要購買的軟件構(gòu)件要開發(fā)的構(gòu)件怎樣集成第三方構(gòu)件圖3的訂單領(lǐng)域?qū)ο笳f明了怎樣對領(lǐng)域?qū)ο筮M行建模。利用當前的Java技術(shù),可以將領(lǐng)域?qū)ο蠓植荚谧鳛殚_發(fā)者管理持續(xù)性對象的Web容器中、應(yīng)用程序服務(wù)器的EJB中或者作為RDBMS宿主的Java存儲過程中。在寵物店藍圖中,我們將訂單對象設(shè)計成一個實體bean,一個詳細對象和一個數(shù)據(jù)訪問對象,如圖5和后面的圖6所示。當你看到這個的時候,你應(yīng)該意識到架構(gòu)的重要性。為什么分析模型中的一個領(lǐng)域?qū)ο笥成涑蛇@么多對象?如果改變設(shè)計,會出現(xiàn)什么問題?你也許聽說過EJB的好處,但是要注意不同供應(yīng)商的性能是不同的。當一種新技術(shù)到來的時候,你需要在投入全面設(shè)計之前進行一些研究。你可以經(jīng)常地將設(shè)計和實現(xiàn)領(lǐng)域?qū)ο竽P涂v向聯(lián)合部分的經(jīng)驗應(yīng)用到其他許多領(lǐng)域?qū)ο笾?。這就是架構(gòu)開發(fā)的內(nèi)容。

對象設(shè)計在架構(gòu)規(guī)范的指導下,設(shè)計從技術(shù)上擴展和修改了分析結(jié)果。雖然分析階段的領(lǐng)域?qū)ο蠼?yīng)該與技術(shù)細節(jié)無關(guān),但是對象設(shè)計完全依賴于技術(shù)因素,包括平臺、語言的類型和架構(gòu)開發(fā)階段選擇的供應(yīng)商。分析時,抬頭望著星星,但在設(shè)計階段,則要腳踏實地。理論上,為了維持業(yè)務(wù)對象的基本屬性和行為,除非絕對必要,不應(yīng)該破壞它們。在架構(gòu)結(jié)果的指導下,詳細設(shè)計工作應(yīng)該說明所有類的規(guī)格,包括必須實現(xiàn)的屬性、它們的詳細接口和偽代碼或操作的純文本描述。規(guī)格說明應(yīng)該足夠詳細使得和模型圖結(jié)合時,它可以提供所有必須的編碼信息。在許多自動化軟件生產(chǎn)過程中,我們可以從面向?qū)ο髨D生成代碼框架。注意樁(stub)和框架(skeleton)在圖中經(jīng)常是不可見的,因為它們對設(shè)計人員和編程員來說是透明的。

#p#對象設(shè)計模型:訂單EJB詳細設(shè)計在完成了詳細對象設(shè)計后,還需要完成領(lǐng)域?qū)ο蟮膶ο?關(guān)系映射。原因是雖然面向?qū)ο蠓椒▽W現(xiàn)在非常流行,但是大多數(shù)流行且成熟的持續(xù)性存儲卻是關(guān)系型的。另外,在許多情況下,客戶的IT基礎(chǔ)設(shè)施已經(jīng)反映了對商業(yè)RDBMS供應(yīng)商的投資和偏愛。所以,將領(lǐng)域?qū)ο筠D(zhuǎn)換成關(guān)系模型或數(shù)據(jù)庫表是非常重要的。雖然有許多容器管理的持續(xù)性工具,但它們不能取代好的關(guān)系數(shù)據(jù)庫設(shè)計。

5、實現(xiàn)在良好的架構(gòu)和詳細設(shè)計條件下,實現(xiàn)應(yīng)該是一個明確的任務(wù)。另外,因為我們設(shè)計和實現(xiàn)架構(gòu)原型階段的縱向聯(lián)合部分,所以實現(xiàn)階段應(yīng)該更沒有什么值得驚訝的。在許多組織中,開發(fā)者經(jīng)常過早地到達實現(xiàn)階段。尤其當管理者盯著開發(fā)人員確保在編碼,而不是做他們認為在浪費公司時間的其他事情時,這種情況變得更加嚴重。結(jié)果,不再花數(shù)小時或數(shù)天繪出UML草圖,而是通常在發(fā)費數(shù)周或數(shù)月編碼的同時測試自己的想法。由于在這種情況下,所有地架構(gòu)決定和設(shè)計都是在編碼階段做出來的,所以經(jīng)常過了數(shù)月后才發(fā)現(xiàn)開發(fā)的方向出錯了。

6、驗證驗證包括測試驗證系統(tǒng)按設(shè)計要求運行并滿足需求。驗證過程發(fā)生在整個開發(fā)生命周期的開發(fā)和產(chǎn)品環(huán)境中。單元測試、集成測試和用戶測試本身就是非常重要的主題。

7、裝配和部署構(gòu)件裝配和解決方案部署在J2EE開發(fā)中特別重要。開發(fā)和產(chǎn)品環(huán)境可能非常不同。如果EJB在系統(tǒng)中,你需要使用供應(yīng)商特定的工具得到容器自動生成的類,因為,正如我以前指出的,Web和應(yīng)用程序構(gòu)件配置對不同的供應(yīng)商來說是不同的。你也必須考慮要部署的系統(tǒng)是否含有供應(yīng)商特定代碼實現(xiàn)。在可擴展架構(gòu)中,系統(tǒng)結(jié)構(gòu)應(yīng)該是穩(wěn)定的但也應(yīng)該在不影響整個系統(tǒng)的條件下支持新或老構(gòu)件的增量部署。

8、運行和維護在最后階段,應(yīng)用程序到了用戶手中,你必須給他們提供培訓和文檔。用戶會發(fā)現(xiàn)錯誤并可能要求新特性。你必須適當?shù)馗淖児芾磉^程來處理這些情況。你不必為了部署一個新構(gòu)件或取代老構(gòu)件而關(guān)閉一個正在運行的系統(tǒng)。架構(gòu)開發(fā)過程知道了必須做出許多架構(gòu)決定,因此我們必須為架構(gòu)開發(fā)描繪一個過程。對于一個企業(yè)來說通常有許多應(yīng)用項目,它們中的一些可能跨越數(shù)年,結(jié)果是系統(tǒng)演化包含許多周期。在你的領(lǐng)域里存在著許多跨越多個項目的通用需求。你應(yīng)該不費力地在它的生命周期或其他項目中使用以前項目周期的可擴展且可重用的架構(gòu)。為一系列軟件應(yīng)用提供同屬結(jié)構(gòu)和行為的通用框架和可重用軟件架構(gòu)是非常需要的。

如果是第一個J2EE項目,架構(gòu)必須做原型、測試、度量、分析并在迭代中進行推敲。藍圖提供了許多好的設(shè)計指導和實踐,寵物店示例程序可以作為一個很好的參考架構(gòu)。最有效地快速、高質(zhì)量發(fā)布好的解決方案的方法是接受和擴展藍圖參考架構(gòu)并插入你自己的業(yè)務(wù)構(gòu)件。你最后要做的就是改造車輪。接受一個參考架構(gòu)就我的理解,寵物店架構(gòu)的精華是模型-視圖-控制和命令模式。你可以將這些模式應(yīng)用到以Web為中心和以EJB為中心的系統(tǒng)中。對于每個領(lǐng)域?qū)ο?,視圖用嵌套的JSP表示??刂破魈幚硐嚓P(guān)的業(yè)務(wù)事件,領(lǐng)域?qū)ο蠓庋b業(yè)務(wù)邏輯、事物和安全。我們使用門戶servlet作為中心控制器接受和截獲所有用戶的動作。它將業(yè)務(wù)事件分發(fā)給特定的調(diào)用領(lǐng)域?qū)ο蟾淖兂掷m(xù)狀態(tài)的領(lǐng)域?qū)ο罂刂破?。依靠事件處理結(jié)果,控制器選擇下一個要展現(xiàn)的視圖。

下面是我們可以修改并在大多數(shù)J2EE應(yīng)用程序中使用的主要構(gòu)件:
a、MainServlet:門戶構(gòu)件,Web容器和框架之間的接口
b、ModelUpdateListener:獲得模型更新事件對象的接口
c、ModelUpdateNotifier:當更新模型事件發(fā)生時通知偵聽器
d、RequestProcessor:處理所有從MainServlet來的請求。
e、RequestHandler:即插即用請求處理構(gòu)件接口
f、RequestHandlerMapping:包含請求處理映射規(guī)則
g、RequestToEventTranslator:中心請求處理器根據(jù)請求處理映射規(guī)則代理即插即用請求處理構(gòu)件的請求。將http請求轉(zhuǎn)換為業(yè)務(wù)事件
h、EstoreEvent:業(yè)務(wù)事件
i、ShoppingClientControllerWebImpl:代理EJB層門戶控制器
j、ScreenflowManager:控制屏幕流,選擇視圖
k、ModelUpdateManager:EJB層模型更新管理器,通知什么模型由于事件發(fā)生了改變
l、ShoppingClientControllerEJB:EJB層門戶,為EJB客戶提供遠程服務(wù)
m、StateMachine:中心事件處理器,根據(jù)狀態(tài)處理映射規(guī)則代理即插即用處理構(gòu)件的事件處理
n、StateHandler:EJB層狀態(tài)處理接口
o、StateHandlerMapping:包含狀態(tài)處理映射規(guī)則擴展參考架構(gòu)雖然藍圖示例程序是一個好的起點,但應(yīng)該根據(jù)每個項目或領(lǐng)域修改它。

設(shè)計模式是可重用的微體系結(jié)構(gòu),可以使用它擴展參考架構(gòu)。提供了一組有用的J2EE模式目錄的藍圖和23個"四人幫"模式都是非常不錯的資源。例如,如果想擴展參考架構(gòu)支持工作流管理,你可以在部署或運行時動態(tài)地在中心控制器注冊事件處理器。中心控制器會詢問每個注冊的事件處理器直到一個處理器返回消息表明到了命令鏈的末端。插入你的業(yè)務(wù)構(gòu)件J2EE技術(shù)對每個人都是一樣的,但是不同的領(lǐng)域,我們要解決的問題是不同的。一旦建立了一個基本的J2EE框架,必須實現(xiàn)一些用例來說明架構(gòu)確實可以為你的領(lǐng)域服務(wù)。可以通過選用捕獲系統(tǒng)關(guān)鍵功能的場景來實現(xiàn),這些場景經(jīng)常使用來展現(xiàn)關(guān)鍵的技術(shù)風險。

從領(lǐng)域分析模型入手,可以將領(lǐng)域?qū)ο笥成涑筛邔雍偷蛯釉O(shè)計模型。實現(xiàn)低層設(shè)計模型并測試是否真正在工作。如果每件事都按計劃運行,那么重新評估風險開始下一個迭代,擴展要考慮的場景并選擇更多的場景擴展架構(gòu)的覆蓋范圍。經(jīng)過幾次迭代后,原始的架構(gòu)原型應(yīng)該變得穩(wěn)定。識別要購買的構(gòu)件,要保留的遺留系統(tǒng)和怎樣將它們對接。

下一步是軟件設(shè)計,你可以使用設(shè)計指導中規(guī)定好的類似方法和過程繼續(xù)開發(fā)。一步一步我們使用一個過程來將一個復雜問題分解為較小的幾個問題,這使得我們可以更容易的理解和解決它們。在本文中,我們將J2EE開發(fā)分解為八個步驟,主要集中在架構(gòu)和設(shè)計。我已經(jīng)闡述了重要的架構(gòu)并為架構(gòu)決定提供了一個過程。我也討論了J2EE架構(gòu)師的角色和可交付產(chǎn)品。學習使用這些步驟開發(fā)J2EE解決方案就象學習跳舞的步驟一樣。首先需要自覺并持之以恒地練習基本步驟。但是,一旦你對它們相當熟悉后,應(yīng)該將它們放在一起并將注意力更多地集中在規(guī)模、速度、流和特定上下文中每一步的節(jié)奏。但永遠不要讓一個過程限制了創(chuàng)造性。而應(yīng)該接受和擴展過程以滿足自己特殊需要。記住,最終目的是提供滿足客戶需求的完整的J2EE解決方案。

【編輯推薦】

  1. J2EE+Flex的菜單及權(quán)限控制實踐
  2. JAVA J2EE框架一覽
  3. 不同的J2EE項目開發(fā)流程
  4. Java EE = J2EE = Java企業(yè)應(yīng)用
  5. J2EE平臺的13種核心技術(shù)
責任編輯:book05 來源: 新浪博客
相關(guān)推薦

2009-06-10 16:25:43

J2EE架構(gòu)架構(gòu)

2009-06-23 08:12:48

J2EE調(diào)用存儲過程

2009-06-23 08:06:46

J2EE體系架構(gòu)J2EE模型J2EE設(shè)計模式

2009-06-22 11:04:00

Jdbc存儲過程

2009-02-23 11:18:06

J2EE架構(gòu)師Java

2009-06-10 14:10:23

J2EE學習J2EE是什么

2009-06-19 17:03:44

J2EE學習

2009-06-11 17:06:11

J2EE歷史Java EE概述

2009-06-10 13:37:06

J2EE可伸縮性J2EE靈活性J2EE維護

2009-06-08 21:34:09

J2EEJ2SEJ2ME

2009-06-23 16:48:26

J2EE常見問題J2EE平臺

2009-06-22 17:05:41

Java EEJava企業(yè)應(yīng)用

2009-06-18 16:13:14

J2EE開發(fā)

2009-06-22 16:21:02

J2EE線程

2009-06-18 15:54:57

J2EE下使用JNDI

2009-06-22 11:15:00

J2EE應(yīng)用測試

2009-06-10 16:35:26

2009-06-23 08:03:02

2009-06-22 11:50:00

J2EE Web應(yīng)用快速開發(fā)

2011-06-30 09:49:40

JSPJ2EE
點贊
收藏

51CTO技術(shù)棧公眾號