網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)--畢業(yè)設(shè)計_第1頁
網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)--畢業(yè)設(shè)計_第2頁
網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)--畢業(yè)設(shè)計_第3頁
網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)--畢業(yè)設(shè)計_第4頁
網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)--畢業(yè)設(shè)計_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、畢 業(yè) 設(shè) 計網(wǎng)頁即時聊天工具的設(shè)計與實現(xiàn)摘 要聊天工具作為計算機(jī)網(wǎng)絡(luò)的應(yīng)用之一,受到了用戶的普遍愛好,它把人們帶進(jìn)了一個虛擬的網(wǎng)絡(luò)世界,大大加深了人們之間的聯(lián)系。從單一的文本聊天,到語音聊天以及到現(xiàn)在的圖像、視頻聊天、及時短信的發(fā)送和在線游戲等功能的開發(fā),已經(jīng)大大的拓展了聊天工具的概念,它將會作為未來人們通過因特網(wǎng)相互聯(lián)系和娛樂的主要平臺。此次設(shè)計從實際工程應(yīng)用角度出發(fā),以計算機(jī)網(wǎng)絡(luò)原理為指導(dǎo),結(jié)合當(dāng)前網(wǎng)絡(luò)中的一些常用技術(shù),編程實現(xiàn)基于Java的網(wǎng)絡(luò)聊天工具,涉及的內(nèi)容包括web通信,身份驗證和注冊登陸,建立效勞器,連接效勞器以及數(shù)據(jù)接口實現(xiàn)等。論文對當(dāng)今聊天軟件的開展情況、與該聊天軟件相關(guān)

2、的各種技術(shù)以及該聊天工具的實現(xiàn)做了一個詳細(xì)的闡述。論文主要分為四大版塊。第一大版塊主要介紹了與設(shè)計有關(guān)的背景知識,相關(guān)技術(shù),以及此次設(shè)計的意義所在;第二大版塊主要對設(shè)計的可行性進(jìn)行了分析,并對系統(tǒng)的具體實施做了鋪墊;第三大版塊為最重要版塊,即工程的具體設(shè)計以及關(guān)鍵技術(shù)的運用與實現(xiàn);第四大版塊為演示版塊,主要對作品進(jìn)行展示。關(guān)鍵字: Java Ajax MySQL 網(wǎng)頁聊天 學(xué)生承諾書本人鄭重承諾:所呈交的論文是本人在導(dǎo)師的指導(dǎo)下獨立進(jìn)行研究所取得的研究成果。除了文中特別加以標(biāo)注引用的內(nèi)容外,本論文不包含任何其他個人或集體已經(jīng)發(fā)表或撰寫的成果作品。 作者簽名: 年 月 日目 錄1 前言11.1

3、工程開發(fā)的背景11.2 典型聊天工具的分析21.3 工程開發(fā)的主要內(nèi)容41.4 工程開發(fā)的意義41.5 工程開發(fā)的過程42 系統(tǒng)開發(fā)相關(guān)技術(shù)52.1 Struts mvc框架52.2 Ajax的定時刷新62.3 Json92.4 Jquery102.5 Hibernate102.6 Css+div103 系統(tǒng)開發(fā)113.1 系統(tǒng)目標(biāo)113.2 可行性分析113.2.1 經(jīng)濟(jì)可行性113.2.2 運行可行性113.3 系統(tǒng)功能結(jié)構(gòu)123.4 系統(tǒng)實施123.4.1 開發(fā)環(huán)境123.4.2 數(shù)據(jù)庫設(shè)計123.4.3 數(shù)據(jù)庫操作子系統(tǒng)143.4.4 業(yè)務(wù)邏輯子系統(tǒng)193.4.5 系統(tǒng)時序圖303.4

4、.6 采用的關(guān)鍵技術(shù)313.4.7 系統(tǒng)測試與主要界面343.5 運行環(huán)境384 結(jié)束語38致 謝40參 考 文 獻(xiàn)41Abstract42仲愷農(nóng)業(yè)技術(shù)學(xué)院畢業(yè)論文(設(shè)計)成績評定表431 前言1.1 工程開發(fā)的背景Instant Messaging即時通訊,實時傳訊的縮寫是IM,這是一種可以讓使用者在網(wǎng)絡(luò)上建立某種私人聊天的實時通訊效勞。IM成為互聯(lián)網(wǎng)最廣泛的應(yīng)用,事先誰也沒有料到;IM成為互聯(lián)網(wǎng)最賺錢的工具之一,這已是有目共睹的事實。于是,引發(fā)了眾多對手的角逐,這就注定了,未來的IM市場從此不再平靜。IM與互聯(lián)網(wǎng)共生共榮,改變了現(xiàn)代人的溝通方式,已成為網(wǎng)民不可缺少的應(yīng)用之一,不僅可以滿足個

