支持全文檢索的郵件代理服務平臺-多郵箱管理及l(fā)ucene在郵件搜索上的應用_第1頁
已閱讀1頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  摘要1</b></p><p>  Abstract2</p><p><b>  第1章 引言3</b></p><p>  1.1 課題背景3</p><p>  

2、1.2 國內外研究現(xiàn)狀3</p><p>  1.3 課題的目的和意義4</p><p>  1.4 本章小結4</p><p>  第2章 相關技術及開發(fā)工具介紹5</p><p>  2.1 J2EE簡介5</p><p>  2.2 Lucene6</p><p>

3、  2.3 開發(fā)環(huán)境及工具7</p><p>  第3章 系統(tǒng)總體設計8</p><p>  3.1 總體設計框架8</p><p>  3.2 系統(tǒng)基本功能8</p><p>  3.3 數(shù)據(jù)庫設計11</p><p>  3.4 本章小結13</p><p>  第4

4、章 部分系統(tǒng)模塊詳細設計與實現(xiàn)14</p><p>  4.1 郵箱管理模塊14</p><p>  4.2 用戶管理模塊18</p><p>  4.3 JMS應用19</p><p>  4.4 本章小結22</p><p>  第5章 郵件檢索模塊詳細設計與實現(xiàn)23</p>

5、<p>  5.1 郵件的索引23</p><p>  5.2 郵件的搜索27</p><p>  5.3 搜索結果的高亮顯示30</p><p>  5.4 本章小結31</p><p>  第6章 總結與展望32</p><p>  6.1 系統(tǒng)總結32</p>&l

6、t;p>  6.2 系統(tǒng)實現(xiàn)部分效果圖32</p><p>  6.3 發(fā)展前景34</p><p><b>  謝辭35</b></p><p><b>  參考文獻36</b></p><p><b>  附 錄37</b></p><

7、;p>  支持全文檢索的郵件代理服務平臺—多郵箱管理及Lucene在郵件搜索上的應用</p><p>  摘要:本文闡述了設計與實現(xiàn)支持全文檢索的郵件代理服務平臺的理論基礎,設計思想,整體架構等。其中最主要的是應用了J2EE中的JavaMail、JMS、EJB3中的消息驅動Bean和Lucene。本文著重闡述了Lucene全文索引及檢索技術在該系統(tǒng)中的應用,包括索引的建立,索引的修改,搜索,對搜索結果的高

8、亮顯示等。</p><p>  關鍵字:J2EE;JavaMail;消息驅動Bean;Lucene;全文檢索</p><p>  Support Full-text Search Platform for E-mail Proxy Service</p><p>  ——Management of Multiple Mailboxes and Application

9、 of Lucene in Mail Search</p><p>  Abstract: This paper describes the design and implementation support for full-text indexing of e-mail proxy service platform based on the theory, design thinking, the overa

10、ll structure and so on. The most important is the use of J2EE in the JavaMail, JMS, EJB3 of Message-Driven Bean and Lucene.This article focuses on the Lucene full-text indexing and retrieval technology in the system, inc

11、luding the establishment of the index, index changes, and search on the highlighted search results display.</p><p>  Key words: J2EE; JavaMail; Message-Driven Bean; Lucene; Full-text Search</p><p&

12、gt;<b>  第1章 引言</b></p><p><b>  1.1 課題背景</b></p><p>  電子郵件是一種用電子手段提供信息交換的通信方式。是Internet應用最廣的服務:通過網(wǎng)絡的電子郵件系統(tǒng),用戶可以用非常低廉的價格,以非??焖俚姆绞剑c世界上任何一個角落的網(wǎng)絡用戶聯(lián)系,這些電子郵件可以是文字、圖像、聲音等各種方式

13、。同時,用戶可以得到大量免費的新聞、專題郵件,并實現(xiàn)輕松的信息搜索。這是任何傳統(tǒng)的方式也無法相比的。正是由于電子郵件的使用簡易、投遞迅速、收費低廉,易于保存、全球暢通無阻,使得電子郵件被廣泛地應用,它使人們的交流方式得到了極大的改變。另外,電子郵件還可以進行一對多的郵件傳遞,同一郵件可以一次發(fā)送給許多人。最重要的是,電子郵件是整個網(wǎng)間網(wǎng)以至所有其他網(wǎng)絡系統(tǒng)中直接面向人與人之間信息交流的系統(tǒng),它的數(shù)據(jù)發(fā)送方和接收方都是人,所以極大地滿足了

14、大量存在的人與人通信的需求。</p><p>  當今社會是信息化的社會,人們并不僅僅滿足于現(xiàn)有的電子郵件服務,由于移動辦公的需要,電子郵件服務由單純的客戶端收發(fā)郵件發(fā)展到了Web郵件,但電子郵件的發(fā)展還未就此停止,現(xiàn)在的人群當中存在一大批人是擁有不止一個電子郵箱的,他們對電子郵件服務又有了新的需求,此時電子郵件服務就必須滿足支持多個郵箱管理的功能。</p><p>  1.2 國內外研

15、究現(xiàn)狀</p><p>  電子郵件發(fā)展到現(xiàn)在,用戶使用電子郵件服務的方式有兩種:一種是用戶使用個人計算機上的客戶端軟件,比如Outlook,F(xiàn)oxmail等。Outlook是由美國微軟公司(Microsoft)出品的免費軟件,與Internet Explorer瀏覽器軟件捆綁發(fā)行;Foxmail是由國人張小龍編寫的一個功能強大非商業(yè)軟件,它實現(xiàn)了真正的多用戶、多賬戶、多POP3支持,自動進行撥號,能設置郵件過濾

