引??言?
??? 傳統(tǒng)的企業(yè)級(jí)應(yīng)用面臨著很多的局限:以局域網(wǎng)為中心,伸縮性差;業(yè)務(wù)與數(shù)據(jù)在客戶端,不僅加重了客戶端系統(tǒng)要求,而且難于管理大量的客戶機(jī);難于管理系統(tǒng)中大量的應(yīng)用軟件等。鑒于J2EE是企業(yè)級(jí)應(yīng)用上的理想平臺(tái),和J2EE與Java Web Start在瘦客戶端技術(shù)上的強(qiáng)大優(yōu)勢(shì),為此提出了基于J2EE與Java Web Start的企業(yè)級(jí)應(yīng)用方案。?
基于J2EE與Java Web Start的企業(yè)級(jí)應(yīng)用方案?
??? 1.體系結(jié)構(gòu)?


??? 2.該方案在企業(yè)級(jí)應(yīng)用的特點(diǎn)?
??? (1)? 由于采用多層結(jié)構(gòu)和Java Web Start這兩種瘦客戶端技術(shù),不僅解決了在企業(yè)級(jí)的局域網(wǎng)中部署軟件的問(wèn)題,同時(shí)減少了客戶端系統(tǒng)及硬件需求,還降低了系統(tǒng)軟件成本。?
??? (2)? 主要業(yè)務(wù)和數(shù)據(jù)處理均在服務(wù)器端進(jìn)行,這樣對(duì)網(wǎng)絡(luò)要求不高,且穩(wěn)定性好。?
??? (3)? 來(lái)自Java技術(shù)的特點(diǎn),該系統(tǒng)具有高度的通用性和跨平臺(tái)的特性。?
??? (4)? 整個(gè)系統(tǒng)的安全性高,功能強(qiáng)大,效率高。因?yàn)橛肑ava Web Start部署軟件,該軟件至少有本系統(tǒng)部署單位的軟件簽名,方可部署;Java Web Start不僅是瘦客戶端技術(shù),而且是富客戶端技術(shù)(客戶端的處理功能強(qiáng)大);并且能及時(shí)的更新或升級(jí)該軟件等。?
??? 3.由于Java Web Start只能用于Java應(yīng)用程序的Jar文件,對(duì)與其它類型的軟件不容易部署,特別是一些應(yīng)用軟件,而這些軟件是市場(chǎng)的主流。雖然能通過(guò)編寫(xiě)相關(guān)一些Java 類,并用Jar來(lái)對(duì)這些軟件和這些類進(jìn)行打包來(lái)實(shí)現(xiàn),但這樣做僅僅起到一個(gè)安裝發(fā)布的作用,?
??? 其它的都不易實(shí)現(xiàn)。這是該方案的主要缺陷。但是憑著人們對(duì)Java技術(shù)的信心,特別是一些大公司在Java技術(shù)上大量投入,不僅Java Web Start技術(shù)會(huì)有新發(fā)展(例如:對(duì)其它軟件的兼容性),而且會(huì)有大量用Java技術(shù)編寫(xiě)的應(yīng)用軟件出現(xiàn)。?
??? 4.現(xiàn)在企業(yè)及事業(yè)單位的信息化是大勢(shì)所趨,而且相當(dāng)多的企業(yè)及事業(yè)單位的信息化的工作做的很積極,有的不可避免與外部進(jìn)行大量文件的來(lái)往,其中內(nèi)部與外部網(wǎng)絡(luò)流量(所用的帶寬)的大小,內(nèi)部信息的安全性等是重點(diǎn)關(guān)心的問(wèn)題。鑒于J2EE與Java Web Start的企業(yè)級(jí)應(yīng)用方案的優(yōu)勢(shì),采用文件代理傳輸?shù)姆绞?,設(shè)計(jì)并實(shí)現(xiàn)文件代理傳輸?shù)南到y(tǒng),以期解決上述問(wèn)題。?
需求分析和系統(tǒng)設(shè)計(jì)?
??? 對(duì)于有大量文件傳輸?shù)钠髽I(yè)級(jí)系統(tǒng),其網(wǎng)絡(luò)流量(帶寬)大小,內(nèi)部信息的安全性等是企業(yè)級(jí)系統(tǒng)構(gòu)架是首要考慮的問(wèn)題。本文件代理傳輸系統(tǒng)就是基于這些問(wèn)題所設(shè)計(jì)的,本系統(tǒng)所實(shí)現(xiàn)的功能:1)基于HTTP的代理下載,基于FTP的上傳與下載.2)對(duì)每一個(gè)系統(tǒng)內(nèi)部成員或部門都有信息管理,包括用戶信息,代理信息等.3)有完整的日志信息,能及時(shí)地反饋準(zhǔn)確的系統(tǒng)安全信息.4)管理員在運(yùn)行管理端對(duì)各種文件代理傳輸?shù)男袨檫M(jìn)行確認(rèn),根據(jù)內(nèi)部的安全性的原則,進(jìn)而確定為其進(jìn)行文件代理傳輸,這樣就有效的把意外的文件傳輸帶來(lái)危害扼殺在最初階段,5)實(shí)現(xiàn)對(duì)外部Internet的訪問(wèn)與內(nèi)部成員或部門高峰訪問(wèn)Internet是異步的,這樣不僅節(jié)約帶寬,而且最大限度利用了帶寬.系統(tǒng)圖如下:

??? 系統(tǒng)的功能與流程的設(shè)計(jì)與實(shí)現(xiàn):用戶通過(guò)發(fā)送有關(guān)登陸信息和代理信息(給一個(gè)URL請(qǐng)求下載資料,或給用戶名和密碼,及ftp地址其請(qǐng)求代理下載與上傳)的表單,經(jīng)過(guò)web層和業(yè)務(wù)層處理后,把正確的信息存入信息DB(數(shù)據(jù)庫(kù))中,再運(yùn)行管理端確認(rèn),并選擇內(nèi)部網(wǎng)對(duì)Internet訪問(wèn)流量較少的時(shí)候,啟動(dòng)代理組件取得代理信息,建立與外部Internet的連接,并對(duì)文件服務(wù)器進(jìn)行訪問(wèn)(代理上傳,把相關(guān)目錄下文件上傳,代理下載,則把下載的文件存入相關(guān)的目錄下).用戶則是通過(guò)ftp工具與ftp服務(wù)器進(jìn)行文件傳輸(代理傳輸?shù)奈募嬖谖募?wù)器上).?
??? 該系統(tǒng)是按J2EE和Java Web Start的企業(yè)級(jí)應(yīng)用方案來(lái)設(shè)計(jì)的,其中客戶端的用Java寫(xiě)FTP工具和運(yùn)行管理端的對(duì)代理信息進(jìn)行確認(rèn)和激活遠(yuǎn)程代理傳輸?shù)腏ava應(yīng)用程序都部署在服務(wù)器端,客戶端和運(yùn)行管理端通過(guò)Java Web Start所擁有的JNLP協(xié)議從服務(wù)器端下載(當(dāng)然還可以用其他的FTP工具,但這違反瘦客戶端的原則);采用J2EE的多層體系結(jié)構(gòu)的設(shè)計(jì)方案來(lái)設(shè)計(jì)與客戶端進(jìn)行交互的服務(wù)器端程序;這樣不僅完全實(shí)現(xiàn)了瘦客戶端,而且整個(gè)系統(tǒng)具有可維護(hù)性和伸縮性,甚至完全可以把該系統(tǒng)嵌入到一個(gè)J2EE的系統(tǒng)中,成為其中的一個(gè)服務(wù)器端構(gòu)件.?
相關(guān)技術(shù)及其特點(diǎn)?
??? 1.Java Web Start技術(shù)在服務(wù)器端的使用.?
??? Java Web Start是一種面向Web的應(yīng)用程序部署解決方案,使用該技術(shù)的優(yōu)點(diǎn):1)高度交互的用戶界面.2)較低的帶寬需求,因?yàn)樗彺嬉呀?jīng)下載的信息.3)支持脫機(jī)工作.4)在編寫(xiě)基于Java Web Start的程序是還可使用或擴(kuò)展JNLP API,以增強(qiáng)程序的功能.5)在企業(yè)級(jí)應(yīng)用中可減少軟件的使用和升級(jí)成本等.Java Web Start的通信協(xié)議:JNLP(Java網(wǎng)絡(luò)加載協(xié)議),當(dāng)服務(wù)器接受客戶端的application/x-java-jnlp的MINE格式的請(qǐng)求,?會(huì)使用之前所定義的相關(guān)文件類型(jnlp)的應(yīng)用程序執(zhí)行,JNLP描述的文件內(nèi)容為統(tǒng)一標(biāo)準(zhǔn)的XML文件,本系統(tǒng)所用到一個(gè)JNLP文件(ftp.jnlp)的相關(guān)代碼如下:?
?
??? 2.EJB的設(shè)計(jì)與實(shí)現(xiàn)?
??? EJB可用來(lái)封裝應(yīng)用程序的業(yè)務(wù)邏輯,是J2EE平臺(tái)下的企業(yè)級(jí)應(yīng)用的重要部分。通常一個(gè)EJB是由Home接口、remote接口和Bean類,以及輔助類組成。Remote接口定義EJB組件中提供的可供用戶調(diào)用的方法,及實(shí)現(xiàn)商業(yè)邏輯的函數(shù)或過(guò)程;Home接口定義Bean生命周期的有關(guān)方法; EJBObject為網(wǎng)絡(luò)可視對(duì)象,包含Stub和Skeleton作為Bean的代理。這樣的結(jié)構(gòu)使得訪問(wèn)遠(yuǎn)程對(duì)象就像訪問(wèn)本地對(duì)象一樣,保證企業(yè)級(jí)應(yīng)用。在本系統(tǒng)中,出于在業(yè)務(wù)處理中的數(shù)據(jù)訪問(wèn)的需要,同時(shí)考慮到數(shù)據(jù)的持久性,分別設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)會(huì)話Bean和一個(gè)實(shí)體Bean.?
??? (1)由于EJB中的遠(yuǎn)程訪問(wèn)的方法要求方法的參數(shù)和返回結(jié)果是可串行化的類,及實(shí)現(xiàn)應(yīng)用程序的某些功能的方法的需要.設(shè)計(jì)兩個(gè)可串行化類(即實(shí)現(xiàn)Serializable接口):PersonInfo類包含對(duì)應(yīng)于PersonList表中部分字段信息和AgentList表中overORnot字段信息的數(shù)據(jù)成員;AgentInfo類的數(shù)據(jù)成員與數(shù)據(jù)庫(kù)中的AgentList表的表頭字段之間建立映射關(guān)系,并包含配對(duì)的getter和setter方法等。?
??? (2)對(duì)于類中每個(gè)數(shù)據(jù)成員用getter和setter來(lái)訪問(wèn),其訪問(wèn)開(kāi)銷和復(fù)雜過(guò)程等就應(yīng)該考慮,為此采用數(shù)值對(duì)象把所有的數(shù)據(jù)封裝起來(lái),然后一次發(fā)送所有數(shù)據(jù),最后通過(guò)數(shù)值對(duì)象把數(shù)據(jù)一次性存回?cái)?shù)據(jù)庫(kù).下面就是本系統(tǒng)采用這種方法的具體實(shí)現(xiàn)過(guò)程:?
??? 對(duì)于無(wú)狀態(tài)會(huì)話Bean:創(chuàng)建一個(gè)數(shù)據(jù)存放類InfoList,使用一個(gè)Vector類型的數(shù)據(jù)成員和一個(gè)setInfo方法,再創(chuàng)建數(shù)據(jù)訪問(wèn)類Info來(lái)封裝對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),并把數(shù)據(jù)填充到InfoList中.關(guān)鍵代碼:public class Info{… ?
Vector ns=new Vector();InfoList inL=new InfoList();rs=sts.excuteQuery(sql);?
while(rs.next()){?? PersonInfo p=new PersonInfo();?
p.setName(rs.getString("name"));… ins.add(p);} inL.setInfo(ins);…}?
??? 對(duì)于實(shí)體的Bean:采用與上面相同的方法創(chuàng)建于實(shí)現(xiàn)數(shù)據(jù)存放類AgentList,數(shù)據(jù)訪問(wèn)類Agent.?
??? (3)無(wú)狀態(tài)會(huì)話Bean-處理用戶對(duì)用戶信息的訪問(wèn)?
??? 通過(guò)遠(yuǎn)程接口說(shuō)明該EJB的功能: import javax.ejb.EJBObject; import java.rmi.RemoteException;?
public interface PersonMessage extends EJBObject{?
public PersonInfo getMessage(String name, String code);? // 返回用戶信息?
??? public boolean addHttpMessage(String name, String code, String url);?
// 增加http代理下載信息?
??? public boolean addFtpMessage(String name, String code, String ftpUrl, String Ftpname, String code, boolean? ul); // 增加ftp上傳、或下載信息?
?? ? …… }?
?? (4)實(shí)體Bean-實(shí)現(xiàn)對(duì)代理信息的管理?
??? 通過(guò)遠(yuǎn)程接口說(shuō)明該EJB的功能: import javax.ejb.EJBObject; import java.rmi.RemoteException;?
public interface AgentMessage extends EJBObject{?
?public int getAgentLength();??????????????? //獲取代理信息的數(shù)目?
?public AgentInfo getAgentMessage(int Index);? // 取得第index+1條代理信息?
?public void setOver(boolean bl)? // 反饋代理(bl=true,成功;bl=false ,失敗? ?
? ?? …… }?
3.采用可激活的RMI的實(shí)現(xiàn)對(duì)代理JavaBean的控制?
??? 考慮到運(yùn)行客戶端和文件代理JavaBean都是Java應(yīng)用,RMI在兩端的復(fù)雜程度和類加載的垃圾收集上優(yōu)于CORBA,故選擇RMI. Java RMI支持存儲(chǔ)在不同地址空間的程序級(jí)對(duì)象之間彼此進(jìn)行通信,實(shí)現(xiàn)遠(yuǎn)程對(duì)象之間的無(wú)縫調(diào)用。為了保證分布式系統(tǒng)的高效性,通常在服務(wù)器上的對(duì)象是激活的,可供客戶端隨時(shí)調(diào)用,但一直處于激活狀態(tài)要占用大量的系統(tǒng)資源,特別對(duì)于一些異步的對(duì)象,簡(jiǎn)直是浪費(fèi)系統(tǒng)資源。本系統(tǒng)中的代理JavaBean就是一個(gè)與普通用戶訪問(wèn)異步的程序級(jí)的對(duì)象,因此采用RMI遠(yuǎn)程方法調(diào)用激活系統(tǒng)守護(hù)進(jìn)程來(lái)解決這個(gè)問(wèn)題.它的機(jī)制是在程序運(yùn)行后就處于睡眠狀態(tài),等待隨時(shí)激活.這樣就解決了RMI的JavaBean生成的開(kāi)銷的問(wèn)題.它包含可激活的遠(yuǎn)程接口,接口實(shí)現(xiàn)類,注冊(cè)可激活遠(yuǎn)程隊(duì)對(duì)象.下面是使RMI遠(yuǎn)程接口的實(shí)現(xiàn)類:?
public class activatableRMIImpl extends Activatable implements activatableRMI?
{? ……?
} ?
4.相關(guān)的數(shù)據(jù)庫(kù)技術(shù)?
??? 由于本系統(tǒng)采用的是JDBC3.0的標(biāo)準(zhǔn),JDBC3.0新引入了DataSource 類和RowSet接口。使用DataSource對(duì)象,使得連接緩存更簡(jiǎn)單。因?yàn)樗虺绦螂[藏了管理連接池的代碼(不用自己寫(xiě)代碼實(shí)現(xiàn)連接池),是連接池管理自動(dòng)化。另外還支持簡(jiǎn)單事務(wù):事務(wù)提交與回滾。下面是相關(guān)的代碼:?
Context ctx = new InitialContext();? //從JNDI中獲取initialContext的句柄?
DataSource ds = (DataSource) ctx.lookup("");//引用數(shù)據(jù)源?
Connection conn = ds.getConnection();//建立數(shù)據(jù)對(duì)象連接?
try{ conn.setAutoCommit(false);….?? conn.commit();?? //確定提交?
}catch(SQLException e){try{??? conn.rollback();…??? //提交不成功,就回退RowSet是增加了JavaBean接口ResultSet擴(kuò)展,其中JDBCRowSet是RowSet的實(shí)現(xiàn)方式之一,JDBCRowSet最適合創(chuàng)建使用SWING/AWT和其它的JavaBean組件的應(yīng)用程序,它潛在地允許創(chuàng)建活動(dòng)的數(shù)據(jù)視圖,還可及時(shí)地更新視圖。本系統(tǒng)中在運(yùn)行管理端對(duì)代理信息確認(rèn),該應(yīng)用程序就采用通過(guò)JDBC直接訪問(wèn)數(shù)據(jù)源,用OracleJDBCRowset類來(lái)創(chuàng)建活動(dòng)的數(shù)據(jù)視圖。
結(jié)束語(yǔ)?
??? 基于J2EE與Java Web Start的企業(yè)級(jí)應(yīng)用方案是在企業(yè)級(jí)應(yīng)用中的一個(gè)相當(dāng)不錯(cuò)的選擇,不僅J2EE已成為眾多企業(yè)平臺(tái)架構(gòu)的標(biāo)準(zhǔn),而且Java Web Start在企業(yè)級(jí)部署軟件和客戶端的本地處理能力上有相當(dāng)大的優(yōu)勢(shì),另外采用該方案的系統(tǒng)成本不高.基于J2EE與Java Web Start的文件代理傳輸系統(tǒng)是對(duì)該方案的一個(gè)嘗試,本系統(tǒng)目前只是實(shí)現(xiàn)整個(gè)文件代理傳輸?shù)幕痉桨?,在整個(gè)系統(tǒng)功能方面,特別代理文件傳輸?shù)腏avaBean功能有待進(jìn)一步完善。最后由于本系統(tǒng)具有伸縮性、高效性、安全性等,對(duì)于采用Java平臺(tái),又有大量文件傳輸需求的企業(yè)級(jí)系統(tǒng),本系統(tǒng)具有不錯(cuò)的應(yīng)用價(jià)值。?
參考文獻(xiàn):?
1.David J. Gallardo著 董慶霞譯《Java Oracle數(shù)據(jù)庫(kù)開(kāi)發(fā)指南》清華大學(xué)出版社?
2.黃嘉輝編著 《Java網(wǎng)絡(luò)程序設(shè)計(jì)》 清華大學(xué)出版社?
3.尤晉元等《基于JNLP協(xié)議的軟件上下載服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)》《計(jì)算機(jī)應(yīng)用與軟件》P5 2003/7?
4.http://java.sun.com/?