5、體用戶的不同需求,而且正在成為企業(yè)用戶新的通訊渠道??梢灶A(yù)見,IM將成為未來人類社會的最重要的通訊工具之一,借助互聯(lián)網(wǎng),不再需要通過 ,也能進(jìn)行可視交流。所以,未來IM市場競爭將更加劇烈。在中國IM市場上,從最初的單一文字通訊,到目前的語音視頻溝通,無論是技術(shù)的進(jìn)步,還是應(yīng)用的推廣,都預(yù)示著一種趨勢,未來的即時通信還有很大拓展空間。應(yīng)當(dāng)看到,這個空間將集中于應(yīng)用與平安兩大主題。盡管市場IM眾多,但QQ仍是一家獨大,在即時通訊的競爭中已經(jīng)穩(wěn)居領(lǐng)導(dǎo)者的市場地位,占領(lǐng)國內(nèi)市場70%以上的份額,創(chuàng)新能力極強。MSN也已經(jīng)穩(wěn)定在辦公型即時通訊領(lǐng)域的領(lǐng)導(dǎo)者定位,成為“白領(lǐng)在線協(xié)同辦公的工具。在整個即時通訊

6、領(lǐng)域,QQ、MSN目前保持了超過80%的市場份額。目前,新浪UC、飛信、阿里旺旺、雅虎通、Skype、網(wǎng)易泡泡、搜狐搜Q、百度等都已入局。 針對國內(nèi)即時通訊市場的最新調(diào)研結(jié)果。調(diào)查顯示,我國即時通訊市場無論是用戶總?cè)藬?shù)、總注冊賬戶數(shù),還是活潑賬戶數(shù)、人均擁有即時通訊賬戶數(shù),都創(chuàng)下了世界之最。我們預(yù)計未來隨著中國上網(wǎng)人口的增長,以及即時通訊軟件的不斷普及,即時通訊在線人數(shù)將保持快速增長。中國網(wǎng)民已達(dá)1億,IM產(chǎn)品越來越多樣,群雄紛爭,硝煙四起。而IM產(chǎn)品中,開源的,不開源的,都不乏各自的特色?,F(xiàn)在的聊天工具已經(jīng)比擬成熟,個人無法與一個公司競爭,但是作為一個設(shè)計工程,目的簡單明確,使此次設(shè)計的聊天

7、工具能夠?qū)崿F(xiàn),并完成目前一些同類聊天工具的大局部功能。 典型聊天工具的分析 圖1 QQ登陸界面騰訊QQ是由深圳市騰訊計算機(jī)系統(tǒng)開發(fā)的一款基于Internet的即時通信IM軟件,我們可以使用QQ和好友進(jìn)行交流,信息和自定義圖片或相片即時發(fā)送和接收,語音視頻面對面聊天,功能非常全面。此外QQ還具有與 聊天、bp機(jī)網(wǎng)上尋呼、聊天室、點對點斷點續(xù)傳傳輸文件、共享文件、qq郵箱、備忘錄、網(wǎng)絡(luò)收藏夾、發(fā)送賀卡等功能。QQ不僅僅是簡單的即時通信軟件,它與全國多家尋呼臺、移動通信公司合作,實現(xiàn)傳統(tǒng)的無線尋呼網(wǎng)、GSM移動 的短消息互聯(lián),是國內(nèi)最為流行功能最強的即時通信IM軟件。騰訊QQ支持在線聊天、即時傳送視