16、功能,能閱讀和收發(fā)Big5碼的郵件,可以直接查看HTML格式郵件。這兩種客戶端軟件只要通過適當?shù)呐渲煤?,就可以對郵件進行接收和發(fā)送,但單純使用郵件客戶端程序進行郵件的收發(fā)已經(jīng)不能滿足用戶移動辦公的需要。另一種就是使用WebMail系統(tǒng),將E-mail和Web結合在一起,即通過Web編程和適當?shù)南到y(tǒng)設置,使用戶僅僅以訪問Web的方式就可以得到和使用完整的郵件服務的系統(tǒng)稱為WebMail系統(tǒng)。WebMail是目前Internet上最受歡迎和

17、使用最多的服務之一,也是很多網(wǎng)站必備功能之一。像網(wǎng)易、新浪等大型門戶網(wǎng)站都提供了免費的WebMail服務,并在其中加入了一些別的實用功能。如Google的GMail提供給郵</p><p>  1.3 課題的目的和意義</p><p>  本課題意在設計并實現(xiàn)一種支持全文檢索的郵件代理服務平臺,使用戶進一步感受到電子郵件服務給他們帶來的方便與快捷。雖然現(xiàn)有的郵件服務系統(tǒng)已經(jīng)比較完善,但對

18、于多個郵箱的支持還是比較少的,而且對多個郵箱中的文件進行統(tǒng)一管理的更少,因此有必要設計并實現(xiàn)一個支持多個郵箱收發(fā)郵件的系統(tǒng)。</p><p>  對于這種服務系統(tǒng),雖然現(xiàn)在在用戶中使用地比較少,而且專門提供類似服務的系統(tǒng)也不多。但隨著電子郵件的發(fā)展,相信在這方面的需求會越來越突出,而這種系統(tǒng)將會越來越得到用戶的青睞。</p><p><b>  1.4 本章小結</b&g

19、t;</p><p>  本章主要介紹了支持全文檢索的郵件代理服務平臺的研究背景、國內外的研究狀況及本課題的目的和意義。</p><p>  第2章 相關技術及開發(fā)工具介紹</p><p>  2.1 J2EE簡介</p><p>  J2EE是一種利用Java 2平臺來簡化企業(yè)解決方案的開發(fā)、部署和管理相關的復雜問題的體系結構。J2EE

20、技術的基礎就是核心Java平臺或Java 2平臺的標準版,J2EE不僅鞏固了標準版中的許多優(yōu)點,例如“編寫一次、隨處運行”的特性、方便存取數(shù)據(jù)庫的JDBC API、CORBA技術以及能夠在Internet應用中保護數(shù)據(jù)的安全模式等等,同時還提供了對EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)以及XML技術的全面支持。其最終目的就是成為一個能夠使企業(yè)開發(fā)

21、者大幅縮短投放市場時間的體系結構。</p><p>  J2EE體系結構提供中間層集成框架用來滿足無需太多費用而又需要高可用性、高可靠性以及可擴展性的應用的需求。通過提供統(tǒng)一的開發(fā)平臺,J2EE降低了開發(fā)多層應用的費用和復雜性,同時提供對現(xiàn)有應用程序集成強有力支持,完全支持Enterprise JavaBeans,有良好的向導支持打包和部署應用,添加目錄支持,增強了安全機制,提高了性能[13]。</p>

22、;<p>  2.1.1 JavaMail</p><p>  JavaMail,顧名思義,提供給開發(fā)者處理電子郵件相關的編程接口。它是Sun發(fā)布的用來處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。我們可以基于JavaMail開發(fā)出類似于Microsoft Outlook的應用程序。</p><p>  雖然JavaMail是Sun的API之一,但它目前還沒有

23、被加在標準的java開發(fā)工具包中(Java Development Kit),這就意味著你在使用前必須另外下載JavaMail文件。除此以外,你還需要有Sun的JavaBeans Activation Framework (JAF)。JavaBeans Activation Framework的運行很復雜,在這里簡單的說就是JavaMail的運行必須得依賴于它的支持。在Windows 2000下使用需要指定這些文件的路徑,在其它的操作系

24、統(tǒng)上也類似。</p><p>  2.1.2 JMS</p><p>  JMS(Java Message Service,Java消息服務)是一組Java應用接口,它提供創(chuàng)建、發(fā)送、接收、讀取消息的服務。JMS API定義了一組公共的應用程序接口和相應語法,使得Java應用能夠和各種消息中間件進行通信,這些消息中間件包括IBM MQ-Series、Microsoft MSMQ及純Jav

25、a的Sonic MQ。通過使用JMS API,開發(fā)人員無需掌握不同消息產(chǎn)品的使用方法,也可以使用統(tǒng)一的JMS API來操縱各種消息中間件。通過使用JMS,能夠最大限度地提升消息應用的可移植性。JMS既支持點對點的消息通信,也支持發(fā)布/訂閱式的消息通信。</p><p>  2.1.3 EJB3</p><p>  EJB是sun的服務器端組件模型,最大的用處是部署分布式應用程序,類似微軟

26、的com技術。憑借java跨平臺的優(yōu)勢,用EJB技術部署的分布式系統(tǒng)可以不限于特定的平臺。</p><p>  EJB(Enterprise Java Bean)是J2EE的一部分,定義了一個用于開發(fā)基于組件的企業(yè)多重應用程序的標準。其特點包括網(wǎng)絡服務支持和核心開發(fā)工具(SDK)。</p><p>  在J2EE里,Enterprise Java Beans(EJB)稱為Java企業(yè)Bea

27、n,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。</p><p>  Session Bean用于實現(xiàn)業(yè)務邏輯,它可以是有狀態(tài)的,也可以是無狀態(tài)的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端服務。Session Bean可以直接訪問數(shù)據(jù)庫,但更多時候,它會通過Ent

