金小初 楊 剛
(1.湖北省女子職業學校 武漢 430079; 2.武漢理工大學信息工程學院 武漢 430070)
高速公路智能化養護專家系統可實現數據自動轉換、能根據自動檢測結果和養護歷史資料分析路面變化規律,預測養護實施的時間,分別提出不同病害的養護對策、養護方法和施工工藝,同時根據自動檢測數據確定路面養護工程數量,輸入各種材料和設備定額后確定養護工程造價,制定路面養護計劃。系統功能見圖1。
智能化養護專家系統中的網絡業務對速度的要求比較高,因此對用戶與數據庫的交互也提出了較高要求,故不能像以前一樣把所有數據和文件都存入數據庫,這樣會大大降低系統的讀取速率。一個解決辦法就是把大數據做成文件上傳。網絡最大的好處之一就是實現了資源的共享,文件的下載也成為重要的需求。高速公路智能化養護專家系統功能圖見圖1。

圖1 高速公路智能化養護專家系統功能圖
目前網絡應用有很多開源的上傳下載功能代碼,基于SSH(Str uts+Spring+Hibernate)框架的上傳下載比這些代碼結構性更強,開發更快。
Str uts作為表現層和控制層主要框架,提供MVC控制、表現層Taglib布局管理,以及Validator輸入校驗。Taglib是Str uts的標記庫,有效提高了開發效率。同時,Str uts框架具有組件的模塊化,其controller作為控制層只需要通過一個配置文件,就可以明晰整個系統各部分之間的聯系,簡化了系統的開發和維護[1]。
Spring中的Io C容器作為系統控制層的一部分提供面向接口編程的JavaBean的管理,通過消除各種自定義格式的屬性文件來簡化對JavaBean的管理,從而實現業務邏輯的方便更換,而無需使用EJB。并且,Spring能解決系統中常見的對Singleton的過多使用而導致降低系統的可測試性和面向對象的程度問題。數據訪問層主要采用DAO(data access object)模式,將底層數據訪問操作與高層的業務邏輯分離開來。通過DAO,向業務邏輯組件隱藏了數據庫訪問的實現細節。
Hiber nate作為數據訪問層的底層持久框架,提供O/R Mapping,實現面向對象的域模型映射到傳統的關系數據庫。它不僅負責實現映射,提供數據查詢和檢索能力,而且還可以自動生成SQL,從而能使應用程序移植到所有的SQL數據庫。通過4個層次的劃分,使每個層次的邏輯集中,便于專注開發。而相鄰層次之間松散耦合,便于組件的重用和系統功能擴展[2]。
Str uts+Spring+Hiber nate的整合架構設計采用分層的思想,并為各層次的支持提供一個整合框架的策略,以隔離各層次間的依賴性,便于系統擴充。
Str uts已經成為業界標準,其HT ML標簽非常優秀的、惟一的公共控制器便于管理,但相對于處理界面的強大功能而言,Str uts處理業務邏輯方面要遜色得多,這些不足之處可由Spring得到解決。
Spring能有效地組織中間層對象,易于同其他View框架無縫集成,允許根據需要在某一層選擇使用它的某一個模塊,對不同的數據訪問技術提供了統一的接口,并且采用Io C可以很容易地實現bean的裝配,提供了簡潔的AOP并據此實現事務管理,便于測試,但其Jsp中要寫很多代碼、控制器過于靈活,缺少一個公用控制器,這又可以由Str uts來彌補。
用Hiber nate實現數據的持久化能解決因底層的數據結構發生改變而導致應用發生改變這樣的問題,同時又可以和多種Web服務器或應用服務器良好集成,如今已經支持幾乎所有的流行的數據庫服務器。并且由于Hiber nate使用了J2EE架構中JDBC,JTA,JNDI等技術,使得 Hiber nate可以方便地集成到J2EE應用服務器中去,為Java應用提供了一個易用的、高效率的輕量級對象關系映射框架[3]。
由此可見,Struts,Spring和Hibernate的集成能夠揚長避短,使框架更加易用、高效,是非常有價值的。
圖2是文件上傳界面,輸入必要信息,點擊提交即可上傳。

圖2 上傳界面
圖3 是點下載后彈出的現在對話框。

圖3 下載對話框
2.2.1 文件上傳代碼
文件上傳時,頁面數據通過Upload For m接收,然后傳遞到文件上傳程序中。其中Upload-For m對象中有文件、文件編號、上傳地址、文件個數4個屬性。此處文件上傳分2步,先把文件相關信息寫入數據庫,然后把文本文件傳到指定地址。
//獲得表單對象
Upload For m upload For m = (Upload For m)f or m;
//獲得上傳文件個數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();
//獲得存儲地址,文件將被存儲到服務器下的file文件夾中
String real Path=request.get Session().get Servlet-Context().get Real Path("/files/");
String fileaddress=real Path+"/"+filename;
//數據入庫,此處數據入庫用到了Hiber nate持久化數據庫對象
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))!=-1){
streamOut.write(buffer,0,bytes Read);}
streamOut.close();
streamIn.close();
myfile.destroy();}
catch(Exception ex){ex.print Stack Trace();}
中小企業成長的關鍵不是經濟環境,也不是市場條件,而是企業自身的管理工作。中小企業無力聘請專業齊全的管理人員,要求經營者當“多面手”,而事實上多數經營者缺乏全面管理的能力,難免顧此失彼。建立健全的財務機構,并讓各機構之間的權力形成相互制約、相互監督的關系,填補崗位空缺,制定完善的財務管理制度,將責任落實到每一位財務人員的身上,鼓勵財務管理人員精通財務知識,大力提高財務人員的整體素質、執行能力和管理能力,建立嚴格的獎懲制度,讓企業財務管控達到最優,根據企業財務狀況制定更加完善的企業計劃,為企業發展做出應有的貢獻。
}
}
2.2.2 文件下載代碼
文件下載程序也分兩部分,第一部分實現點擊下載按鈕后彈出下載對話框,第二部分實現文件的讀寫。
//從頁面獲取下載文件的編號
String filenu m=request.get Para meter("filenu m");
//獲得編號對應的文件對象
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();
//下面就是彈出下載對話框的關鍵代碼
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=java.net.URLEncoder.encode(f name,"UTF-8");response.set Header("Content-Disposition","attach ment;filename="+new String(f name.get Bytes("UTF-8"),"GBK"));
//用輸入流進行先讀,然后用輸出流去寫
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框架的文件上傳時,Str uts配置文件中會有如下代碼控制上傳文件的大小,這里設置上傳文件最大為500 M,如果不想規定最大文件,可將max FileSize設為-1。如果文件大小超過規定會報錯。
<contr oller max FileSize="500 M"input-For war d="tr ue"/>
上傳和下載文件都運用了緩存,這是為了防止內存溢出而發生錯誤。
本文對文件上傳和下載的應用進行了研究并得以實現。實際應用時在文件上傳中還可加入進度條,使得文件上傳更加人性化。此技術成功應用于湖北省高速公路實業開發有限公司共同研制的高速公路智能化養護專家系統,取得預期效果。
[1] 梁立新.項目實踐精解:基于 Str uts-Spring-Hibernate的Java應用開發[M].北京:電子工業出版社,2006.
[2] 鄔繼成.Str uts與 Hiber nate實用教程-構建基于MVC模式的高效Java Web應用[M].北京:電子工業出版社,2006.
[3] 梅登華,閔華清.基于STRUTS框架的SRM系統設計[J].計算機工程,2006(17):262-264.