8、頻、語音和文件等多種多樣的功能。同時,QQ還可以與移動通訊終端、IP 網(wǎng)、無線尋呼等多種通訊方式相連,使QQ不僅僅是單純意義的網(wǎng)絡(luò)虛擬呼機(jī),而是一種方便、實用、高效的即時通信工具。QQ是現(xiàn)在在中國被使用次數(shù)最多的通訊工具。 圖2 UC登陸界面UC是新浪網(wǎng)推出的一種網(wǎng)絡(luò)即時聊天工具,功能根據(jù)網(wǎng)絡(luò)技術(shù)的進(jìn)步會不斷提升,因此會有不同的版本。擎旗技術(shù)的UcSTAR也完全純軟件實現(xiàn)的UC產(chǎn)品,根據(jù)客戶的不同需求也定制了不同的版本滿足客戶的需求。UcSTAR的簡單功能介紹:UcSTAR統(tǒng)一通信是擎旗技術(shù)推出的企業(yè)級融合通信平臺;提供多種通訊手段IM企業(yè)即時通信、文件、視頻、語音、EMAIL、SMS短信中心

9、、 、VOIP、MSN/QQ互通、WEB呼叫中心,融合企業(yè)的多種應(yīng)用系統(tǒng)緊密集成OA、CMS>、ERP、EIP、Portal、網(wǎng)站、應(yīng)用軟件,交流對象和交流內(nèi)容可管理,可控制,可擴(kuò)展,輕松實現(xiàn)部署企業(yè)的統(tǒng)一工作平臺。持久集團(tuán)化部署:垂直管理,多帳號支持、S2S分支互連 人性化的應(yīng)用:我的部門、常用聯(lián)系人、工作組支持、公告、備忘錄、消息播送 互連互通功能:QQ、MSN互通 多種客戶端體驗:C/S客戶端、WEB客戶端、 客戶端 專業(yè)級的視頻會議功能:白板、文檔共享、網(wǎng)頁共享、程序共享,最大支持16路視頻、9路混音企業(yè)短信中心SMS:雙向SMS互發(fā),自定義短信群組權(quán)限管理靈活,支持遠(yuǎn)程管理。

10、融合能力強大:和OA、CMS、ERP、EIP、Portal、網(wǎng)站、應(yīng)用軟件無縫集成 最大支持單個部署30萬同時在線,組織結(jié)構(gòu)部署人數(shù)不限制。1.3 工程開發(fā)的主要內(nèi)容設(shè)計并實現(xiàn)基于Java 的文本聊天程序,涉及的內(nèi)容包括web 通信,身份驗證和注冊登陸,建立效勞器,連接效勞器以及數(shù)據(jù)接口實現(xiàn)等。,比擬容易實現(xiàn)。1.4 工程開發(fā)的意義本工程是作為本科的畢業(yè)設(shè)計課題提出來的,它規(guī)模適中,適合于個人開發(fā),能夠鍛煉同學(xué)的學(xué)習(xí)新知識能力,鍛煉同學(xué)的編程能力,鍛煉同學(xué)的軟件工程的思維方式。目前,計算機(jī)的開展離不開網(wǎng)絡(luò)這一方向,網(wǎng)絡(luò)將大大擴(kuò)展計算機(jī)的功能,研究計算機(jī)在網(wǎng)絡(luò)方面的技術(shù)以及應(yīng)用,挖掘計算機(jī)的網(wǎng)絡(luò)

11、潛能,將能夠大大提高我們對計算機(jī)的本身的認(rèn)識,同時也能加深對計算機(jī)網(wǎng)絡(luò)的認(rèn)識。網(wǎng)絡(luò)的一大應(yīng)用就是用于用戶之間聯(lián)絡(luò)的聊天工具,通過對聊天工具的開發(fā),我們將了解計算機(jī)如何通過網(wǎng)絡(luò)相互通信以及在此相互通信的根底上實現(xiàn)的應(yīng)用程序級的協(xié)議。1.5 工程開發(fā)的過程該工程的開發(fā)過程大致分為三個大的階段:第一個階段是該軟件的方案,分析和調(diào)研階段,在這個階段里,大致的學(xué)習(xí)了相關(guān)的技術(shù),分析了相關(guān)的聊天軟件的性能和功能。第二階段就是軟件的設(shè)計與實現(xiàn)。該軟件的總體開發(fā)模式采用原型演化的開發(fā)模型,因為這個工程只是個人開發(fā),而且先前對有些知識不是很了解,所有這些都是采用原型開發(fā)的必然因素?,F(xiàn)在該工程已經(jīng)根本上完成了所有