28、ity Bean實現(xiàn)數(shù)據(jù)訪問。</p><p>  Entity Bean是域模型對象,用于實現(xiàn)O/R映射,負責將數(shù)據(jù)庫中的表記錄映射為內存中的Entity對象,事實上,創(chuàng)建一個Entity Bean對象相當于新建一條記錄,刪除一個Entity Bean會同時從數(shù)據(jù)庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態(tài)和數(shù)據(jù)庫同步。</p><p> 

29、 MessageDriven Bean是EJB2.0中引入的新的企業(yè)Bean,它基于JMS消息,只能接收客戶端發(fā)送的JMS消息然后處理。MDB實際上是一個異步的無狀態(tài) Session Bean,客戶端調用MDB后無需等待,立刻返回,MDB將異步處理客戶請求。這適合于需要異步處理請求的場合,比如訂單處理,這樣就能避免客戶端長時間的等待一個方法調用直到返回結果。</p><p>  2.2 Lucene</p

30、><p>  Lucene是apache軟件基金會jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包,以方便的在目標系統(tǒng)中實現(xiàn)全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。</p>

31、<p>  Lucene作為一個全文檢索引擎,其具有如下突出的優(yōu)點:</p><p>  索引文件格式獨立于應用平臺。Lucene定義了一套以8位字節(jié)為基礎的索引文件格式,使得兼容系統(tǒng)或者不同平臺的應用能夠共享建立的索引文件。</p><p>  在傳統(tǒng)全文檢索引擎的倒排索引的基礎上,實現(xiàn)了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,達到

32、優(yōu)化的目的。</p><p>  優(yōu)秀的面向對象的系統(tǒng)架構,使得對于Lucene擴展的學習難度降低,方便擴充新功能。</p><p>  設計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創(chuàng)立,用戶擴展新的語言和文件格式,只需要實現(xiàn)文本分析的接口。</p><p>  已經(jīng)默認實現(xiàn)了一套強大的查詢引擎,用戶無需自己編寫代碼即使系統(tǒng)可獲

33、得強大的查詢能力,Lucene的查詢實現(xiàn)中默認實現(xiàn)了布爾操作、模糊查詢、分組查詢等等[9]。</p><p>  2.3 開發(fā)環(huán)境及工具</p><p>  開發(fā)環(huán)境:Windows XP SP2</p><p>  Java環(huán)境:JDK 6.0</p><p>  開發(fā)工具:MyEclipse 6.0</p><p&g

34、t;  部署環(huán)境:Sun Java System Application Server 9.1</p><p>  第3章 系統(tǒng)總體設計</p><p>  3.1 總體設計框架</p><p>  支持全文檢索的郵件代理服務平臺主要是利用J2EE和Lucene來架構,涉及到J2EE中的JSP、Servlet、JavaMail、JMS、EJB3中的消息驅動Bea

35、n,以及Lucene中的索引、搜索和高亮等。該系統(tǒng)的整體框架如圖3-1所示。</p><p>  圖3-1 支持全文檢索的郵件代理服務平臺整體框架</p><p>  3.2 系統(tǒng)基本功能</p><p>  支持全文檢索的郵件代理服務平臺主要是為滿足用戶有多個郵箱,并且需要對多個郵箱進行統(tǒng)一管理,包括接收各個郵箱中的郵件,通過各個不同的郵箱來發(fā)送郵件等,因此在該

36、系統(tǒng)中需要提供的功能有:</p><p>  接收多個郵箱中的郵件;</p><p>  通過不同的郵箱發(fā)送不同的郵件;</p><p><b>  添加不同的郵箱;</b></p><p>  可以對收件箱中的郵件進行全文檢索;</p><p>  對用戶密碼進行修改;</p>&

37、lt;p>  對已添加的郵箱進行修改。</p><p>  3.2.1 系統(tǒng)模塊結構圖</p><p>  根據(jù)系統(tǒng)所具有的基本功能得到該系統(tǒng)的功能模塊結構示意圖,如圖3-2所示。</p><p>  圖3-2 系統(tǒng)功能模塊結構示意圖</p><p>  3.2.2 各個模塊功能概述</p><p>  該系

38、統(tǒng)中包含的功能有:注冊、登錄、接收郵件、寫郵件、郵件管理(查看/刪除/回復)、已發(fā)郵件管理(查看/刪除/轉發(fā))、郵箱管理(添加/刪除/修改)、郵件的索引和郵件的搜索。各個功能模塊分別介紹如下:</p><p><b>  1.注冊</b></p><p>  注冊部分主要是為了使剛開始使用該系統(tǒng)的用戶能有自己唯一的一個賬戶,并能在注冊之后使用該系統(tǒng)。用戶所提供的密碼是

39、經(jīng)過DES加密后才存儲的。</p><p><b>  2.登錄</b></p><p>  登錄部分主要是為了驗證用戶所提供的用戶名和密碼的合法性,若合法的話,則提供給該用戶相應的可靠服務,否則做非法用戶處理,并且要求該用戶注冊或者是提示該用戶他所提供的用戶名和密碼是非法的,要求其重新登錄。</p><p><b>  3.接收郵件

40、</b></p><p>  接收郵件部分主要是為了幫用戶接收用戶所提供的郵箱中的郵件,這是一個后臺的服務程序,用戶自己是感覺不到什么時候接收到郵件的,但后臺程序會定時地為每一個用戶提供郵件接收的服務。并且每個郵箱中的郵件是不會被重復接收的。</p><p><b>  4.發(fā)送郵件</b></p><p>  發(fā)送郵件部分是給用戶

41、提供發(fā)送新郵件之用,這里可以支持不同的郵箱發(fā)送郵件,就是說雖然用戶是在同一個地方寫新郵件、發(fā)送郵件,但是該系統(tǒng)可以根據(jù)用戶所提供的不同的發(fā)件人,讓用戶用他自己的不同郵箱來發(fā)送信件,而接收信件的人則看到的也是不同的發(fā)件人。</p><p>  5.郵件管理(查看/刪除/回復)</p><p>  郵件管理部分主要是提供用戶查看郵件、刪除郵件和回復郵件的功能。當用戶接收到新郵件時,收到的新郵件

