金小初 楊 剛
(1.湖北省女子職業(yè)學(xué)校 武漢 430079; 2.武漢理工大學(xué)信息工程學(xué)院 武漢 430070)
高速公路智能化養(yǎng)護(hù)專家系統(tǒng)可實(shí)現(xiàn)數(shù)據(jù)自動轉(zhuǎn)換、能根據(jù)自動檢測結(jié)果和養(yǎng)護(hù)歷史資料分析路面變化規(guī)律,預(yù)測養(yǎng)護(hù)實(shí)施的時(shí)間,分別提出不同病害的養(yǎng)護(hù)對策、養(yǎng)護(hù)方法和施工工藝,同時(shí)根據(jù)自動檢測數(shù)據(jù)確定路面養(yǎng)護(hù)工程數(shù)量,輸入各種材料和設(shè)備定額后確定養(yǎng)護(hù)工程造價(jià),制定路面養(yǎng)護(hù)計(jì)劃。系統(tǒng)功能見圖1。
智能化養(yǎng)護(hù)專家系統(tǒng)中的網(wǎng)絡(luò)業(yè)務(wù)對速度的要求比較高,因此對用戶與數(shù)據(jù)庫的交互也提出了較高要求,故不能像以前一樣把所有數(shù)據(jù)和文件都存入數(shù)據(jù)庫,這樣會大大降低系統(tǒng)的讀取速率。一個解決辦法就是把大數(shù)據(jù)做成文件上傳。網(wǎng)絡(luò)最大的好處之一就是實(shí)現(xiàn)了資源的共享,文件的下載也成為重要的需求。高速公路智能化養(yǎng)護(hù)專家系統(tǒng)功能圖見圖1。
圖1 高速公路智能化養(yǎng)護(hù)專家系統(tǒng)功能圖
目前網(wǎng)絡(luò)應(yīng)用有很多開源的上傳下載功能代碼,基于SSH(Str uts+Spring+Hibernate)框架的上傳下載比這些代碼結(jié)構(gòu)性更強(qiáng),開發(fā)更快。
Str uts作為表現(xiàn)層和控制層主要框架,提供MVC控制、表現(xiàn)層Taglib布局管理,以及Validator輸入校驗(yàn)。Taglib是Str uts的標(biāo)記庫,有效提高了開發(fā)效率。同時(shí),Str uts框架具有組件的模塊化,其controller作為控制層只需要通過一個配置文件,就可以明晰整個系統(tǒng)各部分之間的聯(lián)系,簡化了系統(tǒng)的開發(fā)和維護(hù)[1]。
Spring中的Io C容器作為系統(tǒng)控制層的一部分提供面向接口編程的JavaBean的管理,通過消除各種自定義格式的屬性文件來簡化對JavaBean的管理,從而實(shí)現(xiàn)業(yè)務(wù)邏輯的方便更換,而無需使用EJB。并且,Spring能解決系統(tǒng)中常見的對Singleton的過多使用而導(dǎo)致降低系統(tǒng)的可測試性和面向?qū)ο蟮某潭葐栴}。數(shù)據(jù)訪問層主要采用DAO(data access object)模式,將底層數(shù)據(jù)訪問操作與高層的業(yè)務(wù)邏輯分離開來。通過DAO,向業(yè)務(wù)邏輯組件隱藏了數(shù)據(jù)庫訪問的實(shí)現(xiàn)細(xì)節(jié)。
Hiber nate作為數(shù)據(jù)訪問層的底層持久框架,提供O/R Mapping,實(shí)現(xiàn)面向?qū)ο蟮挠蚰P陀成涞絺鹘y(tǒng)的關(guān)系數(shù)據(jù)庫。它不僅負(fù)責(zé)實(shí)現(xiàn)映射,提供數(shù)據(jù)查詢和檢索能力,而且還可以自動生成SQL,從而能使應(yīng)用程序移植到所有的SQL數(shù)據(jù)庫。通過4個層次的劃分,使每個層次的邏輯集中,便于專注開發(fā)。而相鄰層次之間松散耦合,便于組件的重用和系統(tǒng)功能擴(kuò)展[2]。
Str uts+Spring+Hiber nate的整合架構(gòu)設(shè)計(jì)采用分層的思想,并為各層次的支持提供一個整合框架的策略,以隔離各層次間的依賴性,便于系統(tǒng)擴(kuò)充。
Str uts已經(jīng)成為業(yè)界標(biāo)準(zhǔn),其HT ML標(biāo)簽非常優(yōu)秀的、惟一的公共控制器便于管理,但相對于處理界面的強(qiáng)大功能而言,Str uts處理業(yè)務(wù)邏輯方面要遜色得多,這些不足之處可由Spring得到解決。
Spring能有效地組織中間層對象,易于同其他View框架無縫集成,允許根據(jù)需要在某一層選擇使用它的某一個模塊,對不同的數(shù)據(jù)訪問技術(shù)提供了統(tǒng)一的接口,并且采用Io C可以很容易地實(shí)現(xiàn)bean的裝配,提供了簡潔的AOP并據(jù)此實(shí)現(xiàn)事務(wù)管理,便于測試,但其Jsp中要寫很多代碼、控制器過于靈活,缺少一個公用控制器,這又可以由Str uts來彌補(bǔ)。
用Hiber nate實(shí)現(xiàn)數(shù)據(jù)的持久化能解決因底層的數(shù)據(jù)結(jié)構(gòu)發(fā)生改變而導(dǎo)致應(yīng)用發(fā)生改變這樣的問題,同時(shí)又可以和多種Web服務(wù)器或應(yīng)用服務(wù)器良好集成,如今已經(jīng)支持幾乎所有的流行的數(shù)據(jù)庫服務(wù)器。并且由于Hiber nate使用了J2EE架構(gòu)中JDBC,JTA,JNDI等技術(shù),使得 Hiber nate可以方便地集成到J2EE應(yīng)用服務(wù)器中去,為Java應(yīng)用提供了一個易用的、高效率的輕量級對象關(guān)系映射框架[3]。
由此可見,Struts,Spring和Hibernate的集成能夠揚(yáng)長避短,使框架更加易用、高效,是非常有價(jià)值的。
圖2是文件上傳界面,輸入必要信息,點(diǎn)擊提交即可上傳。
圖2 上傳界面
圖3 是點(diǎn)下載后彈出的現(xiàn)在對話框。
圖3 下載對話框
2.2.1 文件上傳代碼
文件上傳時(shí),頁面數(shù)據(jù)通過Upload For m接收,然后傳遞到文件上傳程序中。其中Upload-For m對象中有文件、文件編號、上傳地址、文件個數(shù)4個屬性。此處文件上傳分2步,先把文件相關(guān)信息寫入數(shù)據(jù)庫,然后把文本文件傳到指定地址。
//獲得表單對象
Upload For m upload For m = (Upload For m)f or m;
//獲得上傳文件個數(shù)Vint length=Integer.parseInt(upload For m.get Length());
//多文件上傳
f or(int i=0;i<length;i++)
{
//獲得第i個文件對象
For mFile myfile= upload For m.get Myfile(i);
//獲得文件編號
String filenu m=upload For m.get Filenu m(i);
//獲得文件備注
String fileremar k=upload For m.get Fileremar k(i);
//獲得文件名稱
String filename=myfile.get File Name();
//獲得存儲地址,文件將被存儲到服務(wù)器下的file文件夾中
String real Path=request.get Session().get Servlet-Context().get Real Path("/files/");
String fileaddress=real Path+"/"+filename;
//數(shù)據(jù)入庫,此處數(shù)據(jù)入庫用到了Hiber nate持久化數(shù)據(jù)庫對象
Wj wj=new Wj();
wj.set Wjb m(filenu m);
wj.set Wj mc(filename);
wj.set Ccdz(fileaddress);
wj.set Wjbz(fileremar k);
wj DAO.save(wj);
//文件上傳
try{
Output Stream streamOut=new File Output Stream(fileaddress);
int bytes Read=0;
byte[]buffer=new byte[8192];
//利用緩存,邊讀邊寫 while((bytes Read=streamIn.read(buffer,0,8192))?。剑?){
streamOut.write(buffer,0,bytes Read);}
streamOut.close();
streamIn.close();
myfile.destroy();}
catch(Exception ex){ex.print Stack Trace();}
中小企業(yè)成長的關(guān)鍵不是經(jīng)濟(jì)環(huán)境,也不是市場條件,而是企業(yè)自身的管理工作。中小企業(yè)無力聘請專業(yè)齊全的管理人員,要求經(jīng)營者當(dāng)“多面手”,而事實(shí)上多數(shù)經(jīng)營者缺乏全面管理的能力,難免顧此失彼。建立健全的財(cái)務(wù)機(jī)構(gòu),并讓各機(jī)構(gòu)之間的權(quán)力形成相互制約、相互監(jiān)督的關(guān)系,填補(bǔ)崗位空缺,制定完善的財(cái)務(wù)管理制度,將責(zé)任落實(shí)到每一位財(cái)務(wù)人員的身上,鼓勵財(cái)務(wù)管理人員精通財(cái)務(wù)知識,大力提高財(cái)務(wù)人員的整體素質(zhì)、執(zhí)行能力和管理能力,建立嚴(yán)格的獎懲制度,讓企業(yè)財(cái)務(wù)管控達(dá)到最優(yōu),根據(jù)企業(yè)財(cái)務(wù)狀況制定更加完善的企業(yè)計(jì)劃,為企業(yè)發(fā)展做出應(yīng)有的貢獻(xiàn)。
}
}
2.2.2 文件下載代碼
文件下載程序也分兩部分,第一部分實(shí)現(xiàn)點(diǎn)擊下載按鈕后彈出下載對話框,第二部分實(shí)現(xiàn)文件的讀寫。
//從頁面獲取下載文件的編號
String filenu m=request.get Para meter("filenu m");
//獲得編號對應(yīng)的文件對象
Wj wj=new Wj();
wj=wj DAO.find ById(filenum);
//獲得文件存儲地址
String path= wj.get Ccdz();
File download File=new File(path);
//獲得文件名稱
String f name=wj.get Wj mc();
try{
BufferedInput Stream bis=null;
Buffered Output Stream bos=null;
Output Stream fos=null;
Input Stream fis=null;
fis=new FileInput Stream(download File);
bis=new BufferedInput Stream(fis);
f os=response.get Output Stream();
bos=new Buffered Output Stream(f os);
int fileLength=fis.available();
//下面就是彈出下載對話框的關(guān)鍵代碼
response.reset();
response.set Content Lengt h(fileLength);
response.set Content Type("application/x-msdownload;charset=GBK");
response.set Character Encoding("UTF-8");
f name=j(luò)ava.net.URLEncoder.encode(f name,"UTF-8");response.set Header("Content-Disposition","attach ment;filename="+new String(f name.get Bytes("UTF-8"),"GBK"));
//用輸入流進(jìn)行先讀,然后用輸出流去寫
int bytes Read=0;
byte[]buffer= new byte[8192];
while((bytes Read= bis.read(buffer,0,8192))?。?-1){
bos.write(buffer,0,bytes Read);}
bos.flush();
fis.close();
bis.close();
fos.close();
bos.close();}
catch(Exception ex){ex.print Stack Trace();}
Str uts+Spring+Hiber na框架的文件上傳時(shí),Str uts配置文件中會有如下代碼控制上傳文件的大小,這里設(shè)置上傳文件最大為500 M,如果不想規(guī)定最大文件,可將max FileSize設(shè)為-1。如果文件大小超過規(guī)定會報(bào)錯。
<contr oller max FileSize="500 M"input-For war d="tr ue"/>
上傳和下載文件都運(yùn)用了緩存,這是為了防止內(nèi)存溢出而發(fā)生錯誤。
本文對文件上傳和下載的應(yīng)用進(jìn)行了研究并得以實(shí)現(xiàn)。實(shí)際應(yīng)用時(shí)在文件上傳中還可加入進(jìn)度條,使得文件上傳更加人性化。此技術(shù)成功應(yīng)用于湖北省高速公路實(shí)業(yè)開發(fā)有限公司共同研制的高速公路智能化養(yǎng)護(hù)專家系統(tǒng),取得預(yù)期效果。
[1] 梁立新.項(xiàng)目實(shí)踐精解:基于 Str uts-Spring-Hibernate的Java應(yīng)用開發(fā)[M].北京:電子工業(yè)出版社,2006.
[2] 鄔繼成.Str uts與 Hiber nate實(shí)用教程-構(gòu)建基于MVC模式的高效Java Web應(yīng)用[M].北京:電子工業(yè)出版社,2006.
[3] 梅登華,閔華清.基于STRUTS框架的SRM系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)工程,2006(17):262-264.