12、的要求,還擴(kuò)展了一些功能。第三個階段是軟件的測試和文檔整理階段。完成了對軟件的所有的功能的測試,即可整理軟件的文檔,寫完論文。軟件采用原型的開發(fā)模型,分成登陸模塊,信息通信模塊等主要的幾大模塊。2 系統(tǒng)開發(fā)相關(guān)技術(shù) 2.1 Struts mvc框架Struts是Apache組織的一個工程,像其他的Apache組織的工程一樣,它也是開放源碼工程。Struts是一個比擬好的MVC框架提供了對開發(fā)MVC系統(tǒng)的底層支持,它采用的主要技術(shù)是Servlet,JSP和custom tag library。圖3 模型-視圖-控制器 (MVC)示意圖JSP 標(biāo)記只解決了局部問題。我們還得處理驗證、流程控制和更新

13、應(yīng)用程序的狀態(tài)等問題。這正是模型-視圖-控制器 (MVC)發(fā)揮作用的地方。MVC 通過將問題分為三個類別來幫助解決單一模塊方法所遇到的某些問題:Model模型 模型包含應(yīng)用程序的核心功能。模型封裝了應(yīng)用程序的狀態(tài)。有時它包含的唯一功能就是狀態(tài)。它對視圖或控制器一無所知。 View視圖 視圖提供模型的表示。它是應(yīng)用程序的 外觀。視圖可以訪問模型的讀方法,但不能訪問寫方法。此外,它對控制器一無所知。當(dāng)更改模型時,視圖應(yīng)得到通知。 Controller控制器 控制器對用戶的輸入作出反響。它創(chuàng)立并設(shè)置模型。2.2 Ajax的定時刷新利用XML 無刷新自動實時更新數(shù)據(jù). 傳統(tǒng)上,我們?yōu)g覽網(wǎng)頁,如果參加最

14、新的數(shù)據(jù).只能是等我們重新向效勞器端請求時才能顯示出來. 但是,對于一些時效性很強的網(wǎng)站.傳統(tǒng)的這種做法是不能滿足的. 我們可以讓程序自動刷新.定時向效勞器請求數(shù)據(jù).5秒取一次數(shù)據(jù),10秒取一次數(shù)據(jù). 利用XML 發(fā)出請求并取得數(shù)據(jù).傳到客戶端,客戶端重新組織并顯示數(shù)據(jù). demo.htm 前臺顯示. <script language="JavaScript"> function GetResult() /* *- GetResult() - * GetResult() * 功能:通過XML 發(fā)送請求,返回結(jié)果. * 參數(shù):str,字符串,發(fā)送條件. * 實例:

15、GetResult(); * author:yoyo* update:2021-4-11 19:02 *- GetResult() - */var oBao = new ActiveXObject("Microsoft.XML "); /特殊字符:+,%,&,=,?等的傳輸解決方法.字符串先用escape編碼的. /Update:2021-4-11 12:22 oBao.open("POST","Server.asp",false); oBao.send(); /效勞器端處理返回的是經(jīng)過escape編碼的字符串. var st

16、rResult = unescape(oBao.responseText); /將字符串分開. var arrResult = strResult.split("#"); RemoveRow(); /刪除以前的數(shù)據(jù). /將取得的字符串分開,并寫入表格中. for(var i=0;i<arrResult.length;i+) arrTmp = arrResulti.split(""); num1 = arrTmp0; /字段num1的值 num2 = arrTmp1; /字段num2的值 row1 = tb.insertRow(); cell1 =

17、row1.insertCell(); cell1.innerText = num1; cell2 = row1.insertCell(); cell2.innerText = num2; function RemoveRow() /保存第一行表頭,其余數(shù)據(jù)均刪除. var iRows = tb.rows.length; for(var i=0;i<iRows-1;i+) tb.deleteRow(1); function MyShow() /2秒自動刷新一次,2秒取得一次數(shù)據(jù). etInterval("GetResult()",2000); </script&g

18、t; <body onload="MyShow()"> <p> </p> <table width="47%" height="23" border="0" cellpadding="1" cellspacing="0" id="tb"> <tr> <td>num1</td> <td>num2</td> </tr> </table&