42、都會重點提示用戶這是一封新郵件,讓用戶很快就能看到是否有新的郵件。當有郵件時,用戶可以查看郵件。查看的時候,如果用戶想回復該郵件,則點擊“回復”,系統(tǒng)就自動產(chǎn)生一封新的郵件,用戶只需寫好信的內容即可發(fā)送。當然,如果用戶認為收件箱中的郵件已經(jīng)沒有利用價值,就可以刪除郵件。</p><p>  6.已發(fā)郵件管理(查看/刪除/轉發(fā))</p><p>  已發(fā)郵件管理部分主要是為了用戶方便管理已經(jīng)

43、發(fā)送的郵件和未發(fā)送成功的郵件。凡是用戶發(fā)送過的郵件,不管是否發(fā)送成功,用戶都可以在已發(fā)郵件中找到該郵件,并且可以刪除和轉發(fā)。</p><p>  7.郵箱管理(添加/刪除/修改)</p><p>  郵箱管理部分主要是讓用戶可以添加自己已有的所有郵箱,之后該系統(tǒng)可以幫用戶在后臺接收這些郵箱中的所有郵件,這是為了方便用戶統(tǒng)一管理自己的所有郵箱。在這里,用戶可以隨意添加、刪除和修改自己的郵箱。

44、</p><p><b>  8.郵件的索引</b></p><p>  郵件的索引主要是為郵件的搜索做準備,只要系統(tǒng)在后臺接收到新郵件,系統(tǒng)就會自動的為該郵件建立索引,方便用戶以后對該郵件的搜索。這是由Lucene來實現(xiàn)的,這與直接對數(shù)據(jù)庫進行搜索相比較,效率比較高,而且功能也比較強,易于在以后擴展。</p><p><b>  9

45、.郵件的搜索</b></p><p>  郵件的搜索主要是提供給用戶查找自己的相關郵件之用,這是通過之前建立的郵件全文索引來實現(xiàn)的,應用Lucene中提供的搜索功能構建自己的搜索器,將搜索的結果返回給用戶,并高亮顯示一些關鍵字,能使用戶很準確的找到自己想要的郵件。</p><p>  3.3 數(shù)據(jù)庫設計</p><p>  支持全文檢索的郵件代理服務平

46、臺中存在有四種不同用處的表,包括用戶表,已收郵件表,已發(fā)郵件表,郵箱表。</p><p>  3.3.1 用戶表</p><p>  用戶表是用來存放已注冊的用戶名和密碼,因此該表只有2個字段,包括用戶名和密碼。用戶實體E-R圖如圖3-3所示,用戶表的具體各字段設計如表3-1所示。</p><p>  圖3-3 用戶實體E-R圖</p><p&

47、gt;<b>  表3-1 用戶表</b></p><p>  3.3.2 已收郵件表</p><p>  已收郵件表是用來存放該用戶所有郵箱中的郵件,該表中有8個字段,包括序列sid、郵件的ID、發(fā)件人mailfrom、收件人mailto、郵件主題subject、郵件內容content、時間time和狀態(tài)state。已收郵件實體E-R圖如圖3-4所示,已收郵件表的

48、具體各字段設計如表3-2所示。</p><p>  圖3-4 已收郵件實體E-R圖</p><p>  表3-2 已收郵件表</p><p>  3.3.3 已發(fā)郵件表</p><p>  已發(fā)郵件表是用來存放該用戶已經(jīng)發(fā)送過的郵件,該表中有8個字段,包括序列sid、郵件的ID、發(fā)件人mailfrom、收件人mailto、郵件主題subje

49、ct、郵件內容content、時間time和狀態(tài)state。該表與收件箱表的設計相同,已發(fā)郵件實體E-R圖如圖3-5所示,已發(fā)郵件表的具體各字段設計如表3-3所示。</p><p>  圖3-5 已發(fā)郵件實體E-R圖</p><p>  表3-3 已發(fā)郵件表</p><p>  3.3.4 郵箱表</p><p>  郵箱表是用來存放該用戶

50、所添加的所有郵箱,該表中有3個字段,包括序列id、郵箱名email和密碼password。郵箱實體E-R圖如圖3-6所示,郵箱表的具體各字段設計如表3-4所示。</p><p>  圖3-6 郵箱實體E-R圖</p><p><b>  表3-4 郵箱表</b></p><p><b>  3.4 本章小結</b><

51、;/p><p>  本章主要介紹了支持全文檢索的郵件代理服務平臺的總體設計框架、系統(tǒng)基本功能模塊、數(shù)據(jù)庫的設計,讓讀者對該系統(tǒng)有一個總體的認識。下一章將具體闡述郵箱管理、用戶管理及JMS應用的詳細設計和實現(xiàn)。</p><p>  第4章 部分系統(tǒng)模塊詳細設計與實現(xiàn)</p><p>  在支持全文檢索的郵件代理服務平臺中一共有六個模塊,如圖3-2所示,分別為注冊登錄、郵

52、件管理、寫郵件、郵箱管理、用戶管理和郵件檢索。由于該系統(tǒng)是由兩人合作完成,因此在本章將詳細介紹該系統(tǒng)的郵箱管理和用戶管理模塊。</p><p>  4.1 郵箱管理模塊</p><p>  在郵箱管理模塊中,包括添加郵箱、修改郵箱和刪除郵箱,其給用戶所提供的功能為:用戶可以添加其所有郵箱到該系統(tǒng)中,系統(tǒng)在后臺負責管理其已添加的所有郵箱。但有一點用戶應該注意的:在添加郵箱的時候,用戶應該提

