廖藝咪
摘要:通過對傳統(tǒng)的超文本傳輸協(xié)議(HTTP)在上傳大文件方面的優(yōu)缺點(diǎn)分析,提出了在基于SSH2架構(gòu)的信息系統(tǒng)建設(shè)過程中,利用文件傳輸協(xié)議(FTP)實(shí)現(xiàn)大文件的上傳技術(shù),目的在于提高大文件的上傳速度,使設(shè)計(jì)出來的軟件能夠極大地提高工作效率。
關(guān)鍵詞:軟件體系結(jié)構(gòu);SSH2架構(gòu);FTP文件上傳
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)22-0037-03
Abstract: Through the traditional Hypertext Transfer Protocol (HTTP) in large file upload the advantages and disadvantages of analysis, proposed based on struts2+spring+hibernate(SSH2) architecture of information system construction process, using file transfer protocol (FTP) implementation of large files upload technology. The purpose is to improve the large file upload speed, designed to make the software can greatly improve the working efficiency.
Key words: software architecture; SSH2 framework; FTP file upload
文本傳輸協(xié)議(HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的www文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計(jì)HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。目前我們所訪問的網(wǎng)站大都是以HTTP協(xié)議來傳輸和工作的。文件傳輸協(xié)議(FTP)是一個可以用于跨平臺(在兩臺裝有不同操作系統(tǒng)的機(jī)器上)傳輸計(jì)算機(jī)文件的軟件標(biāo)準(zhǔn)。它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。主要用戶于上傳和下載文件。在某些信息系統(tǒng)項(xiàng)目的實(shí)際應(yīng)用中,需要將一些文件上傳到Web服務(wù)器中,這些文件比較大可能要幾百M(fèi)B甚至1G以上,而且為防止文件重名被覆蓋,需要對文件進(jìn)行重命名,并儲存到相應(yīng)的數(shù)據(jù)庫中。用HTTP協(xié)議上傳相對來說更適合web編程,對于上傳小文件來說HTTP協(xié)議的速度要比用FTP協(xié)議上傳文件略快,安全性也比較好,不像FTP那樣,必須要啟動一個FTP服務(wù)才行。而對于上傳文件大文件來說http似乎便顯得有點(diǎn)無能為力,用FTP協(xié)議的速度顯然比HTTP協(xié)議要快。文件越大,F(xiàn)TP協(xié)議上傳的速度就比HTTP上傳快的倍數(shù)越大。
1 基于Java Web應(yīng)用的軟件體系結(jié)構(gòu)
基于web應(yīng)用的B/S(Browser/Server)結(jié)構(gòu)就是三層C/S (Client/Server)結(jié)構(gòu)的 Internet上的軟件體系結(jié)構(gòu)。在現(xiàn)有的3層軟件體系結(jié)構(gòu)中,客戶層和數(shù)據(jù)層己被嚴(yán)格定義。與此相反,中間層并未明確定義,而且,中間層可以包括有與應(yīng)用程序的界面和長久的數(shù)據(jù)存儲無關(guān)的處理。我們所討論的新的基于Web的3層體系結(jié)構(gòu)集中在客戶層和中間層。假定將中間層劃分成許多服務(wù)程序是符合邏輯的,一個基于Web的應(yīng)用程序又可將中間層劃分成許多服務(wù)程序,這樣將每一主要服務(wù)都視為獨(dú)立的層,使得3層體系結(jié)構(gòu)可變成N層體系結(jié)構(gòu)。一個基于Web的應(yīng)用程序一般包含如下幾層:
1層,由Web瀏覽器實(shí)現(xiàn)的一個客戶層的界面。
2層,由Web服務(wù)器實(shí)現(xiàn)的一個中間層的任務(wù)分配機(jī)制.
3層,由一些服務(wù)器端腳本(Script)實(shí)現(xiàn)的中間層服務(wù)。
4層,由關(guān)系數(shù)據(jù)庫實(shí)現(xiàn)的數(shù)據(jù)層存儲機(jī)制。
SSH2框架的詳細(xì)設(shè)計(jì):
SSH2開發(fā)框架是遵從MVC設(shè)計(jì)模式的,將前臺交互界面交給“視圖層”處理,“控制層”實(shí)現(xiàn)分發(fā)邏輯請求,“模型層”負(fù)責(zé)業(yè)務(wù)邏輯的實(shí)現(xiàn),并且在“模型層”與數(shù)據(jù)庫之間實(shí)現(xiàn)了一個“數(shù)據(jù)交互層”,不再讓每個模型層模塊與數(shù)據(jù)庫進(jìn)行交互。
視圖層由Struts2負(fù)責(zé),使用JSP、HTML和JavaScript語言進(jìn)行交互。Struts2處理所有用戶的請求,然后把請求轉(zhuǎn)發(fā)給Action代理并根據(jù)處理后的結(jié)果找到相應(yīng)的視圖資源,再把響應(yīng)發(fā)送到客戶端瀏覽器。
控制層使用Spring作為主控制器,負(fù)責(zé)把請求發(fā)送到不同的業(yè)務(wù)邏輯模塊,并根據(jù)邏輯需要返回相應(yīng)的視圖層頁面。使用XML配置文件,建立前臺請求與控制層之間的映射。
模型層主要由Hibernate負(fù)責(zé)。它主要負(fù)責(zé)協(xié)調(diào)軟件與數(shù)據(jù)的交互,提供管理持久化數(shù)據(jù)的完整方案,讓開發(fā)者能夠?qū)W⒂跇I(yè)務(wù)邏輯的開發(fā)。
通過配置文件來管理,避免了更換數(shù)據(jù)庫連接信息時對類文件的修改。數(shù)據(jù)交互層根據(jù)顯示層提交的對象,首先對提交的數(shù)據(jù)進(jìn)行封裝,通過Spring配置來查找相應(yīng)的數(shù)據(jù)庫表對應(yīng)的Hibernate。綜上所述,Hibernate和Spring控制器的結(jié)合可以更加靈活的對數(shù)據(jù)集的操作進(jìn)行自定義和封裝,而且數(shù)據(jù)庫的連接信息通過相關(guān)的配。
2 FTP大文件上傳的設(shè)計(jì)與實(shí)現(xiàn)
2.1 JAVA FTP客戶端庫的選擇
目前,已經(jīng)有很多公開免費(fèi)的FTP客戶端類庫,如simpleftp、J-ftp, ftpclient等 。在本文中,采用是sun.net.ftp.FtpClient.。這個是個開源的且功能十分強(qiáng)大的客戶端FTP類庫。該類庫主要提供了用于建立FTP連接的類。利用這些類的方法,編程人員可以遠(yuǎn)程登錄到FTP服務(wù)器,列舉該服務(wù)器上的目錄,設(shè)置傳輸協(xié)議,以及上傳下載文件等。sun.net.ftp.FtpClient.類涵蓋了幾乎所有FTP的功能,F(xiàn)tpClient的實(shí)例變量保存了有關(guān)建立"代理"的各種信息。
2.2 登錄FTP服務(wù)器
在開發(fā)一個Java Web應(yīng)用過程中,選定了客戶端類庫之后,需要開發(fā)一個服務(wù)使用FTP功能連接到FTP服務(wù)器。InetSocketAddress是SocketAddress的實(shí)現(xiàn)子類。此類實(shí)現(xiàn) IP 套接字地址(IP 地址 + 端口號),不依賴任何協(xié)議。在使用Socket來連接服務(wù)器時最簡單的方式就是直接使用IP和端口,但Socket類中的connect方法并未提供這種方式,而是使用SocketAddress類來向connect方法傳遞服務(wù)器的IP和端口。SocketAddress只是個抽象類,它除了有一個默認(rèn)的構(gòu)造方法外,其它的方法都是abstract的,因此,我們必須使用SocketAddress的子類來建立SocketAddress對象,也就是唯一的子類InetSocketAddress。
2.3 上傳文件到FTP服務(wù)器
在上傳文件過程中,首先需要到服務(wù)器的相關(guān)目錄查看是否存相應(yīng)目錄,如果不存在則創(chuàng)建新目錄,然后借助TelnetInputStream把該文件傳送到本地。isDirExist(String filePath)函數(shù)是判斷服務(wù)器是否存在相應(yīng)目錄,createDir(String filePath)函數(shù)是創(chuàng)建新目錄,然后通過changeDirectory(String filePath)函數(shù)把遠(yuǎn)程系統(tǒng)上的目錄切換到參數(shù)filePath所指定的目錄。將遠(yuǎn)程文件加入輸出流中,獲取本地文件的輸入流,然后接下來就是簡單的IO處理。值得注意的是最后應(yīng)該堅(jiān)持“誰打開的誰負(fù)責(zé)關(guān)閉”的原則,需要將輸入輸出流關(guān)閉,JAVA不比其它語言JVM啟動就注定了它最大占用的內(nèi)存大小,多個這種不能釋放的流最終只能導(dǎo)致整個程序崩潰,如果是一個需要長期使用或者用戶流訪問量特別大的程序就這么一個流,那就是一個災(zāi)難。
到這里為止,完成了向FTP服務(wù)器上傳文件的功能。sun.net.ftp.FtpClient 可以幫助我們進(jìn)行一些簡單的ftp客戶端功能:下載、上傳文件。 但如遇到創(chuàng)建目錄之類的就無能為力了,這種情況我們只能利用第三方源碼。
3 結(jié)束語
本文通過對信息系統(tǒng)中FTP大文件上傳的研究,基于體系結(jié)構(gòu)的軟件開發(fā)思想,引入當(dāng)前比較流行的SSH2框架,使得開發(fā)出來的Web程序?qū)哟胃鼮榍逦吡己玫挠脩趔w驗(yàn)和貼近用戶需求。
參考文獻(xiàn):
[1] 張友生. 軟件體系結(jié)構(gòu)[M]. 北京: 清華大學(xué)出版社, 2006.
[2] 李剛. 輕量級Java EE企業(yè)應(yīng)用實(shí)戰(zhàn): Struts 2+Spring 3+Hibernate整合開發(fā)[M]. 3版.北京: 電子工業(yè)出版社, 2012.