19、gt; Server.asp 后臺讀取數(shù)據(jù) <% Language="JavaScript" %> <% function OpenDB(sdbname) /* *- OpenDB(sdbname) - * OpenDB(sdbname) * 功能:翻開數(shù)據(jù)庫sdbname,返回conn對象. * 參數(shù):sdbname,字符串,數(shù)據(jù)庫名稱. * 實例:var conn = OpenDB("database.mdb"); * author:yoyo * update:2021-4-11 8:18 *- OpenDB(sdbname) -

20、*/ var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname); var conn = Server.CreateObject("ADODB.Connection"); conn.Open(connstr); return conn; var sResult = new Array(); var oConn = OpenDB("data.mdb"); /特殊字符:+,%,&,=,?等的傳輸解決方法.客戶端字符是經(jīng)

21、過escape編碼的 /所以效勞器端先要經(jīng)過unescape解碼. /Update:2021-4-11 12:22 var sql = "select num1,num2 from nums order by id" var rs = oConn.Execute(sql); while(!rs.EOF) /一條記錄用"#"隔開.每列數(shù)據(jù)用""隔開. 這是以只有兩個列數(shù)據(jù)的情況. sResultsResult.length = rs("num1").Value + "" + rs("nu

22、m2").Value rs.MoveNext(); /escape解決了XML 。中文處理的問題. Response.Write(escape(sResult.join("#"); %> 數(shù)據(jù)庫data.mdb 表 nums id,自動編號 num1,文本 num2,文本2.3 JsonJSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機(jī)器解析和生成。它基于JavaScriptStandard ECMA-262 3rd Edition - December 1999的一個子集。盡管有許多

23、宣傳關(guān)于 XML 如何擁有跨平臺,跨語言的優(yōu)勢,然而,除非應(yīng)用于 Web Services,否那么,在普通的 Web 應(yīng)用中,開發(fā)者經(jīng)常為 XML 的解析傷透了腦筋,無論是效勞器端生成或處理 XML,還是客戶端用 JavaScript 解析 XML,都常常導(dǎo)致復(fù)雜的代碼,極低的開發(fā)效率。實際上,對于大多數(shù) Web 應(yīng)用來說,他們根本不需要復(fù)雜的 XML 來傳輸數(shù)據(jù),XML 的擴(kuò)展性很少具有優(yōu)勢,許多 AJAX 應(yīng)用甚至直接返回 HTML 片段來構(gòu)建動態(tài) Web 頁面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系統(tǒng)的復(fù)雜性,但同時缺少了一定的靈活性。 JSON采用完全獨立于語言

24、的文本格式,但是也使用了類似于C語言家族的習(xí)慣包括C, C+, C#, Java, JavaScript, Perl, Python等。這些特性使JSON成為理想的數(shù)據(jù)交換語言。2.4 JqueryjQuery是一個快速的,簡潔的javaScript庫,使用戶能更方便地處理HTML documents、events、實現(xiàn)動畫效果,并且方便地為網(wǎng)站提供AJAX交互。jQuery還有一個比擬大的優(yōu)勢是,它的文檔說明很全,而且各種應(yīng)用也說得很詳細(xì),同時還有許多成熟的插件可供選擇。jQuery能夠使用戶的html頁保持代碼和html內(nèi)容別離,也就是說,不用再在html里面插入一堆js來調(diào)用命令了,只需

25、定義id即可。2.5 HibernateHibernate是一個開放源代碼的對象關(guān)系映射框架,它對JDBC進(jìn)行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數(shù)據(jù)庫。 Hibernate可以應(yīng)用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應(yīng)用中使用,最具革命意義的是,Hibernate可以在應(yīng)用EJB的J2EE架構(gòu)中取代CMP,完成數(shù)據(jù)持久化的重任。Hibernate的核心接口一共有5個,分別為:Session、SessionFactory、Transaction、Query和Configuration。這5個

26、核心接口在任何開發(fā)中都會用到。通過這些接口,不僅可以對持久化對象進(jìn)行存取,還能夠進(jìn)行事務(wù)控制。2.6 Css+divCSSDIV是網(wǎng)站標(biāo)準(zhǔn)或稱“WEB標(biāo)準(zhǔn)中常用的術(shù)語之一,通常為了說明與HTML網(wǎng)頁設(shè)計語言中的表格table定位方式的區(qū)別,因為XHTML網(wǎng)站設(shè)計標(biāo)準(zhǔn)中,不再使用表格定位技術(shù),而是采用css+div的方式實現(xiàn)各種定位。CSS是英語Cascading Style Sheets層疊樣式表單的縮寫,它是一種用來表現(xiàn) HTML 或 XML 等文件式樣的計算機(jī)語言。DIV元素是用來為HTML文檔內(nèi)大塊block-level的內(nèi)容提供結(jié)構(gòu)和背景的元素。DIV的起始標(biāo)簽和結(jié)束標(biāo)簽之間的所有內(nèi)容

27、都是用來構(gòu)成這個塊的,其中所包含元素的特性由DIV標(biāo)簽的屬性來控制,或者是通過使用樣式表格式化這個塊來進(jìn)行控制。3 系統(tǒng)開發(fā) 3.1 系統(tǒng)目標(biāo) 利用web通信技術(shù)以及java程序語言實現(xiàn)一個能夠文字聊天的一個聊天工具。具體目標(biāo)如下: 注冊,用戶可以按照規(guī)定注冊為會員。 登錄,用戶可以以會員身份登錄,只需登錄前注冊。 修改資料,可以修改個人的資料,保存讀取個人的資料。 添加好友,添加私人聊天對象。 刪除好友,刪除已添加的好友。 群聊天,假設(shè)干好友同時同一界面聊天。 二人私聊,二人無干擾即時聊天。 查詢聊天記錄。3.2 可行性分析 經(jīng)濟(jì)可行性開發(fā)該工程只需要一臺PC電腦,其他所需資源在學(xué)校圖書館或

28、者互聯(lián)網(wǎng)上都可以找到,其他本錢幾乎可以忽略不計,所以資金要求很低,在經(jīng)濟(jì)上開發(fā)難度不高,不需要很高的經(jīng)濟(jì)投資。 運行可行性一臺安裝了網(wǎng)卡并能運行windows XP操作系統(tǒng)的計算機(jī)都可以運行此聊天工具,在網(wǎng)絡(luò)技術(shù)如此興旺的今天,不管從硬件運行可行性上,還是從市場運行可行性上來說,一款優(yōu)秀的網(wǎng)頁聊天工具都是值得期待的。3.3 系統(tǒng)功能結(jié)構(gòu) 此系統(tǒng)分為2個子系統(tǒng):數(shù)據(jù)庫操作子系統(tǒng),業(yè)務(wù)邏輯子系統(tǒng)。數(shù)據(jù)庫操作子系統(tǒng)負(fù)責(zé)數(shù)據(jù)持久化,主要是一些數(shù)據(jù)庫的原子性操作,以面向?qū)ο蟮乃枷雭韺崿F(xiàn)。使用hibernate作為orm映射框架,利用java5的泛型新特性,實現(xiàn)dao的泛化,大大減少了開發(fā)量。業(yè)務(wù)邏輯子系