53、供其正確的郵箱用戶名和密碼,確保系統(tǒng)能真正管理該郵箱。因為系統(tǒng)不會去檢查該郵箱的合法性。當然用戶還可以修改其之前所添加的郵箱,以防用戶輸入錯誤。如該郵箱對用戶來說已經(jīng)沒有使用價值的話,該郵箱可以被刪除。</p><p>  4.1.1 添加郵箱</p><p>  在該模塊中的添加郵箱部分,系統(tǒng)只是比較簡單的將用戶所提供的用戶名和密碼存入了系統(tǒng)的數(shù)據(jù)庫中。若用戶提供的郵箱用戶名和密碼有誤

54、的話,系統(tǒng)將接收不到該郵箱中的郵件,自然不能為用戶起到管理郵箱的作用。</p><p>  在用戶添加郵箱的時候,為了能讓用戶能及時的看到他那個郵箱中的郵件,在添加郵箱成功的時候,程序會開一個接收郵件的線程,讓這個線程去接收這個郵箱中的郵件。這樣在后臺開啟一個線程,畢業(yè)設計論文代做平臺 《580畢業(yè)設計網(wǎng)》 是專業(yè)代做團隊 也有大量畢業(yè)設計成品提供參考 www.bysj580.com QQ34496499

55、74</p><p>  用戶也不能覺察到接收郵件的過程,但后臺程序確實已經(jīng)開始接收郵件的工作了。只要過一定時間,用戶就可以在他的收件箱中看到已經(jīng)收到的郵件。</p><p>  該模塊中添加郵箱部分的具體實現(xiàn):</p><p>  用request類中的getParameter()方法得到用戶在setupMailBox.jsp頁面中所提交的郵箱名和密碼;</

56、p><p>  用DES加密算法對用戶提交的密碼進行加密處理;</p><p>  根據(jù)以上得到的郵箱名和密碼,實例化一個郵箱類;</p><p>  通過JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個數(shù)據(jù)庫的連接;</p><p>  將實例化的一個郵箱類,通過MailBoxDAOJdbc類來存入數(shù)據(jù)庫;</p><

57、p>  存入數(shù)據(jù)庫成功的話就開啟一個接收郵件的一個線程,來接收剛添加的郵箱中的郵件。否則,頁面跳轉回添加郵箱的頁面setupMailBox.jsp。</p><p>  在該模塊的實現(xiàn)中,添加郵箱部分用到了JDBC、Servlet和JSP技術。實現(xiàn)的流程圖如圖4-1所示。</p><p>  圖4-1 添加郵箱部分流程圖</p><p><b>  

58、部分代碼簡析:</b></p><p>  //通過request類的getParameter()方法得到郵箱名和密碼</p><p>  String email=request.getParameter("email").toString();</p><p>  String mailServerName=request.get

59、Parameter("mailServerName").toString();</p><p>  String emailpwd= request.getParameter("emailpwd").toString();</p><p><b>  //DES加密</b></p><p>  Strin

60、g emailpwd=DES.encrypt(request.getParameter("emailpwd").toString());</p><p>  //實例化一個郵箱類</p><p>  MailBox mb=new MailBox();</p><p>  mb.setEmail(email+mailServerName);//設置

61、郵箱名</p><p>  mb.setPassword(emailpwd);//設置密碼</p><p>  //通過JNDI查找數(shù)據(jù)源</p><p>  Context initContext;</p><p>  initContext = new InitialContext();</p><p>  Dat

62、aSource ds = (DataSource) initContext.lookup("jdbc/oracleds");</p><p>  //將郵箱類存入數(shù)據(jù)庫</p><p>  String insertSql = "insert into " + currentUser</p><p>  + "mai

63、lbox(id,email,password) values(" + currentUser+ "_seq.nextval,?,?)";</p><p>  PreparedStatement pstmt;</p><p>  pstmt = conn.prepareStatement(insertSql);</p><p>  pst

64、mt.setString(1, mb.getEmail());</p><p>  pstmt.setString(2, mb.getPassword());</p><p>  pstmt.execute();</p><p>  pstmt.close();</p><p>  4.1.2 修改郵箱</p><p&g

65、t;  在該模塊的修改郵箱部分,系統(tǒng)也只是簡單的將數(shù)據(jù)庫中原有的密碼更新為用戶新提交的密碼,并不會去檢查別的,因此該功能的實現(xiàn)比較簡單。</p><p>  該模塊中修改郵箱部分的具體實現(xiàn):</p><p>  用request類中的getParameter()方法得到用戶在modifyMailBox.jsp頁面中所提交的郵箱名和密碼;</p><p>  用DES

66、加密算法對用戶提交的密碼進行加密處理;</p><p>  根據(jù)以上得到的郵箱名和密碼,實例化一個郵箱類;</p><p>  通過JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個數(shù)據(jù)庫的連接;</p><p>  將實例化的一個郵箱類,通過MailBoxDAOJdbc類中的updateMailBox方法來更新數(shù)據(jù)庫中的密碼。</p><p

67、>  修改郵箱部分的流程圖如圖4-2所示。</p><p>  圖4-2 修改郵箱部分流程圖</p><p><b>  部分代碼簡析:</b></p><p>  由于在添加郵箱部分已經(jīng)分析過部分相同的代碼,在這里只簡析不同的代碼片段。</p><p>  //根據(jù)郵箱名來更新郵箱密碼</p>&l

68、t;p>  String updateSql = "update " + currentUser + "mailbox set password='"+ password + "' where id=" + id;</p><p>  PreparedStatement pstmt;</p><p>  ps

69、tmt = conn.prepareStatement(updateSql);</p><p>  pstmt.execute();</p><p>  pstmt.close();</p><p>  4.1.3 刪除郵箱</p><p>  在該模塊的刪除郵箱部分,系統(tǒng)根據(jù)郵箱在數(shù)據(jù)庫中存儲的id來刪除郵箱在數(shù)據(jù)庫中的記錄,因此該功能的

