版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
資料管理系統(tǒng)開發(fā)文檔徐梁2015.4.19Version1.0TOC\o"1-3"\h\u14389資料管理系統(tǒng)開發(fā)文檔 114580一、需求分析與功能簡介 419957二、整體架構(gòu) 414696三、文件瀏覽功能實(shí)現(xiàn) 526398四、單個(gè)文件下載功能實(shí)現(xiàn) 832634五、文件夾下載功能實(shí)現(xiàn) 1015580六、范圍搜索功能實(shí)現(xiàn) 1428805(一)范圍精確搜索功能實(shí)現(xiàn) 1421647(二)范圍模糊搜索功能實(shí)現(xiàn) 169229七、快速搜索功能實(shí)現(xiàn) 166318(一)數(shù)據(jù)庫結(jié)構(gòu) 1620397(二)服務(wù)器程序連接數(shù)據(jù)庫 1729049八、客戶端監(jiān)聽程序(云同步) 2026477附錄1 229337工程的目錄結(jié)構(gòu): 2215818basic.jsp源代碼 2414573basic_error.jsp源代碼 282291Socketerror.jsp源代碼 2820613SocketPro.jsp源代碼 297949SocketSuccess.html源代碼 297973Success.jsp源代碼 302431lib所需要的文件 3016768JQuery+JQueryUI 3120358struts.xml源代碼 3229128filesearch.java源代碼 356833FileSize.java源代碼 3621207ZIP.java源代碼 3811250Fast_is_search.java源代碼 403434fast_like_search.java源代碼 423676normal_is_search.java源代碼 446247Normal_like_search.java源代碼 477380searchAction.java源代碼 503154FileDownloadPackage.java源代碼 5523095FolderZIP.java源代碼 569045ServerSocketAction.java源代碼 5922471SocketAction.java源代碼 6121121filedownloadAction.java源代碼 64982附錄2 663642Information_Port源代碼 6719218MainPro源代碼 706896Progress.java源代碼 712265Server_Port.java源代碼 725252UI.java源代碼 7526493DiskCode.java源代碼 7927160UIDeCode.java源代碼 80一、功能簡介隨著時(shí)間的積累,文件資料變得越來越多。在短短3年的時(shí)間里文件資料已經(jīng)增長到了2T并且正在快速增長,查找和管理變得越來越困難。但是傳統(tǒng)的FTP軟件只擁有簡單的查閱和下載功能而且沒有搜索功能,已經(jīng)無法滿足大數(shù)據(jù)條件下的資料管理和快速有效的查找文資料。中隊(duì)在資料管理方面迫切需要一款能夠有效管理大量數(shù)據(jù)文件資料的軟件。首先軟件需要完成以下功能:類似于FTP軟件的文件瀏覽瀏覽功能。資料文件的單個(gè)下載。3.資料文件的批量下載。4.文件的精確搜索。5.文件夾的精確搜索。6.文件的模糊搜索。7.文件夾的模糊搜索。8.文件的范圍精確搜索。9.文件夾的范圍模糊搜索。10.權(quán)限控制,根據(jù)登錄賬號的類型,擁有不同的權(quán)限。例如超級管理員擁有上傳、下載、修改以及后臺操作數(shù)據(jù)庫的權(quán)限。而普通用戶只有下載和查看的權(quán)限。二、整體架構(gòu)程序采用B/S的全局架構(gòu),B/S結(jié)構(gòu)即瀏覽器和服務(wù)器結(jié)構(gòu)。它是隨著Internet技術(shù)的興起,對C/S結(jié)構(gòu)的一種變化或者改進(jìn)的結(jié)構(gòu)。在這種結(jié)構(gòu)下,用戶工作界面是通過WWW瀏覽器來實(shí)現(xiàn),極少部分事務(wù)邏輯在前端(Browser)實(shí)現(xiàn),但是主要事務(wù)邏輯在服務(wù)器端(Server)實(shí)現(xiàn),形成所謂三層3-tier結(jié)構(gòu)。B/S結(jié)構(gòu)是WEB興起后的一種網(wǎng)絡(luò)結(jié)構(gòu)模式,WEB瀏覽器是客戶端最主要的應(yīng)用軟件。這種模式統(tǒng)一了客戶端,將系統(tǒng)功能實(shí)現(xiàn)的核心部分集中到服務(wù)器上,簡化了系統(tǒng)的開發(fā)、維護(hù)和使用。客戶機(jī)上只要安裝一個(gè)瀏覽器(Browser),如NetscapeNavigator或InternetExplorer,服務(wù)器安裝Oracle、Sybase、Informix或SQLServer等數(shù)據(jù)庫。瀏覽器通過WebServer同數(shù)據(jù)庫進(jìn)行數(shù)據(jù)交互。這樣就大大簡化了客戶端電腦載荷,減輕了系統(tǒng)維護(hù)與升級的成本和工作量,降低了用戶的總體成本(TCO)。程序前端采用JSP實(shí)現(xiàn)文件夾結(jié)構(gòu)的顯示。核心采用Strtus2作為程序核心處理模塊。所有JSP網(wǎng)頁采用全動態(tài)顯示技術(shù)。JSP在服務(wù)器端運(yùn)行后,動態(tài)的生成所需要的HTML5+CSS3標(biāo)簽語言的語句。實(shí)現(xiàn)網(wǎng)頁標(biāo)簽語句由服務(wù)器自動生成。如圖1所示。圖1架構(gòu)總體圖Struts2是Struts的下一代產(chǎn)品,是在struts1和WebWork的技術(shù)基礎(chǔ)上進(jìn)行了合并的全新的Struts2框架。其全新的Struts2的體系結(jié)構(gòu)與Struts1的體系結(jié)構(gòu)差別巨大。Struts2以WebWork為核心,采用攔截器的機(jī)制來處理用戶的請求,這樣的設(shè)計(jì)也使得業(yè)務(wù)邏輯控制器能夠與ServletAPI完全脫離開,所以Struts2可以理解為WebWork的更新產(chǎn)品。雖然從Struts1到Struts2有著太大的變化,但是相對于WebWork,Struts2的變化很小。當(dāng)Web容器收到請求(HttpServletRequest)它將請求傳遞給一個(gè)標(biāo)準(zhǔn)的的過濾鏈包括\o""(ActionContextCleanUp)過濾器,然后經(jīng)過Otherfilters(SiteMesh,etc),接下來需要調(diào)用FilterDispatcher核心控制器,然后它調(diào)用ActionMapper確定請求哪個(gè)Action,ActionMapper返回一個(gè)收集Action詳細(xì)信息的ActionMaping對象。接下來FilterDispatcher將控制權(quán)委派給ActionProxy,ActionProxy調(diào)用配置管理器(ConfigurationManager)從配置文件中讀取配置信息(struts.xml),然后創(chuàng)建ActionInvocation對象,ActionInvocation在調(diào)用Action之前會依次的調(diào)用所用配置攔截器(InterceptorN)一旦執(zhí)行結(jié)果返回結(jié)果字符串ActionInvocation負(fù)責(zé)查找結(jié)果字符串對應(yīng)的(Result)然后執(zhí)行這個(gè)ResultResult會調(diào)用一些模版(JSP)來呈現(xiàn)頁面,之后攔截器(InterceptorN)會在被執(zhí)行(順序和Action執(zhí)行之前相反)最后響應(yīng)(HttpServletResponse)被返回在web.xml中配置的那些過濾器和(核心控制器)(FilterDispatcher)。三、文件瀏覽功能實(shí)現(xiàn)文件瀏覽功能的實(shí)現(xiàn)分為三個(gè)步驟:生成后的網(wǎng)頁如圖2所示:圖2網(wǎng)頁前端頁面頁面核心代碼如下所示: <% intdl=(int)session.getAttribute("directoryNumber"); for(intj=0;j<dl;j++) { Stringip=request.getLocalAddr(); Stringdname=(String)session.getAttribute("directoryname"+j); Stringdurl=(String)session.getAttribute("directory"+j); Stringdsize=(String)session.getAttribute("directorysize"+j); Stringdirectory="<trclass='li'><tdid='name'><a href='filesearch?url="+durl+"'><imgsrc='imgs/文件夾.png' onclick='submit()'><span>"+dname+"</span></a></td><td>"+dsize+"</td><td><a href='FolderZIP?url="+durl+"&name="+dname+"&IP="+ip+"'><spanid='down'>下載 </span></a></td></tr>"; out.append(directory); out.flush(); } intfl=(int)session.getAttribute("fileNumber"); for(intj=0;j<fl;j++) { Stringfname=(String)session.getAttribute("filename"+j); Stringfurl=(String)session.getAttribute("file"+j); Stringfilesize=(String)session.getAttribute("filesize"+j); Stringfile="<trclass='li'><tdid='name'><a href='filedownload?url="+furl+"&filename="+fname+"'><imgsrc='imgs/文件.png' onclick='submit()'><span>"+fname+"</span></a></td><td>"+filesize+"</td><td><a href='filedownload?url="+furl+"&filename="+fname+"'><spanid='down'>下載 </span></a></td></tr>"; out.append(file); out.flush(); } %>3.用戶通過網(wǎng)頁點(diǎn)擊網(wǎng)頁上的文件夾,產(chǎn)生一個(gè)請求。服務(wù)器獲取請求,交給Action類處理。關(guān)鍵代碼如下所示:for(inti=0;i<List.length;i++) { if(List[i].isFile()) { System.out.println("文件:"+List[i]); session.put("filesize"+fileNumber, (List[i].length()/1000000)+"Mb"); session.put("file"+fileNumber,List[i].getPath()); session.put("filename"+fileNumber,List[i].getName()); fileNumber++; } } for(inti=0;i<List.length;i++) { if(List[i].isDirectory()) { System.out.println("文件夾:"+List[i]); System.out.println("文件夾名:"+List[i].getName()); session.put("directory"+directoryNumber,List[i].getPath()); session.put("directoryname"+directoryNumber,List[i].getName()); session.put("directorysize"+directoryNumber, (List[i].length()/1000000)+"Mb"); directoryNumber++; } } session.put("fileNumber",fileNumber); session.put("directoryNumber",directoryNumber); returnSUCCESS在文件瀏覽是,為了防止用戶訪問服務(wù)器的其他區(qū)域,需要加一個(gè)訪問路徑的限定,實(shí)現(xiàn)代碼如下所示: publicStringexecute(){ session.clear(); if(url.indexOf("j:\\file")==-1){//規(guī)定文件路徑訪問范圍范圍(\\代表\) System.out.println(url.indexOf("j:\\file")); returnERROR;}FileSize.java實(shí)現(xiàn)文件的計(jì)算,因?yàn)槲募A內(nèi)部有很多個(gè)文件,全部計(jì)算耗費(fèi)的運(yùn)算資源是巨大的。所以只計(jì)算單個(gè)文件的大小。當(dāng)文件大小小于1MB時(shí),文件已無大小計(jì)算必要,所以不計(jì)算大小,與文件夾一樣大小顯示為0MB。關(guān)鍵代碼如下所示:publicvoidgetsize(Filefile){ File[]List=file.listFiles(); System.out.println("該目錄下對象個(gè)數(shù):"+List.length); for(inti=0;i<List.length;i++){ if(List[i].isFile()){ System.out.println("文件:"+List[i]); num++; size=size+List[i].length()/1000000; if(size>3000||num>15000){//大于2G break; } } if(List[i].isDirectory()){ System.out.println("文件夾:"+List[i]); getsize(List[i]); } }}Strtus2獲取文件夾列表后,將文件名、文件路徑、文件大小存入session內(nèi),然后根據(jù)session里內(nèi)容的不同,在服務(wù)器端生成相應(yīng)的頁面代碼。返回給用戶瀏覽器,完成一次瀏覽。如圖3所示:圖3響應(yīng)頁面四、單個(gè)文件下載功能實(shí)現(xiàn)單個(gè)文件的下載采用Strtus2實(shí)現(xiàn)。首先需要配置一個(gè)Action的攔截器,攔截filedownlaod請求。打開Strtus.xml配置一個(gè)Action,具體代碼如下所示:<actionname="filedownload"class="UPDownload.filedownloadAction"><!--下載--> <resultname="success"type="stream"> <paramname="contentType">application/octet-stream</param><!--文件類型 ( 無限制)--> <param name="contentDisposition">attachment;filename="${getName()}"</param><!--使用經(jīng)過轉(zhuǎn)碼的文件名作為下載文件名——默認(rèn)格式是attachment;filename="${fileName}",將調(diào)用該Action中的getFileName方法。--><paramname="inputName">downloadFile</param><!--inputName流對象名——比如這里寫inputStream,它就會自動去找Action中的getInputStream方法。--> <paramname="bufferSize">4096</param><!--bufferSize下載文件的緩沖大小--> </result></action>Action攔截到filedownlaod請求后,將請求參數(shù)傳遞給filedownaction處理。其中請求參數(shù)filename表示文件的名稱,url文件在服務(wù)器磁盤的絕對路徑。具體代碼如下:privateStringfilename; privateStringurl; publicStringgetName(){ byte[]b; try{ System.out.println("filename:"+filename); b=filename.getBytes(); Strings=newString(b,"ISO8859-1"); returns; }catch(UnsupportedEncodingExceptione){ System.out.println("錯誤!"); e.printStackTrace(); } returnfilename; } publicStringgetFilename(){ returnfilename; } publicvoidsetFilename(Stringfilename){ this.filename=filename; } publicInputStreamgetDownloadFile() { try{ return(newFileInputStream(url)); }catch(FileNotFoundExceptione){ System.out.println("FileNotFound"); e.printStackTrace(); } returnnull; }publicStringexecute(){ returnSUCCESS; }圖9實(shí)現(xiàn)單個(gè)文件下載的Action類當(dāng)用戶點(diǎn)擊下載,后會出現(xiàn)如圖4所示的下載框。用戶可選擇文件存儲位置以及修改文件名稱,點(diǎn)擊保存后,開始下載。如圖5所示:圖4下載框圖5文件開始下載五、文件夾下載功能實(shí)現(xiàn)文件夾下載采用客戶端方式實(shí)現(xiàn),首先介紹服務(wù)器端的程序。用戶在瀏覽器上點(diǎn)擊下載,然后瀏覽器產(chǎn)生一個(gè)FolderZIP請求。Strtus2攔截到FolderZIP請求后將請求參數(shù)文件夾路徑url、用戶IP、文件夾名稱name傳遞給SocketAction處理。攔截器配置文件如下所示: <actionname="FolderZIP"class="TestSocket.FolderZIP"><!--文件夾 <resultname="success"> /SocketSuccess.html </result> <resultname="error"> /Socketerror.jsp </result> </action>SocketAction在54321號端口建立Socket通信。成功連接客戶端后發(fā)送通信數(shù)據(jù)包,通信數(shù)據(jù)傳輸、數(shù)據(jù)包結(jié)構(gòu)如下所示:Socketclient_Inf=newSocket(IP,54321); System.out.println("開始發(fā)送通信數(shù)據(jù)包..."); client_Inf.getOutputStream(); FileDownloadPackagefiledownloadPackage=newFileDownloadPackage(); filedownloadPackage.Header="CreateFolder"; filedownloadPackage.SourseIP=client_Inf.getLocalAddress().getHostAddress(); filedownloadPackage.Port=client_Inf.getLocalPort(); filedownloadPackage.Name=name; filedownloadPackage.Location=""; filedownloadPackage.Blank="123"; ObjectOutputStreamoos=newObjectOutputStream(client_Inf.getOutputStream()); oos.writeObject(filedownloadPackage); System.out.println("發(fā)送通信數(shù)據(jù)包成功..."); oos.flush(); r.delay(1000); oos.close(); client_Inf.close(); r.delay(2000);
/** *文件夾下載數(shù)據(jù)結(jié)構(gòu) */ privatestaticfinallongserialVersionUID=1L; publicStringHeader;//文件頭CreateDirectorFolder publicStringSourseIP;//發(fā)送方IP publicintPort;//發(fā)送方端口 publicStringName;//文件夾名稱 publicStringLocation;//需要創(chuàng)建的位置,j:/file的后續(xù)位置例如Location=/g1 publicStringBlank;//保留位客戶端接收到通信數(shù)據(jù)包后解析,數(shù)據(jù)包內(nèi)容,打開59999號端口準(zhǔn)備接收文件。在下載之前需要進(jìn)行文件夾大小計(jì)算,如果文件夾總大小大于等于3GB這停止遞歸調(diào)用,返回Size,當(dāng)文件夾計(jì)算函數(shù)返回error,提示用戶下載文件夾過大,建議分開下載。文件夾大小計(jì)算函數(shù)如下所示:/** *驗(yàn)證文件夾大小 */ FileSizefs=newFileSize(); fs.getsize(newFile(url)); if(fs.num>10000||fs.size>3000){//文件數(shù)目>10000文件大小大于3G System.out.println("文件大小="+fs.size); System.out.println("文件個(gè)數(shù)="+fs.num); return"error"; }如果計(jì)算文件大小小于3GB,服務(wù)器調(diào)用ZIP類,實(shí)現(xiàn)指定文件夾的壓縮打包。ZIP類的主要方法為遍歷文件夾,將文件夾內(nèi)的文件依次壓縮。ZIP類代碼如下:publicclassZIP{ /**創(chuàng)建一個(gè)壓縮文件,from為文件夾路徑,to為創(chuàng)建好后壓縮文件路徑*/ publicvoidCreateZip(Stringfrom,OutputStreamto)throwsIOException { List<File>list=getFiles(from); ZipOutputStreamout=newZipOutputStream(to); for(Filef:list) { InputStreamin=newFileInputStream(f); Stringname=getRelName(from,f); ZipEntryen=newZipEntry(newFile(from).getName()+"/"+name); en.setSize(f.length()); out.putNextEntry(en); out.setComment("中文測試"); intlen=0; byte[]buffer=newbyte[1024]; while(-1!=(len=in.read(buffer))) { out.write(buffer,0,len); } in.close(); } out.close(); } /**獲取文件的相對路徑*/ privateStringgetRelName(Stringfrom,Filef){ //TODOAuto-generatedmethodstub Stringa=f.getAbsolutePath().replace(from+"\\",""); a=a.replace("\\","/"); System.out.println(from+""+a); returna; } /**獲取路徑下所有文件,包括文件夾下的*/ privateList<File>getFiles(Stringsou) { List<File>list=newArrayList<File>(); Filef=newFile(sou); Filefiles[]=f.listFiles(); for(Filefile:files) { if(file.isFile()) { list.add(file); } else { list.addAll(getFiles(file.getPath())); } } returnlist; }}文件成功壓縮后存儲于服務(wù)器的緩存中,服務(wù)器調(diào)用數(shù)據(jù)傳輸端口與客戶端的59999號端口建立Socket鏈接,開始傳輸緩存里的壓縮文件。實(shí)現(xiàn)代碼如下所示:Socketclient=newSocket(IP,defaultPort); System.out.println("下載鏈接創(chuàng)建成功!目標(biāo)IP="+IP+"目標(biāo)端口="+defaultPort); FileInputStreamfis=newFileInputStream("j:/file/java.zip"); OutputStreamnetOut=client.getOutputStream(); OutputStreamout=newDataOutputStream(newBufferedOutputStream(netOut)); byte[]buffer=newbyte[4096]; intnum=fis.read(buffer); while(num!=(-1)){ out.write(buffer,0,num); out.flush(); num=fis.read(buffer); } out.flush(); out.close(); fis.close(); client.close();客戶端程序采用多線程技術(shù),在實(shí)現(xiàn)文件夾壓縮下載功能時(shí)總共使用了3個(gè)線程main(String[]args)主線程、Information_Port通信數(shù)據(jù)端口監(jiān)視線程、Server_Port數(shù)據(jù)傳輸線程、Progress下載進(jìn)度監(jiān)視線程。下面我將分別介紹四個(gè)線程的作用、代碼實(shí)現(xiàn)。main(String[]args)主線程為程序主入口,主線程主要作用是創(chuàng)建、開啟和關(guān)閉其他線程。所有的線程都在主線程里調(diào)用。主線程代碼如下:publicstaticvoidmain(String[]args)throwsAWTException { UIDeCodeuicode=newUIDeCode(); uicode.lanchframe(); UIui=newUI("59999下載端口監(jiān)視"); ui.LanchFrame(); Information_Portinfp=newInformation_Port(ui); Threadtinfp=newThread(infp); tinfp.start(); Server_Portsp=newServer_Port(ui,infp); Threadtsp=newThread(sp); tsp.start(); }六、范圍搜索功能實(shí)現(xiàn)(一)范圍精確搜索功能實(shí)現(xiàn)范圍精確搜索由兩個(gè)函數(shù)實(shí)現(xiàn),分別是search_file()搜索文件和search_d()搜索文件夾。函數(shù)的執(zhí)行步奏主要是:獲取前端傳來的請求參數(shù),利用Filefile=newFile()創(chuàng)建文件引用,然后利用listFile()函數(shù)獲取文件列表。然后使用循環(huán)語句依次對文件明進(jìn)行獲取。如果文件名與所要搜索的文件名相同,這執(zhí)行將文件名、文件路徑、文件大小存入Session返回前臺。如果是文件夾則進(jìn)行遞歸調(diào)用,即函數(shù)自己調(diào)用自己。關(guān)鍵代碼如圖所示: publicvoidsearch_file(Stringurl){ //session.clear(); Filefile=newFile(url);//創(chuàng)建文件 File[]List=file.listFiles();//將文件列表放入List數(shù)組 if(List==null){//判斷是否為空文件夾或者文件不存在 System.out.println("空文件夾"); System.out.println("RobotchappeComplete!在"); } else{ //System.out.println("該目錄下對象個(gè)數(shù):"+List.length); for(inti=0;i<List.length;i++) { if(List[i].isFile()) { if(List[i].getName().equals(name)){//比較文件名稱與需要查詢的名稱 System.out.println("找到文件?。。。。?!"+List[i].getPath()); Stringp=List[i].getPath();//獲取文件路徑 Stringname=List[i].getName();//獲取文件名稱 session.put("file"+k,p);//將文件路徑存入Session session.put("filename"+k,name);//將文件名稱存入Session session.put("filesize"+k,List[i].length()/1000000+"M"); k++; } } } for(inti=0;i<List.length;i++) { if(List[i].isDirectory()) { search_file(List[i].getPath());//遞歸調(diào)用! } } } session.put("fileNumber",k); }同理文件夾的精確搜索實(shí)現(xiàn)代碼如下:publicvoidsearch_d(Stringurl){ intk=0; Filefile=newFile(url); File[]List=file.listFiles(); if(List==null){ System.out.println("空文件夾"); System.out.println("RobotchappeComplete!在"); } else{ System.out.println("該目錄下對象個(gè)數(shù):"+List.length); for(inti=0;i<List.length;i++) { if(List[i].isFile()) { } } for(inti=0;i<List.length;i++) { if(List[i].isDirectory()) { if(List[i].getName().equals(name)){ System.out.println("找到文件夾夾夾!?。。。。?+List[i].getPath()); session.put("directory"+k,List[i].getPath()); session.put("directoryname"+k,List[i].getName()); session.put("directorysize"+k,List[i].length()/1000000+"M"); k++; } search_d(List[i].getPath()); } } } session.put("directoryNumber",k); }}(二)范圍模糊搜索功能實(shí)現(xiàn)范圍模糊搜索功能的實(shí)現(xiàn),與范圍精確搜索功能的實(shí)現(xiàn)大同小異。唯一的區(qū)別在于,文件夾名稱的比較。只要文件夾中有搜索的關(guān)鍵字,則認(rèn)為找到文件或者文件夾。關(guān)鍵代碼如下: if(List[i].getName().indexOf(name)!=-1){//查找的字符串在文件名中 System.out.println("找到文件?。。。。。?+List[i].getPath()); Stringp=List[i].getPath(); Stringname=List[i].getName(); session.put("file"+k,p); session.put("filename"+k,name); session.put("filesize"+k,List[i].length()/1000000+"M"); k++; }七、快速搜索功能實(shí)現(xiàn)快速搜索采用建立數(shù)據(jù)庫索引的方法。首先服務(wù)器運(yùn)行索引建立程序。按著程序的默認(rèn)設(shè)置,索引每天更新一次,當(dāng)晚上12點(diǎn)時(shí)程序自動運(yùn)行。50萬個(gè)文件的索引建立大約需要2小時(shí)。數(shù)據(jù)庫結(jié)構(gòu)數(shù)據(jù)庫采用MySQL數(shù)據(jù)庫。MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),目前屬于Oracle公司。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL軟件采用了雙授權(quán)政策(本詞條“授權(quán)政策”),它分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。數(shù)據(jù)庫名稱為qbzdfile用戶名:dx密碼:1026278249如圖6所示:圖6數(shù)據(jù)庫整體結(jié)構(gòu)文件和文件夾的Table結(jié)構(gòu)相同,number為一個(gè)Int整數(shù)型自增主鍵,number代表文件的唯一編碼。name是一個(gè)varchar類型代表文件的名稱。url是一個(gè)varchar類型代表文件在服務(wù)器磁盤的絕對路徑。size是一個(gè)varchar類型代表文件的大小。如圖7所示:圖7文件和文件夾的Table服務(wù)器程序連接數(shù)據(jù)庫實(shí)現(xiàn)導(dǎo)入mysql-connector-java-5.1.6-bin.jar文件到lib項(xiàng)目文件夾。利用JDBC技術(shù)實(shí)現(xiàn)Java服務(wù)器與數(shù)據(jù)庫的連接。JDBC(JavaDataBaseConnectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的JavaAPI,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。Java數(shù)據(jù)庫連接體系結(jié)構(gòu)是用于Java應(yīng)用程序連接數(shù)據(jù)庫的標(biāo)準(zhǔn)方法。JDBC對Java程序員而言是API,對實(shí)現(xiàn)與數(shù)據(jù)庫連接的服務(wù)提供商而言是接口模型。作為API,JDBC為程序開發(fā)提供標(biāo)準(zhǔn)的接口,并為數(shù)據(jù)庫廠商及第三方中間件廠商實(shí)現(xiàn)與數(shù)據(jù)庫的連接提供了標(biāo)準(zhǔn)方法。JDBC使用已有的SQL標(biāo)準(zhǔn)并支持與其它數(shù)據(jù)庫連接標(biāo)準(zhǔn),如ODBC之間的橋接。JDBC實(shí)現(xiàn)了所有這些面向標(biāo)準(zhǔn)的目標(biāo)并且具有簡單、嚴(yán)格類型定義且高性能實(shí)現(xiàn)的接口。Java具有堅(jiān)固、安全、易于使用、易于理解和可從網(wǎng)絡(luò)上自動下載等特性,是編寫數(shù)據(jù)庫應(yīng)用程序的杰出語言。所需要的只是Java應(yīng)用程序與各種不同數(shù)據(jù)庫之間進(jìn)行對話的方法。而JDBC正是作為此種用途的機(jī)制。JDBC擴(kuò)展了Java的功能。例如,用Java和JDBCAPI可以發(fā)布含有applet的網(wǎng)頁,而該applet使用的信息可能來自遠(yuǎn)程數(shù)據(jù)庫。企業(yè)也可以用JDBC通過Intranet將所有職員連到一個(gè)或多個(gè)內(nèi)部數(shù)據(jù)庫中(即使這些職員所用的計(jì)算機(jī)有Windows、Macintosh和UNIX等各種不同的操作系統(tǒng))。隨著越來越多的程序員開始使用Java編程語言,對從Java中便捷地訪問數(shù)據(jù)庫的要求也在日益增加。MIS管理員們都喜歡Java和JDBC的結(jié)合,因?yàn)樗剐畔鞑プ兊萌菀缀徒?jīng)濟(jì)。企業(yè)可繼續(xù)使用它們安裝好的數(shù)據(jù)庫,并能便捷地存取信息,即使這些信息是儲存在不同數(shù)據(jù)庫管理系統(tǒng)上。新程序的開發(fā)期很短。安裝和版本控制將大為簡化。程序員可只編寫一遍應(yīng)用程序或只更新一次,然后將它放到服務(wù)器上,隨后任何人就都可得到最新版本的應(yīng)用程序。對于商務(wù)上的銷售信息服務(wù),Java和JDBC可為外部客戶提供獲取信息更新的更好方法??焖偎阉饕卜譃槲募阉骱臀募A搜索。程序執(zhí)行方式基本與范圍搜索相同,只是在數(shù)據(jù)庫的架構(gòu)下執(zhí)行。程序關(guān)鍵代碼如下:publicvoidsaerch_file(){ try{ Class.forName("org.gjt.mm.mysql.Driver"); Connectionconn=DriverManager.getConnection("jdbc:mysql:" +"http://localhost:3306/qbzdfile?user=dx&password=1026278249"); Statementstm=conn.createStatement(); ResultSetrs=stm.executeQuery("select*fromfilewherename='"+name+"'"); while(rs.next()){ Stringname=rs.getString("name"); Stringsize=rs.getString("size"); Stringurl=rs.getString("url"); session.put("filename"+k,name); session.put("filesize"+k,size); session.put("file"+k,url); k++; } }catch(ClassNotFoundException|SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } session.put("fileNumber",k); } publicvoidsaerch_d(){ try{ Class.forName("org.gjt.mm.mysql.Driver"); Connectionconn=DriverManager.getConnection("jdbc:mysql:" +"http://localhost:3306/qbzdfile?user=dx&password=1026278249"); Statementstm=conn.createStatement(); ResultSetrs=stm.executeQuery("select*fromdwherename='"+name+"'"); while(rs.next()){ Stringname=rs.getString("name"); Stringsize=rs.getString("size"); Stringurl=rs.getString("url"); session.put("directoryname"+k,name); session.put("directorysize"+k,size); session.put("directory"+k,url); k++; } }catch(ClassNotFoundException|SQLExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } session.put("directoryNumber",k); }
八、客戶端監(jiān)聽程序(云同步)客戶端采用Socket編程,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通信連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)連接的一端稱為一個(gè)socket。Socket的英文原義是“孔”或“插座”。作為BSDUNIX的進(jìn)程通信機(jī)制,取后一種意思。通常也稱作"套接字",用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信。在Internet上的主機(jī)一般運(yùn)行了多個(gè)服務(wù)軟件,同時(shí)提供幾種服務(wù)。每種服務(wù)都打開一個(gè)Socket,并綁定到一個(gè)端口上,不同的端口對應(yīng)于不同的服務(wù)。Socket正如其英文原意那樣,像一個(gè)多孔插座。一臺主機(jī)猶如布滿各種插座的房間,每個(gè)插座有一個(gè)編號,有的插座提供220伏交流電,有的提供110伏交流電,有的則提供有線電視節(jié)目。客戶軟件將插頭插到不同編號的插座,就可以得到不同的服務(wù)。實(shí)質(zhì)上提供了進(jìn)程通信的端點(diǎn)。進(jìn)程通信之前,雙方首先必須各自創(chuàng)建一個(gè)端點(diǎn),否則是沒有辦法建立聯(lián)系并相互通信的。正如打電話之前,雙方必須各自擁有一臺電話機(jī)一樣。在網(wǎng)間網(wǎng)內(nèi)部,每一個(gè)Socket用一個(gè)半相關(guān)描述:(協(xié)議,本地地址,本地端口)。一個(gè)完整的Socket有一個(gè)本地唯一的Socket號,由操作系統(tǒng)分配。根據(jù)連接啟動的方式以及本地套接字要連接的目標(biāo),套接字之間的連接過程可以分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請求,連接確認(rèn)。(1)服務(wù)器監(jiān)聽:是服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài)。(2)客戶端請求:是指由客戶端的套接字提出連接請求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。(3)連接確認(rèn):是指當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求,它就響應(yīng)客戶端套接字的請求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,連接就建立好了。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。在本程序中,開發(fā)者定義59999號端口為下載端口,54321號端口為通信數(shù)據(jù)傳輸端口。兩個(gè)端口都設(shè)置多線程監(jiān)視。采用多線程可以提高CPU的運(yùn)算效率,同時(shí)也能防止主線程的阻塞??蛻舳顺绦蚩偣灿?個(gè)線程,第一個(gè)是主線程MainPro,第二個(gè)線程是54321號端口監(jiān)視線程Information_Port,第三個(gè)線程是59999號端口監(jiān)視線程Server_Port,第四個(gè)線程是下載進(jìn)度監(jiān)視線程Progress??蛻舳司唧w實(shí)現(xiàn)的功能就是接受服務(wù)器發(fā)送的數(shù)據(jù)包。然后對數(shù)據(jù)包進(jìn)行解析。如果為通信數(shù)據(jù)包則獲取數(shù)據(jù)包信息,如果為下載數(shù)據(jù)包則將數(shù)據(jù)保存至用戶選擇的地方。代碼詳見附錄2。
附錄1工程的目錄結(jié)構(gòu):
basic.jsp源代碼<%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""/TR/html4/loose.dtd"><html><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"><title>文件瀏覽動態(tài)生成頁面</title> <scriptsrc="JQuery+UI/jquery-2.1.3.min.js"></script><scriptsrc="JQuery+UI/jquery-ui.min.js"></script><linktype="text/css"rel="stylesheet"href="JQuery+UI/jquery-ui.min.css"><styletype="text/css"> img{ width:20px; height:20px; } a{ text-decoration:none; color:black; } a:VISITED{ color:black; } #li_header{background-color:#585fff;width:100%;font-size:20px;color:#ffffff;}.header_p{color:#ffffff;font-size:20px;text-align:center;}#name{ text-align:left;}.selectmenu{ width:104px; height:30px; font-size:16px;}#down{ color:blue;}.li{ background-color:#F3F3F3; font-size:15px;}.li:HOVER{ background-color:#c8ceff;}</style></head><bodystyle="width:1200px;margin:0pxauto;"> <divid="w1000"style="width:1000px;margin:5pxauto;"> <formaction="filesearch"method="get"> <imgsrc="imgs/主頁.jpg"onclick="submit()"> <inputtype="text"name="url"value="j:\file"style="display:none;"> </form> <formaction="filesearch"method="get"> <inputid="url"type="text"name="url"value="<%=session.getAttribute("path")%>"style="font-size:20px;width:950px;height:25px;margin-bottom:5px;"> <aid="tiao"href="#"><imgsrc="imgs/跳轉(zhuǎn)到.png"style="margin-top:5px;"> </a> <script> setInterval(functiondx(){ varu=document.getElementById("url").value; //alert(u); document.getElementById("tiao").href="filesearch?url="+u; },300) </script> </form> <formaction="search"target="_blank"> <selectclass="selectmenu"name="method"><optionvalue="fast">快速搜索</option><optionvalue="normal">全面搜索</option></select> <selectclass="selectmenu"name="type"> <optionvalue="like">模糊搜索</option><optionvalue="is">精確搜索</option></select> <selectclass="selectmenu"name="search_value"> <optionvalue="f">文件</option><optionvalue="d">文件夾</option></select> <inputstyle="width:550px;height:30px;font-size:16px;"type="search"name="name"value=""> <inputclass="selectmenu"type="submit"value="搜索"> <inputstyle="display:none;"type="text"name="url"value="<%=session.getAttribute("path")%>"> </form> <divstyle="text-align:center;"> <tablestyle="width:100%"><trid='li_header'><tdclass='header_p'>名稱</td><tdclass
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文書模板-解除流轉(zhuǎn)合同
- 影響肉質(zhì)的營養(yǎng)因素
- 普寧市勤建學(xué)校九年級上學(xué)期語文第一次月考試卷
- 黃石港區(qū)黃石市第十五中學(xué)九年級上學(xué)期語文開學(xué)考試卷
- 【初中化學(xué)】走進(jìn)化學(xué)世界單元復(fù)習(xí)題-2024-2025學(xué)年九年級化學(xué)人教版(2024)上冊
- 南京航空航天大學(xué)《法律前沿問題》2021-2022學(xué)年期末試卷
- 南京工業(yè)大學(xué)浦江學(xué)院《稅法二》2021-2022學(xué)年第一學(xué)期期末試卷
- 巴中市巴州區(qū)群樂初級中學(xué)師生食堂施工組織設(shè)計(jì)
- 騰沖翡翠小區(qū)施工組織設(shè)計(jì)
- 南京工業(yè)大學(xué)浦江學(xué)院《流體力學(xué)基礎(chǔ)與液壓和氣動技術(shù)》2022-2023學(xué)年第一學(xué)期期末試卷
- 幼兒園老師說課培訓(xùn)課件
- 房貸延期代理合同(2篇)
- 2024江蘇省沿海開發(fā)集團(tuán)限公司招聘23人高頻難、易錯點(diǎn)500題模擬試題附帶答案詳解
- 22G101三維彩色立體圖集
- 大學(xué)生安全文化智慧樹知到期末考試答案章節(jié)答案2024年中南大學(xué)
- 人教版小學(xué)英語單詞表(完整版)
- 《短視頻拍攝與制作》課件-3短視頻拍攝的三大技巧
- 【川教版】《生命 生態(tài) 安全》四上第11課《預(yù)防流感》課件
- 2024年江蘇江南水務(wù)股份有限公司招聘筆試參考題庫附帶答案詳解
- (完整)小學(xué)語文考試專用作文方格紙
- 2023版監(jiān)理規(guī)范(含表格)
評論
0/150
提交評論