29、統(tǒng)主要負(fù)責(zé)登陸,注冊,信息交流等的業(yè)務(wù)邏輯操作和數(shù)據(jù)庫事務(wù)管理,通過調(diào)用數(shù)據(jù)庫操作子系統(tǒng)的dao程序?qū)崿F(xiàn)數(shù)據(jù)的持久化,結(jié)合使用spring的自動事務(wù)管理來管理事務(wù)。3.4 系統(tǒng)實施3.4.1 開發(fā)環(huán)境 1硬件要求 CPU以上,安裝了網(wǎng)卡,內(nèi)存128MB以上,硬盤20GB以上。2軟件要求 ,Apache效勞程序,Java編程語言。 數(shù)據(jù)庫設(shè)計根據(jù)系統(tǒng)分析,要實現(xiàn)數(shù)據(jù)庫操作子系統(tǒng)和業(yè)務(wù)邏輯子系統(tǒng)的功能,需要創(chuàng)立5個表,基于網(wǎng)頁的聊天工具所要求的數(shù)據(jù)庫不會很復(fù)雜,主要是強調(diào)他們之間的關(guān)聯(lián)性,能夠到達(dá)信息同步,實現(xiàn)完整性約束。這5個表分別是:user表,messagesmapping表,friends

30、request表,message表,friendsmapping表。user表如下列圖:圖4 User表User表是用來存放用戶個人信息的,id字段是主鍵,不代表任何實際個人信息,name是用戶名,password是登錄密碼。friendsmapping表如下列圖:圖5 friendsmapping表Friendsmapping表是用來存放好友關(guān)系的,userid和friendid聯(lián)合作為表的主鍵,一行數(shù)據(jù)確定兩個好友的關(guān)系。Idx是在Hibernate生成List屬性的時候用來確定順序的時候用的,沒有實際意義。friendsrequest表如下列圖:圖6 friendsrequest表Fri