70、實現(xiàn)也比較簡單。</p><p>  該模塊中修改郵箱部分的具體實現(xiàn):</p><p>  用request類中的getParameter()方法得到用戶在modifyMailBox.jsp頁面中得到郵箱在數(shù)據(jù)庫中的id;</p><p>  通過JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個數(shù)據(jù)庫的連接;</p><p>  將實例

71、化的一個郵箱類,通過MailBoxDAOJdbc類中的deleteMailBox方法來刪除數(shù)據(jù)庫中的郵箱。</p><p>  修改郵箱部分的流程圖如圖4-3所示。</p><p>  圖4-3 刪除郵箱部分流程圖</p><p><b>  部分代碼簡析:</b></p><p>  由于在添加郵箱部分已經(jīng)分析過部分相

72、同的代碼,在這里只簡析不同的代碼片段。</p><p>  //根據(jù)郵箱ID來刪除郵箱</p><p>  String deleteSql = "delete from " + currentUser + "mailbox where id="+ id;</p><p>  PreparedStatement pstmt;&

73、lt;/p><p>  pstmt = conn.prepareStatement(deleteSql);</p><p>  pstmt.execute();</p><p>  pstmt.close();</p><p>  4.2 用戶管理模塊</p><p>  在用戶管理模塊中,只包括用戶密碼的修改部分,其給

74、用戶所提供的功能為:用戶可以為自己在該系統(tǒng)中的當前用戶修改密碼,這只是為了某些用戶要修改密碼的需要。</p><p>  該模塊中用戶密碼修改部分的具體實現(xiàn):</p><p>  用request類中的getParameter()方法得到用戶在modifyUserpwd.jsp頁面中得到用戶輸入的先前密碼和新的密碼;</p><p>  根據(jù)當前用戶,從數(shù)據(jù)庫中讀取

75、先前的密碼,與用戶輸入的當前密碼比對,看是否相同;</p><p>  如果相同的話,則實例化一個用戶類,將數(shù)據(jù)庫中的密碼更新為用戶輸入的新密碼,若不相同的話,修改密碼失敗。</p><p>  用戶密碼修改部分的流程圖如圖4-4所示。</p><p>  圖4-4 用戶密碼修改部分流程圖</p><p><b>  部分代碼簡析:

76、</b></p><p>  //更新數(shù)據(jù)庫中的用戶密碼</p><p>  public static final String UPDATE_USER_SQL = "update users set password=? where username=?";</p><p>  PreparedStatement pstmt =

77、conn.prepareStatement(UPDATE_USER_SQL);</p><p>  pstmt.setString(1, u.getPassword());</p><p>  pstmt.settring(2, u.getUsername());</p><p>  pstmt.executeUpdate();</p><p&g

78、t;  pstmt.close();</p><p>  4.3 JMS應用</p><p>  在本系統(tǒng)中,為了提高系統(tǒng)后臺的工作效率,采用了消息中間件,實現(xiàn)異步的消息傳遞。</p><p>  這對于本系統(tǒng)的穩(wěn)定性是很關鍵的。由于本系統(tǒng)在后臺要不斷地幫用戶處理業(yè)務,包括郵件的接受和郵件的索引,而就這兩部分,在系統(tǒng)中就有可能隨著時間的推移而業(yè)務不斷地加重。因為有

79、可能使用該系統(tǒng)的用戶會越來越多,這樣的話接收郵件和索引郵件的工作量就會越來越重。如果采用同步機制,則嚴重影響系統(tǒng)的運行效率,用戶體驗也會越來越差,最終本系統(tǒng)就選擇使用JMS的異步消息處理來解決此問題。</p><p>  4.3.1 JMS消息模型</p><p>  在JMS中,提供了兩種模型:一種是點對點模型,另一種是發(fā)布/訂閱模型。</p><p>  點對

80、點模型是與消息隊列一起工作的。它們是點對點的,是因為客戶端將消息發(fā)送到一個隊列,而另一個客戶端將從這個隊列中接收消息。點對點模型示意圖如圖4-5所示。</p><p>  圖4-5 點對點模型示意圖</p><p>  發(fā)布/訂閱模型是發(fā)送方針對一個主題發(fā)送消息,多個接收方可以訂閱他們的主題。一個主題消息只能被傳遞給訂閱該主題的接收方,同時一個接收方只能接收他所訂閱的主題中的消息。發(fā)布/訂

81、閱模型示意圖如圖4-6所示。</p><p>  圖4-6 發(fā)布/訂閱模型示意圖</p><p>  4.3.2 消息模型的選擇</p><p>  根據(jù)本系統(tǒng)的特點,我們選擇了點對點的消息模型,這是出于容易構建本系統(tǒng)的基礎上的。</p><p>  4.3.3 點對點模型在系統(tǒng)中的應用</p><p>  確定選

82、擇點對點模型之后,開始構建本系統(tǒng)中特有的點對點模型。在本系統(tǒng)中,消息的生產(chǎn)者是接收郵件的線程,接收郵件的線程一接收完一封郵件就馬上向消息隊列中發(fā)送一條消息。而本系統(tǒng)中的消息隊列是通過Sun Java System Application Server這個應用服務器提供的,只要對服務器中的某些設置項進行適當?shù)呐渲眉纯僧a(chǎn)生一個消息隊列。消息的消費者是消息驅動Bean,這是EJB3里提供的。只要消息隊列中一有消息,EJB容器就會自動讓消息驅動

83、Bean去處理消息。在本系統(tǒng)中實現(xiàn)的點對點消息模型示意圖如圖4-7所示。</p><p>  圖4-7 系統(tǒng)實現(xiàn)點對點模型示意圖</p><p>  由于接收郵件是多線程的,因此消息驅動Bean的處理也是多線程的,這樣大大地提高了本系統(tǒng)的性能。但這樣也給系統(tǒng)帶來了其他問題,如線程之間的同步問題,這下一章講到郵件索引的時候會給出解決方案。</p><p>  4.3.

84、4 消息驅動Bean的實現(xiàn)</p><p>  本系統(tǒng)中,消息驅動Bean(MDB)是一個很重的部分。MDB負責將郵件存入數(shù)據(jù)庫并索引郵件。</p><p><b>  1.具體實現(xiàn)</b></p><p>  當消息到達時,判斷是不是欲接收的消息,若是的話,就下一步,否則就不接收;</p><p>  將消息轉換為本

85、地的一般郵件對象,將郵件對象存入數(shù)據(jù)庫;</p><p>  若成功存入數(shù)據(jù)庫,則索引這郵件對象,否則就不索引。</p><p><b>  2.核心代碼:</b></p><p>  public void onMessage(Message message) {</p><p>  ObjectMessage oms

86、g = null;</p><p>  JMSMessage jmsg = null;</p><p><b>  try {</b></p><p>  if (message instanceof ObjectMessage) {</p><p>  omsg = (ObjectMessage) message;&l

87、t;/p><p>  jmsg = (JMSMessage)omsg.getObject();//轉化為本地對象</p><p>  String username=jmsg.getUsername();</p><p>  String currentUser = username.substring(username.lastIndexOf("/"

88、;)+1, </p><p>  username.length());</p><p>  MailMessage msg=jmsg.getMsg();//獲取郵件對象</p><p>  MsgSaveToDB mstdb=new MsgSaveToDB();</p><p>  boolean falg=false;</p>

89、<p>  falg=mstdb.saveMessage(currentUser, msg);//保存郵件</p><p><b>  if(falg){</b></p><p>  IndexUtil.addIndex(jmsg);//索引郵件</p><p><b>  }</b></p>

90、<p><b>  }</b></p><p>  } catch (Exception e) {</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p>&l

91、t;p><b>  4.4 本章小結</b></p><p>  本章詳細地介紹了支持全文檢索的郵件代理服務平臺中的兩個模塊:郵箱管理和用戶管理。這兩個模塊主要是側重數(shù)據(jù)庫的插入、刪除和更新,使用戶比較方便的管理其所有郵箱和其賬號密碼。下一章將重點介紹在該系統(tǒng)中郵件檢索模塊的詳細設計與實現(xiàn)。</p><p>  第5章 郵件檢索模塊詳細設計與實現(xiàn)</p

92、><p>  在支持全文檢索的郵件代理服務平臺中,郵件檢索模塊主要包括兩部分:1.郵件的索引;2.郵件的搜索。本章將具體介紹Lucene各方面的原理及在該系統(tǒng)中的應用,包括對每一封郵件建立索引的過程、對郵件的搜索過程和對搜索結果的高亮顯示。</p><p>  5.1 郵件的索引</p><p>  在該系統(tǒng)中的郵件索引是應用Lucene來實現(xiàn)的。</p>

93、<p>  5.1.1 Lucene索引介紹</p><p>  Lucene是一個高性能的java全文檢索工具包,它使用的是倒排文件索引結構。從實現(xiàn)方式上來看,倒排索引是典型的為滿足實際應用需要而設計的一種數(shù)據(jù)結構。這種數(shù)據(jù)結構中的每一個元素是一個索引項,每一個索引項是由關鍵字屬性值和關鍵字關聯(lián)記錄,或者記錄的存放地址組成。這種結構的最大特點是改變了以往的檢索過程。通常的查找方法是先確定文檔,然

94、后在文檔中順序查找后續(xù)的文檔。倒排索引則是利用索引關鍵字直接確定文檔列表,最后才確定希望找到的文檔列表[2]。</p><p>  Lucene索引結構圖如圖5-1所示:</p><p>  圖5-1 Lucene索引結構圖</p><p>  在Lucene中,索引文件的存儲還分兩種結構:一種是多文件索引結構,另一種是復合索引結構。</p><

95、p>  多文件索引是使用一系列索引文件分別存儲索引,分散管理數(shù)據(jù)的索引存儲格式。多文件索引在打開時需要讀取大量文件,會大大占用系統(tǒng)的文件句柄等資源,造成系統(tǒng)響應速度慢,甚至系統(tǒng)崩潰[2]。因此,在本系統(tǒng)中,我們采用復合索引結構。</p><p>  復合索引是把索引相關的一系列數(shù)據(jù)結構組織到少數(shù)幾個文件中進行管理的索引存儲模式。復合索引把所有的索引數(shù)據(jù)被組合成簡單的3個文件,大大減少了打開大量文件的壓力。但

96、是使用統(tǒng)一文件存儲大量數(shù)據(jù)會造成數(shù)據(jù)更新的問題,每次更改需要操作一個大的數(shù)據(jù)文件,讀取和存儲都會比較慢。對本系統(tǒng)來說,因為數(shù)據(jù)量不是很大,所以并不會產(chǎn)生大的數(shù)據(jù)文件。因此,選擇以這種結構來存儲郵件的索引文件是一種比較好的解決方案。</p><p>  5.1.2 Lucene中的分詞</p><p>  對于分詞,在Lucene這個全文檢索工具包中,是一個非常重要的。因為如果要對一篇文章

97、建立全文索引,就必須先對這篇文章進行文本分析,對文章要進行有意義的分詞。這就必須要用到分詞器。</p><p>  由于Lucene不是本國人開發(fā)的全文檢索工具包,因此Lucene中自帶的分詞器對于中文分詞的支持不是很好。Lucene包中有兩個支持中文的分詞器:一個是ChineseAnalyzer,另一個是CJKAnalyzer。但是ChineseAnalyzer這個分詞器只是單字切分,而CJKAnalyzer分

98、詞器則是一個二分法的分詞器。因此,總的來說,Lucene自帶包中的分詞器對中文分詞的支持都不是很好。</p><p>  國內有一個比較出名的中文分詞器,是中科院計算所開發(fā)的ICTCLAS。但由于這個分詞器是用C++開發(fā)的,因此如果在Java應用程序中使用的話,容易出現(xiàn)不穩(wěn)定的現(xiàn)象。畢業(yè)設計論文代做平臺 《580畢業(yè)設計網(wǎng)》 是專業(yè)代做團隊 也有大量畢業(yè)設計成品提供參考 www.bysj580.com Q

99、Q3449649974</p><p>  最后,在我們這個系統(tǒng)中選擇一個第三方提供的分詞器——JE分詞器。這個分詞器是基于詞庫的,所以分詞的效果相對其余分詞器的分詞效果要好。</p><p>  各種分詞器分詞效果比較:</p><p>  對“我愛我偉大的老爸老媽,我愛我壯麗的中華!”這句話進行分詞。</p><p>  ChineseA

100、nalyzer分詞結果:</p><p>  我 | 愛 | 我 | 偉 | 大 | 的 | 老 | 爸 | 老 | 媽 | 我 | 愛 | 我 | 壯 | 麗 | 的 | 中 | 華</p><p>  CJKAnalyzer分詞結果:</p><p>  我愛 | 愛我 | 我偉 | 偉大 | 大的 | 的老 | 老爸 | 爸老 | 老媽 | 我愛 | 愛我 |

101、 我壯 | 壯麗 | 麗的 | 的中 | 中華</p><p>  JE分詞器分詞結果:</p><p>  我 | 愛我 | 偉大 | 老爸 | 老媽 | 我 | 愛我 | 壯麗 | 中華</p><p>  5.1.3 建立郵件索引</p><p>  了解Lucene建立索引過程的原理之后,我們要對本系統(tǒng)進行定制郵件索引器。</

102、p><p>  在本系統(tǒng)中的一封郵件包括6個部分,分別是郵件ID、收件人、發(fā)件人、郵件主題、郵件內容和發(fā)信時間。</p><p><b>  郵件索引的需求</b></p><p>  在本系統(tǒng)中,要求建立的郵件索引必須能夠支持用戶對郵件的收件人、發(fā)件人、郵件主題、郵件內容和發(fā)信時間進行搜索。因此在一封郵件中,除了郵件ID不被搜索到,郵件的其余部分

103、都要能被搜索到。但是郵件ID有其特殊的功能,所以在本系統(tǒng)中,每一封郵件的各個部分都建立相關的索引。</p><p><b>  建立索引的具體實現(xiàn)</b></p><p>  判斷要存放索引的路徑是否被鎖定,若沒被鎖定,就下一步,否則就等待該鎖定的路徑被解鎖;</p><p>  用路徑名和JE分詞器生成一個IndexWriter對象;<

104、/p><p>  生成一個Document對象;</p><p>  生成一個郵件ID的索引域,并加入到Document對象中;</p><p>  生成一個收件人的索引域,并加入到Document對象中;</p><p>  生成一個發(fā)件人的索引域,并加入到Document對象中;</p><p>  生成一個郵件主題的

105、索引域,并加入到Document對象中;</p><p>  生成一個郵件內容的索引域,并加入到Document對象中;</p><p>  生成一個發(fā)信時間的索引域,并加入到Document對象中;</p><p>  將Document對象添加到IndexWriter對象中;</p><p>  IndexWriter對象進行索引優(yōu)化操作

106、;</p><p>  關閉IndexWriter。</p><p>  建立郵件索引核心代碼:</p><p>  public static boolean addIndex(String path,MailMessage msg){</p><p>  String indexPath=path;</p><p>

107、;<b>  try {</b></p><p>  while(IndexReader.isLocked(indexPath)){;}</p><p>  IndexWriter writer = new IndexWriter(indexPath,new MMAnalyzer());</p><p>  Document doc=new D

108、ocument();</p><p>  Field field=new Field("id",msg.getId(),</p><p>  Field.Store.YES,Field.Index.UN_TOKENIZED);</p><p>  doc.add(field);</p><p>  field=new Fi

109、eld("from",msg.getMailfrom(),</p><p>  Field.Store.YES,Field.Index.TOKENIZED);</p><p>  doc.add(field);</p><p>  field=new Field("to",msg.getMailto(),</p>

110、<p>  Field.Store.YES,Field.Index.TOKENIZED);</p><p>  doc.add(field);</p><p>  field=new Field("subject",msg.getSubject(),</p><p>  Field.Store.YES,Field.Index.TOKE

111、NIZED);</p><p>  doc.add(field);</p><p>  field=new Field("content",StringUtil.removeHtml(msg.getContent()),</p><p>  Field.Store.YES,Field.Index.TOKENIZED);</p>&l

112、t;p>  doc.add(field);</p><p>  field=new Field("time",msg.getTime(),</p><p>  Field.Store.YES,Field.Index.TOKENIZED);</p><p>  doc.add(field);</p><p>  wri

113、ter.addDocument(doc);</p><p>  writer.optimize();</p><p>  writer.close();</p><p>  } catch (IOException e) {</p><p>  e.printStackTrace();</p><p>  return

114、 false;</p><p>  } catch (Exception e) {</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p>  return true;</p><p><b>  }</b><

115、;/p><p>  郵件建立索引過程中的三處細節(jié)</p><p>  由于郵件建立索引是采用多線程實現(xiàn)的,就是在同一時刻有可能存在多個索引程序在運行。如果有一個程序在為郵件建立索引的時候,則另一個索引程序要等待其完成才能開始為郵件建立索引,否則將產(chǎn)生寫沖突。即while(IndexReader.isLocked(indexPath)){;};這行代碼是至關重要的。</p><

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論