31、endsrequest表是用來存放好友邀請的表,requestUser是發(fā)出邀請的用戶id。message表如下列圖:圖7 message表Message表是用來保存消息和聊天記錄的表,userFrom是消息發(fā)送者id,userTo是消息接受者的id,text是消息內(nèi)容,checked是標(biāo)志消息是否已經(jīng)被查收的字段。Messagesmapping表如下列圖:圖8 messagemapping表Messagesmapping表是用來確定消息和用戶關(guān)系的表,hibernate通過這張表來組裝user對象的消息集合。3.4.3 數(shù)據(jù)庫操作子系統(tǒng)在數(shù)據(jù)庫操作子系統(tǒng)中,分別設(shè)計了數(shù)據(jù)庫操作通用模塊Dao

32、Impl為抽象基類,信息持久化模塊MessageDaoImpl,用戶持久化模塊UserDaoImpl,而Dao,MessageDao,UserDao分別是以上三個子模塊的對應(yīng)接口。類圖如下:圖9 數(shù)據(jù)庫操作子系統(tǒng)類圖MessageDaoImpl和UserDaoImpl都是DaoImpl的子類。數(shù)據(jù)庫操作通用模塊DaoImpl的實現(xiàn)代碼如下:public class DaoImpl<T> implements Dao<T> protected SessionFactory sessionFactory;private Class<?> entityCls;pu

33、blic DaoImpl()entityCls = (Class<?>)(ParameterizedType)getClass().getGenericSuperclass().getActualTypeArguments()0;Overridepublic void setSessionFactory(SessionFactory sessionFactory) this.sessionFactory = sessionFactory;Overridepublic void delete(T entity) Session session = sessionFactory.get

34、CurrentSession();session.delete(entity);SuppressWarnings("unchecked")Overridepublic T findById(Serializable id) Session session = sessionFactory.getCurrentSession();return (T)session.get(entityCls, id);SuppressWarnings("unchecked")Overridepublic List<T> findList(int pageNo,

35、 int pageSize) Session session = sessionFactory.getCurrentSession();List<T> list = session.createCriteria(entityCls).setFirstResult(pageNo-1)*pageSize).setMaxResults(pageSize).list();return list;Overridepublic Integer getCountOfAll() Session session = sessionFactory.getCurrentSession();Integer

36、 count = (Integer)session.createCriteria(entityCls).setProjection(Projections.rowCount().uniqueResult();return count != null ? count : 0;Overridepublic void insert(T entity) Session session = sessionFactory.getCurrentSession();session.save(entity);Overridepublic String update(T entity) Session sessi

37、on = sessionFactory.getCurrentSession();session.update(entity);return "success"SuppressWarnings("unchecked")Overridepublic List<T> listAll() Session session = sessionFactory.getCurrentSession();List<T> list = session.createCriteria(entityCls).list();return list;Dao為Da

38、oImpl模塊的接口,以下為實現(xiàn)代碼public interface Dao<T> public void setSessionFactory(SessionFactory sessionFactory);public void insert(T entity);public void delete(T entity);public String update(T entity);public T findById(Serializable id);public List<T> listAll();public List<T> findList(int pa

39、geNo, int pageSize);public Integer getCountOfAll();信息持久化模塊MessageDaoImpl繼承了DaoImpl負(fù)責(zé)信息持久化操作MessageDaoImplpublic class MessageDaoImpl extends DaoImpl<Message> implements MessageDao MessageDao是信息持久化模塊MessageDaoImpl的接口package com.newbody.webmessager.core.dao;import com.newbody.webmessager.core.en

40、tity.Message;public interface MessageDao extends Dao<Message> 用戶持久化模塊UserDaoImplpublic class UserDaoImpl extends DaoImpl<User> implements UserDao Overridepublic User findByName(String name) String hql = "from User u where = ?"Session session = sessionFactory.getCurrentSe

41、ssion();Query query = session.createQuery(hql);query.setString(0, name);User user = (User)query.uniqueResult();return user;接口UserDaopublic interface UserDao extends Dao<User> User findByName(String name);3.4.4 業(yè)務(wù)邏輯子系統(tǒng)在業(yè)務(wù)邏輯子系統(tǒng)中設(shè)計了信息效勞類MessageServiceImpl和用戶業(yè)務(wù)類UserServiceImpl_DB,以及他們對應(yīng)的接口MessageS

42、ervice和UserService。類圖如下:圖10 業(yè)務(wù)邏輯子系統(tǒng)類圖信息效勞類MessageServiceImpl的實現(xiàn):public class MessageServiceImpl implements MessageService private UserService userService = UserServiceImpl_DB.getInstance();private final static String key = "key"private static MessageServiceImpl me = null;private SessionFac

43、tory sf = HibernateUtil.getSessionFactory();public static MessageServiceImpl getInstance() if (me = null) synchronized (key) if (me = null) me = new MessageServiceImpl();return me;private MessageServiceImpl() Overridepublic boolean checkMessage(String userName, String friendName) List<Message>

44、 msgList = userService.findByName(userName,true).getMessages();List<Message> msgs = new ArrayList<Message>();for (Message m : msgList) if (m.getUserFrom().getName().equals(friendName) msgs.add(m);if (msgs.size() != 0)return true;return false;Overridepublic JSON receiveMessage(String user

45、Name, String friendName) User user = userService.findByName(userName,true);List<Message> msgList = user.getMessages();List<Message> msgs = new ArrayList<Message>();if (msgList != null && msgList.size() != 0) int i = 0;for (i = 0;i < msgList.size();i+) if (msgList.get(i).

46、getUserFrom().getName().equals(friendName) msgs.add(msgList.get(i);msgList.get(i).setChecked(true);userService.update(user);JsonConfig jc = new JsonConfig();jc.setExcludes(new String "userFrom", "userTo" );JSON jsonMsg = JSONArray.fromObject(msgs, jc);return jsonMsg;return null;O

47、verridepublic void sendMessage(Message message) User userTo = userService.findByName(message.getUserTo().getName(), true);userTo.getMessages().add(message);userService.update(userTo);Overridepublic JSON checkAllMessage(String userName) List<Message> msgList = userService.findByName(userName,tr

48、ue).getMessages();Set<String> userNames = new HashSet<String>();for (Message m : msgList) if(!m.isChecked()userNames.add(m.getUserFrom().getName();return JSONArray.fromObject(userNames);public UserService getUserService() return userService;public void setUserService(UserService userServ

49、ice) this.userService = userService;public void setSessionFactory(SessionFactory sf)this.sf = sf ;Overridepublic List<Message> listChatRecords(String name) User user = userService.findByName(name, true);return user.getMessages();信息效勞類MessageServiceImpl的接口MessageService:public interface Message

50、Service void sendMessage(Message message);JSON receiveMessage(String userName,String friendName);boolean checkMessage(String userName, String friendName);JSON checkAllMessage(String name);void setUserService(UserService userService);void setSessionFactory(SessionFactory sf);List<Message> listC

51、hatRecords(String name);用戶操作類UserServiceImpl_DB的實現(xiàn):public class UserServiceImpl_DB implements UserService private static UserDao userDao;private static UserServiceImpl_DB me;private static SessionFactory sf = HibernateUtil.getSessionFactory();public static UserServiceImpl_DB getInstance() if (me = n

52、ull) synchronized (UserServiceImpl_DB.class) if (me = null) me = new UserServiceImpl_DB();userDao = new UserDaoImpl();userDao.setSessionFactory(sf);return me;private UserServiceImpl_DB() Overridepublic boolean addFriend(String userName, String friendName) User user = findByName(userName, true);User

53、friend = findByName(friendName, true);for (User f : user.getFriends() if (f.getName().equals(friend.getName()return false;user.getFriends().add(friend);friend.getFriendsRequest().add(user);update(user);update(friend);return true;Overridepublic List<User> checkFriendsRequest(String name) List&l

54、t;User> list = null;Session session = sf.getCurrentSession();List<User> frList = new ArrayList<User>();try session.beginTransaction();if (name != null) User user = userDao.findByName(name);if (user != null) list = user.getFriendsRequest();for (int i = 0; i < list.size(); i+) Hibernate.initialize(list.get(i);frList.add(list.remove(i);session.getTransaction() mit(); catch (Exception e) session.getTransaction().rollback();e

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論