




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、目 錄 TOC o 1-2 h z u HYPERLINK l _Toc231618672 摘要 PAGEREF _Toc231618672 h 1 HYPERLINK l _Toc231618674 Abstract PAGEREF _Toc231618674 h 2 HYPERLINK l _Toc231618676 第1章 引言 PAGEREF _Toc231618676 h 3 HYPERLINK l _Toc231618677 1.1 課題背景 PAGEREF _Toc231618677 h 3 HYPERLINK l _Toc231618678 1.2 國內外研究現狀 PAGERE
2、F _Toc231618678 h 3 HYPERLINK l _Toc231618679 1.3 課題的目的和意義 PAGEREF _Toc231618679 h 4 HYPERLINK l _Toc231618680 1.4 本章小結 PAGEREF _Toc231618680 h 4 HYPERLINK l _Toc231618681 第2章 相關技術及開發工具介紹 PAGEREF _Toc231618681 h 5 HYPERLINK l _Toc231618682 2.1 J2EE簡介 PAGEREF _Toc231618682 h 5 HYPERLINK l _Toc2316186
3、83 2.2 Lucene PAGEREF _Toc231618683 h 6 HYPERLINK l _Toc231618684 2.3 開發環境及工具 PAGEREF _Toc231618684 h 7 HYPERLINK l _Toc231618685 第3章 系統總體設計 PAGEREF _Toc231618685 h 8 HYPERLINK l _Toc231618686 3.1 總體設計框架 PAGEREF _Toc231618686 h 8 HYPERLINK l _Toc231618687 3.2 系統根本功能 PAGEREF _Toc231618687 h 8 HYPERLI
4、NK l _Toc231618688 3.3 數據庫設計 PAGEREF _Toc231618688 h 11 HYPERLINK l _Toc231618689 3.4 本章小結 PAGEREF _Toc231618689 h 13 HYPERLINK l _Toc231618690 第4章 局部系統模塊詳細設計與實現 PAGEREF _Toc231618690 h 14 HYPERLINK l _Toc231618691 4.1 郵箱管理模塊 PAGEREF _Toc231618691 h 14 HYPERLINK l _Toc231618692 4.2 用戶管理模塊 PAGEREF _T
5、oc231618692 h 18 HYPERLINK l _Toc231618693 4.3 JMS應用 PAGEREF _Toc231618693 h 19 HYPERLINK l _Toc231618694 4.4 本章小結 PAGEREF _Toc231618694 h 22 HYPERLINK l _Toc231618695 第5章 郵件檢索模塊詳細設計與實現 PAGEREF _Toc231618695 h 23 HYPERLINK l _Toc231618696 5.1 郵件的索引 PAGEREF _Toc231618696 h 23 HYPERLINK l _Toc23161869
6、7 5.2 郵件的搜索 PAGEREF _Toc231618697 h 27 HYPERLINK l _Toc231618698 5.3 搜索結果的高亮顯示 PAGEREF _Toc231618698 h 30 HYPERLINK l _Toc231618699 5.4 本章小結 PAGEREF _Toc231618699 h 31 HYPERLINK l _Toc231618700 第6章 總結與展望 PAGEREF _Toc231618700 h 32 HYPERLINK l _Toc231618701 6.1 系統總結 PAGEREF _Toc231618701 h 32 HYPERLI
7、NK l _Toc231618702 6.2 系統實現局部效果圖 PAGEREF _Toc231618702 h 32 HYPERLINK l _Toc231618703 6.3 開展前景 PAGEREF _Toc231618703 h 34 HYPERLINK l _Toc231618704 謝辭 PAGEREF _Toc231618704 h 35 HYPERLINK l _Toc231618705 參考文獻 PAGEREF _Toc231618705 h 36 HYPERLINK l _Toc231618706 附 錄 PAGEREF _Toc231618706 h 37支持全文檢索的郵
8、件代理效勞平臺多郵箱管理及Lucene在郵件搜索上的應用摘要:本文闡述了設計與實現支持全文檢索的郵件代理效勞平臺的理論根底,設計思想,整體架構等。其中最主要的是應用了J2EE中的JavaMail、JMS、EJB3中的消息驅動Bean和Lucene。本文著重闡述了Lucene全文索引及檢索技術在該系統中的應用,包括索引的建立,索引的修改,搜索,對搜索結果的高亮顯示等。關鍵字:J2EE;JavaMail;消息驅動Bean;Lucene;全文檢索Support Full-text Search Platform for E-mail Proxy ServiceManagement of Multip
9、le Mailboxes and Application of Lucene in Mail SearchAbstract: 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 overall structure and so on. The most important is the use of J2EE in the JavaMa
10、il, JMS, EJB3 of Message-Driven Bean and Lucene.This article focuses on the Lucene full-text indexing and retrieval technology in the system, including the establishment of the index, index changes, and search on the highlighted search results display.Key words: J2EE; JavaMail; Message-Driven Bean;
11、Lucene; Full-text Search第1章 引言 課題背景電子郵件是一種用電子手段提供信息交換的通信方式。是Internet應用最廣的效勞:通過網絡的電子郵件系統,用戶可以用非常低廉的價格,以非常快速的方式,與世界上任何一個角落的網絡用戶聯系,這些電子郵件可以是文字、圖像、聲音等各種方式。同時,用戶可以得到大量免費的新聞、專題郵件,并實現輕松的信息搜索。這是任何傳統的方式也無法相比的。正是由于電子郵件的使用簡易、投遞迅速、收費低廉,易于保存、全球暢通無阻,使得電子郵件被廣泛地應用,它使人們的交流方式得到了極大的改變。另外,電子郵件還可以進行一對多的郵件傳遞,同一郵件可以一次發送給許
12、多人。最重要的是,電子郵件是整個網間網以至所有其他網絡系統中直接面向人與人之間信息交流的系統,它的數據發送方和接收方都是人,所以極大地滿足了大量存在的人與人通信的需求。當今社會是信息化的社會,人們并不僅僅滿足于現有的電子郵件效勞,由于移動辦公的需要,電子郵件效勞由單純的客戶端收發郵件開展到了Web郵件,但電子郵件的開展還未就此停止,現在的人群當中存在一大批人是擁有不止一個電子郵箱的,他們對電子郵件效勞又有了新的需求,此時電子郵件效勞就必須滿足支持多個郵箱管理的功能。 國內外研究現狀電子郵件開展到現在,用戶使用電子郵件效勞的方式有兩種:一種是用戶使用個人計算機上的客戶端軟件,比方Outlook,
13、Foxmail等。Outlook是由美國微軟公司(Microsoft)出品的免費軟件,與Internet Explorer瀏覽器軟件捆綁發行;Foxmail是由國人張小龍編寫的一個功能強大非商業軟件,它實現了真正的多用戶、多賬戶、多POP3支持,自動進行撥號,能設置郵件過濾功能,能閱讀和收發Big5碼的郵件,可以直接查看HTML格式郵件。這兩種客戶端軟件只要通過適當的配置后,就可以對郵件進行接收和發送,但單純使用郵件客戶端程序進行郵件的收發已經不能滿足用戶移動辦公的需要。另一種就是使用WebMail系統,將E-mail和Web結合在一起,即通過Web編程和適當的系統設置,使用戶僅僅以訪問Web
14、的方式就可以得到和使用完整的郵件效勞的系統稱為WebMail系統。WebMail是目前Internet上最受歡送和使用最多的效勞之一,也是很多網站必備功能之一。像網易、新浪等大型門戶網站都提供了免費的WebMail效勞,并在其中參加了一些別的實用功能。如Google的GMail提供應郵箱用戶網絡硬盤,用戶可以將一些電子資料存入網絡硬盤中,并提供了全文檢索的功能。現在許多WebMail系統在這些方面的改良越來越多,并在一定程度上滿足了用戶的要求,但僅此還是不夠的。 課題的目的和意義本課題意在設計并實現一種支持全文檢索的郵件代理效勞平臺,使用戶進一步感受到電子郵件效勞給他們帶來的方便與快捷。雖然現
15、有的郵件效勞系統已經比擬完善,但對于多個郵箱的支持還是比擬少的,而且對多個郵箱中的文件進行統一管理的更少,因此有必要設計并實現一個支持多個郵箱收發郵件的系統。對于這種效勞系統,雖然現在在用戶中使用地比擬少,而且專門提供類似效勞的系統也不多。但隨著電子郵件的開展,相信在這方面的需求會越來越突出,而這種系統將會越來越得到用戶的青睞。 本章小結本章主要介紹了支持全文檢索的郵件代理效勞平臺的研究背景、國內外的研究狀況及本課題的目的和意義。第2章 相關技術及開發工具介紹2.1 J2EE簡介J2EE是一種利用Java 2平臺來簡化企業解決方案的開發、部署和管理相關的復雜問題的體系結構。J2EE技術的根底就
16、是核心Java平臺或Java 2平臺的標準版,J2EE不僅穩固了標準版中的許多優點,例如“編寫一次、隨處運行的特性、方便存取數據庫的JDBC API、CORBA技術以及能夠在Internet應用中保護數據的平安模式等等,同時還提供了對EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)以及XML技術的全面支持。其最終目的就是成為一個能夠使企業開發者大幅縮短投放市場時間的體系結構。J2EE體系結構提供中間層集成框架用來滿足無需太多費用而又需要高可用性、高可靠性以及可擴展性的應用的需求。通過提供統一的開發平臺,J2EE降
17、低了開發多層應用的費用和復雜性,同時提供對現有應用程序集成強有力支持,完全支持Enterprise JavaBeans,有良好的向導支持打包和部署應用,添加目錄支持,增強了平安機制,提高了性能13。2 JavaMailJavaMail,顧名思義,提供應開發者處理電子郵件相關的編程接口。它是Sun發布的用來處理email的API。它可以方便地執行一些常用的郵件傳輸。我們可以基于JavaMail開發出類似于Microsoft Outlook的應用程序。雖然JavaMail是Sun的API之一,但它目前還沒有被加在標準的java開發工具包中(Java Development Kit),這就意味著你在
18、使用前必須另外下載JavaMail文件。除此以外,你還需要有Sun的JavaBeans Activation Framework (JAF)。JavaBeans Activation Framework的運行很復雜,在這里簡單的說就是JavaMail的運行必須得依賴于它的支持。在Windows 2000下使用需要指定這些文件的路徑,在其它的操作系統上也類似。2. JMSJMS(Java Message Service,Java消息效勞)是一組Java應用接口,它提供創立、發送、接收、讀取消息的效勞。JMS API定義了一組公共的應用程序接口和相應語法,使得Java應用能夠和各種消息中間件進行通
19、信,這些消息中間件包括IBM MQ-Series、Microsoft MSMQ及純Java的Sonic MQ。通過使用JMS API,開發人員無需掌握不同消息產品的使用方法,也可以使用統一的JMS API來操縱各種消息中間件。通過使用JMS,能夠最大限度地提升消息應用的可移植性。JMS既支持點對點的消息通信,也支持發布/訂閱式的消息通信。2 EJB3EJB是sun的效勞器端組件模型,最大的用處是部署分布式應用程序,類似微軟的com技術。憑借java跨平臺的優勢,用EJB技術部署的分布式系統可以不限于特定的平臺。EJB(Enterprise Java Bean)是J2EE的一局部,定義了一個用于
20、開發基于組件的企業多重應用程序的標準。其特點包括網絡效勞支持和核心開發工具(SDK)。在J2EE里,Enterprise Java Beans(EJB)稱為Java企業Bean,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。Session Bean用于實現業務邏輯,它可以是有狀態的,也可以是無狀態的。每當客戶端請求時,容器就會選擇一個Session Bean來為客戶端效勞。Session Bean可以直接訪問數據庫,但更多時候,它會通過Entity Bean實現數據訪問。E
21、ntity Bean是域模型對象,用于實現O/R映射,負責將數據庫中的表記錄映射為內存中的Entity對象,事實上,創立一個Entity Bean對象相當于新建一條記錄,刪除一個Entity Bean會同時從數據庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和數據庫同步。MessageDriven Bean是EJB2.0中引入的新的企業Bean,它基于JMS消息,只能接收客戶端發送的JMS消息然后處理。MDB實際上是一個異步的無狀態 Session Bean,客戶端調用MDB后無需等待,立刻返回,MDB將異步處理客戶請求。這適合于需要異步處理請求的
22、場合,比方訂單處理,這樣就能防止客戶端長時間的等待一個方法調用直到返回結果。2.2 LuceneLucene是apache軟件基金會jakarta工程組的一個子工程,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,局部文本分析引擎英文與德文兩種西方語言。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為根底建立起完整的全文檢索引擎。Lucene作為一個全文檢索引擎,其具有如下突出的優點:索引文件格式獨立于應用平臺。Lucene定義了一套以8位字節為根底
23、的索引文件格式,使得兼容系統或者不同平臺的應用能夠共享建立的索引文件。在傳統全文檢索引擎的倒排索引的根底上,實現了分塊索引,能夠針對新的文件建立小文件索引,提升索引速度。然后通過與原有索引的合并,到達優化的目的。優秀的面向對象的系統架構,使得對于Lucene擴展的學習難度降低,方便擴充新功能。設計了獨立于語言和文件格式的文本分析接口,索引器通過接受Token流完成索引文件的創立,用戶擴展新的語言和文件格式,只需要實現文本分析的接口。已經默認實現了一套強大的查詢引擎,用戶無需自己編寫代碼即使系統可獲得強大的查詢能力,Lucene的查詢實現中默認實現了布爾操作、模糊查詢、分組查詢等等9。2.3 開
24、發環境及工具開發環境:Windows XP SP2開發工具:MyEclipse 部署環境: HYPERLINK :/ soft6 /product/0/5512.html t _blank Sun Java System Application Server第3章 系統總體設計3.1 總體設計框架支持全文檢索的郵件代理效勞平臺主要是利用J2EE和Lucene來架構,涉及到J2EE中的JSP、Servlet、JavaMail、JMS、EJB3中的消息驅動Bean,以及Lucene中的索引、搜索和高亮等。該系統的整體框架如圖3-1所示。圖3-1 支持全文檢索的郵件代理效勞平臺整體框架3.2 系統根
25、本功能支持全文檢索的郵件代理效勞平臺主要是為滿足用戶有多個郵箱,并且需要對多個郵箱進行統一管理,包括接收各個郵箱中的郵件,通過各個不同的郵箱來發送郵件等,因此在該系統中需要提供的功能有:接收多個郵箱中的郵件;通過不同的郵箱發送不同的郵件;添加不同的郵箱;可以對收件箱中的郵件進行全文檢索;對用戶密碼進行修改;對已添加的郵箱進行修改。3 系統模塊結構圖根據系統所具有的根本功能得到該系統的功能模塊結構示意圖,如圖3-2所示。支持全文檢索的郵件代理效勞平臺支持全文檢索的郵件代理效勞平臺注冊登錄郵件管理郵件收發郵件檢索郵箱管理用戶管理注冊登錄查看郵件刪除郵件發送郵件修改郵箱刪除郵箱修改密碼索引郵件搜索郵
26、件添加郵箱接收郵件圖3-2 系統功能模塊結構示意圖3.2.2 各個模塊功能概述該系統中包含的功能有:注冊、登錄、接收郵件、寫郵件、郵件管理查看/刪除/回復、已發郵件管理查看/刪除/轉發、郵箱管理添加/刪除/修改、郵件的索引和郵件的搜索。各個功能模塊分別介紹如下:1注冊注冊局部主要是為了使剛開始使用該系統的用戶能有自己唯一的一個賬戶,并能在注冊之后使用該系統。用戶所提供的密碼是經過DES加密后才存儲的。2登錄登錄局部主要是為了驗證用戶所提供的用戶名和密碼的合法性,假設合法的話,那么提供應該用戶相應的可靠效勞,否那么做非法用戶處理,并且要求該用戶注冊或者是提示該用戶他所提供的用戶名和密碼是非法的,
27、要求其重新登錄。3接收郵件接收郵件局部主要是為了幫用戶接收用戶所提供的郵箱中的郵件,這是一個后臺的效勞程序,用戶自己是感覺不到什么時候接收到郵件的,但后臺程序會定時地為每一個用戶提供郵件接收的效勞。并且每個郵箱中的郵件是不會被重復接收的。4發送郵件發送郵件局部是給用戶提供發送新郵件之用,這里可以支持不同的郵箱發送郵件,就是說雖然用戶是在同一個地方寫新郵件、發送郵件,但是該系統可以根據用戶所提供的不同的發件人,讓用戶用他自己的不同郵箱來發送信件,而接收信件的人那么看到的也是不同的發件人。5郵件管理查看/刪除/回復郵件管理局部主要是提供用戶查看郵件、刪除郵件和回復郵件的功能。當用戶接收到新郵件時,
28、收到的新郵件都會重點提示用戶這是一封新郵件,讓用戶很快就能看到是否有新的郵件。當有郵件時,用戶可以查看郵件。查看的時候,如果用戶想回復該郵件,那么點擊“回復,系統就自動產生一封新的郵件,用戶只需寫好信的內容即可發送。當然,如果用戶認為收件箱中的郵件已經沒有利用價值,就可以刪除郵件。6已發郵件管理查看/刪除/轉發已發郵件管理局部主要是為了用戶方便管理已經發送的郵件和未發送成功的郵件。但凡用戶發送過的郵件,不管是否發送成功,用戶都可以在已發郵件中找到該郵件,并且可以刪除和轉發。7郵箱管理添加/刪除/修改郵箱管理局部主要是讓用戶可以添加自己已有的所有郵箱,之后該系統可以幫用戶在后臺接收這些郵箱中的所
29、有郵件,這是為了方便用戶統一管理自己的所有郵箱。在這里,用戶可以隨意添加、刪除和修改自己的郵箱。8郵件的索引郵件的索引主要是為郵件的搜索做準備,只要系統在后臺接收到新郵件,系統就會自動的為該郵件建立索引,方便用戶以后對該郵件的搜索。這是由Lucene來實現的,這與直接對數據庫進行搜索相比擬,效率比擬高,而且功能也比擬強,易于在以后擴展。9郵件的搜索郵件的搜索主要是提供應用戶查找自己的相關郵件之用,這是通過之前建立的郵件全文索引來實現的,應用Lucene中提供的搜索功能構建自己的搜索器,將搜索的結果返回給用戶,并高亮顯示一些關鍵字,能使用戶很準確的找到自己想要的郵件。3.3 數據庫設計支持全文檢
30、索的郵件代理效勞平臺中存在有四種不同用處的表,包括用戶表,已收郵件表,已發郵件表,郵箱表。3 用戶表用戶表是用來存放已注冊的用戶名和密碼,因此該表只有2個字段,包括用戶名和密碼。用戶實體E-R圖如圖3-3所示,用戶表的具體各字段設計如表3-1所示。用戶用戶用戶名密碼圖3-3 用戶實體E-R圖表3-1 用戶表NameTypeNullableKeyUSERNAMEVARCHAR2(50)NOT NULL*PASSWORDVARCHAR2(50)NOT NULL3 已收郵件表已收郵件表是用來存放該用戶所有郵箱中的郵件,該表中有8個字段,包括序列sid、郵件的ID、發件人mailfrom、收件人mai
31、lto、郵件主題subject、郵件內容content、時間time和狀態state。已收郵件實體E-R圖如圖3-4所示,已收郵件表的具體各字段設計如表3-2所示。已收郵件已收郵件序列郵件ID收件人發件人主題內容狀態時間圖3-4 已收郵件實體E-R圖表3-2 已收郵件表NameTypeNullableKeySIDNUMBERNOT NULLIDVARCHAR2(100)NOT NULL*MAILFROMVARCHAR2(100)NOT NULLMAILTOVARCHAR2(100)NOT NULLSUBJECTVARCHAR2(200)NOT NULLCONTENTCLOBTIMEVARCHA
32、R2(30)NOT NULLSTATEVARCHAR2(2)3 已發郵件表已發郵件表是用來存放該用戶已經發送過的郵件,該表中有8個字段,包括序列sid、郵件的ID、發件人mailfrom、收件人mailto、郵件主題subject、郵件內容content、時間time和狀態state。該表與收件箱表的設計相同,已發郵件實體E-R圖如圖3-5所示,已發郵件表的具體各字段設計如表3-3所示。已發郵件已發郵件序列郵件ID收件人發件人主題內容狀態時間圖3-5 已發郵件實體E-R圖表3-3 已發郵件表NameTypeNullableKeySIDNUMBERNOT NULLIDVARCHAR2(100)N
33、OT NULL*MAILFROMVARCHAR2(100)NOT NULLMAILTOVARCHAR2(100)NOT NULLSUBJECTVARCHAR2(200)NOT NULLCONTENTCLOBTIMEVARCHAR2(30)NOT NULLSTATEVARCHAR2(2)3 郵箱表郵箱表是用來存放該用戶所添加的所有郵箱,該表中有3個字段,包括序列id、郵箱名email和密碼password。郵箱實體E-R圖如圖3-6所示,郵箱表的具體各字段設計如表3-4所示。郵箱郵箱序列郵箱名密碼圖3-6 郵箱實體E-R圖表3-4 郵箱表NameTypeNullableKeyIDNUMBERNO
34、T NULLEMAILVARCHAR2(50)NOT NULL*PASSWORDVARCHAR2(50)NOT NULL3.4 本章小結 TOC o 1-3 h z u 本章主要介紹了支持全文檢索的郵件代理效勞平臺的總體設計框架、系統根本功能模塊、數據庫的設計,讓讀者對該系統有一個總體的認識。下一章將具體闡述郵箱管理、用戶管理及JMS應用的詳細設計和實現。第4章 局部系統模塊詳細設計與實現在支持全文檢索的郵件代理效勞平臺中一共有六個模塊,如圖3-2所示,分別為注冊登錄、郵件管理、寫郵件、郵箱管理、用戶管理和郵件檢索。由于該系統是由兩人合作完成,因此在本章將詳細介紹該系統的郵箱管理和用戶管理模塊
35、。4.1 郵箱管理模塊在郵箱管理模塊中,包括添加郵箱、修改郵箱和刪除郵箱,其給用戶所提供的功能為:用戶可以添加其所有郵箱到該系統中,系統在后臺負責管理其已添加的所有郵箱。但有一點用戶應該注意的:在添加郵箱的時候,用戶應該提供其正確的郵箱用戶名和密碼,確保系統能真正管理該郵箱。因為系統不會去檢查該郵箱的合法性。當然用戶還可以修改其之前所添加的郵箱,以防用戶輸入錯誤。如該郵箱對用戶來說已經沒有使用價值的話,該郵箱可以被刪除。4 添加郵箱在該模塊中的添加郵箱局部,系統只是比擬簡單的將用戶所提供的用戶名和密碼存入了系統的數據庫中。假設用戶提供的郵箱用戶名和密碼有誤的話,系統將接收不到該郵箱中的郵件,自
36、然不能為用戶起到管理郵箱的作用。在用戶添加郵箱的時候,為了能讓用戶能及時的看到他那個郵箱中的郵件,在添加郵箱成功的時候,程序會開一個接收郵件的線程,讓這個線程去接收這個郵箱中的郵件。這樣在后臺開啟一個線程,用戶也不能覺察到接收郵件的過程,但后臺程序確實已經開始接收郵件的工作了。只要過一定時間,用戶就可以在他的收件箱中看到已經收到的郵件。該模塊中添加郵箱局部的具體實現:用request類中的getParameter()方法得到用戶在頁面中所提交的郵箱名和密碼;用DES加密算法對用戶提交的密碼進行加密處理;根據以上得到的郵箱名和密碼,實例化一個郵箱類;通過JNDI查找數據源jdbc/oracled
37、s,得到一個數據庫的連接;將實例化的一個郵箱類,通過MailBoxDAOJdbc類來存入數據庫;存入數據庫成功的話就開啟一個接收郵件的一個線程,來接收剛添加的郵箱中的郵件。否那么,頁面跳轉回添加郵箱的頁面setupMailBox.jsp。在該模塊的實現中,添加郵箱局部用到了JDBC、Servlet和JSP技術。實現的流程圖如圖4-1所示。當前用戶的輸入的密碼與數據庫中的是否相同當前用戶的輸入的密碼與數據庫中的是否相同用戶輸入當前用戶的密碼和新密碼開始通過數據源得到一個數據庫的連接結束更新數據庫中的當前用戶的密碼是否圖4-1 添加郵箱局部流程圖局部代碼簡析:/通過request類的getPara
38、meter()方法得到郵箱名和密碼String email=request.getParameter(email).toString();String mailServerName=request.getParameter(mailServerName).toString();String emailpwd= request.getParameter(emailpwd).toString();/DES加密String emailpwd=DES.encrypt(request.getParameter(emailpwd).toString();/實例化一個郵箱類MailBox mb=new Ma
39、ilBox();mb.setEmail(email+mailServerName);/設置郵箱名mb.setPassword(emailpwd);/設置密碼/通過JNDI查找數據源Context initContext;initContext = new InitialContext();DataSource ds = (DataSource) initContext.lookup(jdbc/oracleds);/將郵箱類存入數據庫String insertSql = insert into + currentUser+ mailbox(id,email,password) values( +
40、 currentUser+ _seq.nextval,?,?);PreparedStatement pstmt;pstmt = conn.prepareStatement(insertSql);pstmt.setString(1, mb.getEmail();pstmt.setString(2, mb.getPassword();pstmt.execute();pstmt.close();4 修改郵箱在該模塊的修改郵箱局部,系統也只是簡單的將數據庫中原有的密碼更新為用戶新提交的密碼,并不會去檢查別的,因此該功能的實現比擬簡單。該模塊中修改郵箱局部的具體實現:用request類中的getPara
41、meter()方法得到用戶在頁面中所提交的郵箱名和密碼;用DES加密算法對用戶提交的密碼進行加密處理;根據以上得到的郵箱名和密碼,實例化一個郵箱類;通過JNDI查找數據源jdbc/oracleds,得到一個數據庫的連接;將實例化的一個郵箱類,通過MailBoxDAOJdbc類中的updateMailBox方法來更新數據庫中的密碼。修改郵箱局部的流程圖如圖4-2所示。圖4-2 修改郵箱局部流程圖局部代碼簡析:由于在添加郵箱局部已經分析過局部相同的代碼,在這里只簡析不同的代碼片段。/根據郵箱名來更新郵箱密碼String updateSql = update + currentUser + mail
42、box set password=+ password + where id= + id;PreparedStatement pstmt;pstmt = conn.prepareStatement(updateSql);pstmt.execute();pstmt.close();4 刪除郵箱在該模塊的刪除郵箱局部,系統根據郵箱在數據庫中存儲的id來刪除郵箱在數據庫中的記錄,因此該功能的實現也比擬簡單。該模塊中修改郵箱局部的具體實現:用request類中的getParameter()方法得到用戶在頁面中得到郵箱在數據庫中的id;通過JNDI查找數據源jdbc/oracleds,得到一個數據庫的連
43、接;將實例化的一個郵箱類,通過MailBoxDAOJdbc類中的deleteMailBox方法來刪除數據庫中的郵箱。修改郵箱局部的流程圖如圖4-3所示。得到郵箱在數據庫中的ID得到郵箱在數據庫中的ID開始通過數據源得到一個數據庫的連接根據郵箱ID刪除郵箱結束圖4-3 刪除郵箱局部流程圖局部代碼簡析:由于在添加郵箱局部已經分析過局部相同的代碼,在這里只簡析不同的代碼片段。/根據郵箱ID來刪除郵箱String deleteSql = delete from + currentUser + mailbox where id=+ id;PreparedStatement pstmt;pstmt = c
44、onn.prepareStatement(deleteSql);pstmt.execute();pstmt.close();4.2 用戶管理模塊在用戶管理模塊中,只包括用戶密碼的修改局部,其給用戶所提供的功能為:用戶可以為自己在該系統中的當前用戶修改密碼,這只是為了某些用戶要修改密碼的需要。該模塊中用戶密碼修改局部的具體實現:用request類中的getParameter()方法得到用戶在modifyUserpw頁面中得到用戶輸入的先前密碼和新的密碼;根據當前用戶,從數據庫中讀取先前的密碼,與用戶輸入的當前密碼比對,看是否相同;如果相同的話,那么實例化一個用戶類,將數據庫中的密碼更新為用戶輸入
45、的新密碼,假設不相同的話,修改密碼失敗。用戶密碼修改局部的流程圖如圖4-4所示。當前用戶的輸入的密碼與數據庫中的是否相同當前用戶的輸入的密碼與數據庫中的是否相同用戶輸入當前用戶的密碼和新密碼開始通過數據源得到一個數據庫的連接結束更新數據庫中的當前用戶的密碼是否圖4-4 用戶密碼修改局部流程圖局部代碼簡析:/更新數據庫中的用戶密碼public static final String UPDATE_USER_SQL = update users set password=? where username=?;PreparedStatement pstmt = conn.prepareStateme
46、nt(UPDATE_USER_SQL);pstmt.setString(1, u.getPassword();tring(2, u.getUsername();pstmt.executeUpdate();pstmt.close();4.3 JMS應用在本系統中,為了提高系統后臺的工作效率,采用了消息中間件,實現異步的消息傳遞。這對于本系統的穩定性是很關鍵的。由于本系統在后臺要不斷地幫用戶處理業務,包括郵件的接受和郵件的索引,而就這兩局部,在系統中就有可能隨著時間的推移而業務不斷地加重。因為有可能使用該系統的用戶會越來越多,這樣的話接收郵件和索引郵件的工作量就會越來越重。如果采用同步機制,那么嚴
47、重影響系統的運行效率,用戶體驗也會越來越差,最終本系統就選擇使用JMS的異步消息處理來解決此問題。4 JMS消息模型在JMS中,提供了兩種模型:一種是點對點模型,另一種是發布/訂閱模型。點對點模型是與消息隊列一起工作的。它們是點對點的,是因為客戶端將消息發送到一個隊列,而另一個客戶端將從這個隊列中接收消息。點對點模型示意圖如圖4-5所示。客戶端1客戶端1隊列客戶端2消息消息發送接收確認圖4-5 點對點模型示意圖發布/訂閱模型是發送方針對一個主題發送消息,多個接收方可以訂閱他們的主題。一個主題消息只能被傳遞給訂閱該主題的接收方,同時一個接收方只能接收他所訂閱的主題中的消息。發布/訂閱模型示意圖如
48、圖4-6所示。發布者發布者Topic發布消息訂閱者1訂閱者2消息接收訂閱消息接收訂閱圖4-6 發布/訂閱模型示意圖4 消息模型的選擇根據本系統的特點,我們選擇了點對點的消息模型,這是出于容易構建本系統的根底上的。4 點對點模型在系統中的應用確定選擇點對點模型之后,開始構建本系統中特有的點對點模型。在本系統中,消息的生產者是接收郵件的線程,接收郵件的線程一接收完一封郵件就馬上向消息隊列中發送一條消息。而本系統中的消息隊列是通過 HYPERLINK :/ soft6 /product/0/5512.html t _blank Sun Java System Application Server這個
49、應用效勞器提供的,只要對效勞器中的某些設置項進行適當的配置即可產生一個消息隊列。消息的消費者是消息驅動Bean,這是EJB3里提供的。只要消息隊列中一有消息,EJB容器就會自動讓消息驅動Bean去處理消息。在本系統中實現的點對點消息模型示意圖如圖4-7所示。接收郵件線程接收郵件線程消息隊列消息驅動Bean圖4-7 系統實現點對點模型示意圖由于接收郵件是多線程的,因此消息驅動Bean的處理也是多線程的,這樣大大地提高了本系統的性能。但這樣也給系統帶來了其他問題,如線程之間的同步問題,這下一章講到郵件索引的時候會給出解決方案。4 消息驅動Bean的實現本系統中,消息驅動Bean(MDB)是一個很重
50、的局部。MDB負責將郵件存入數據庫并索引郵件。當消息到達時,判斷是不是欲接收的消息,假設是的話,就下一步,否那么就不接收;將消息轉換為本地的一般郵件對象,將郵件對象存入數據庫;假設成功存入數據庫,那么索引這郵件對象,否那么就不索引。2.核心代碼:public void onMessage(Message message) ObjectMessage omsg = null;JMSMessage jmsg = null;try if (message instanceof ObjectMessage) omsg = (ObjectMessage) message;jmsg = (JMSMessa
51、ge)omsg.getObject();/轉化為本地對象String username=jmsg.getUsername(); String currentUser = username.substring(username.lastIndexOf(/)+1, username.length();MailMessage msg=jmsg.getMsg();/獲取郵件對象MsgSaveToDB mstdb=new MsgSaveToDB();boolean falg=false;falg=mstdb.saveMessage(currentUser, msg);/保存郵件if(falg)Index
52、Util.addIndex(jmsg);/索引郵件 catch (Exception e) e.printStackTrace();4.4 本章小結本章詳細地介紹了支持全文檢索的郵件代理效勞平臺中的兩個模塊:郵箱管理和用戶管理。這兩個模塊主要是側重數據庫的插入、刪除和更新,使用戶比擬方便的管理其所有郵箱和其賬號密碼。下一章將重點介紹在該系統中郵件檢索模塊的詳細設計與實現。第5章 郵件檢索模塊詳細設計與實現在支持全文檢索的郵件代理效勞平臺中,郵件檢索模塊主要包括兩局部:1.郵件的索引;2.郵件的搜索。本章將具體介紹Lucene各方面的原理及在該系統中的應用,包括對每一封郵件建立索引的過程、對郵件
53、的搜索過程和對搜索結果的高亮顯示。5.1 郵件的索引在該系統中的郵件索引是應用Lucene來實現的。5 Lucene索引介紹Lucene是一個高性能的java全文檢索工具包,它使用的是倒排文件索引結構。從實現方式上來看,倒排索引是典型的為滿足實際應用需要而設計的一種數據結構。這種數據結構中的每一個元素是一個索引項,每一個索引項是由關鍵字屬性值和關鍵字關聯記錄,或者記錄的存放地址組成。這種結構的最大特點是改變了以往的檢索過程。通常的查找方法是先確定文檔,然后在文檔中順序查找后續的文檔。倒排索引那么是利用索引關鍵字直接確定文檔列表,最后才確定希望找到的文檔列表2。Lucene索引結構圖如圖5-1所
54、示:圖5-1 Lucene索引結構圖在Lucene中,索引文件的存儲還分兩種結構:一種是多文件索引結構,另一種是復合索引結構。多文件索引是使用一系列索引文件分別存儲索引,分散管理數據的索引存儲格式。多文件索引在翻開時需要讀取大量文件,會大大占用系統的文件句柄等資源,造成系統響應速度慢,甚至系統崩潰2。因此,在本系統中,我們采用復合索引結構。復合索引是把索引相關的一系列數據結構組織到少數幾個文件中進行管理的索引存儲模式。復合索引把所有的索引數據被組合成簡單的3個文件,大大減少了翻開大量文件的壓力。但是使用統一文件存儲大量數據會造成數據更新的問題,每次更改需要操作一個大的數據文件,讀取和存儲都會比
55、擬慢。對本系統來說,因為數據量不是很大,所以并不會產生大的數據文件。因此,選擇以這種結構來存儲郵件的索引文件是一種比擬好的解決方案。5 Lucene中的分詞對于分詞,在Lucene這個全文檢索工具包中,是一個非常重要的。因為如果要對一篇文章建立全文索引,就必須先對這篇文章進行文本分析,對文章要進行有意義的分詞。這就必須要用到分詞器。由于Lucene不是本國人開發的全文檢索工具包,因此Lucene中自帶的分詞器對于中文分詞的支持不是很好。Lucene包中有兩個支持中文的分詞器:一個是ChineseAnalyzer,另一個是CJKAnalyzer。但是ChineseAnalyzer這個分詞器只是單
56、字切分,而CJKAnalyzer分詞器那么是一個二分法的分詞器。因此,總的來說,Lucene自帶包中的分詞器對中文分詞的支持都不是很好。國內有一個比擬知名的中文分詞器,是中科院計算所開發的ICTCLAS。但由于這個分詞器是用C+開發的,因此如果在Java應用程序中使用的話,容易出現不穩定的現象。最后,在我們這個系統中選擇一個第三方提供的分詞器JE分詞器。這個分詞器是基于詞庫的,所以分詞的效果相對其余分詞器的分詞效果要好。各種分詞器分詞效果比擬:對“我愛我偉大的老爸老媽,我愛我壯麗的中華!這句話進行分詞。ChineseAnalyzer分詞結果:我 | 愛 | 我 | 偉 | 大 | 的 | 老
57、| 爸 | 老 | 媽 | 我 | 愛 | 我 | 壯 | 麗 | 的 | 中 | 華CJKAnalyzer分詞結果:我愛 | 愛我 | 我偉 | 偉大 | 大的 | 的老 | 老爸 | 爸老 | 老媽 | 我愛 | 愛我 | 我壯 | 壯麗 | 麗的 | 的中 | 中華JE分詞器分詞結果:我 | 愛我 | 偉大 | 老爸 | 老媽 | 我 | 愛我 | 壯麗 | 中華5 建立郵件索引了解Lucene建立索引過程的原理之后,我們要對本系統進行定制郵件索引器。在本系統中的一封郵件包括6個局部,分別是郵件ID、收件人、發件人、郵件主題、郵件內容和發信時間。郵件索引的需求在本系統中,要求建立的郵件索
58、引必須能夠支持用戶對郵件的收件人、發件人、郵件主題、郵件內容和發信時間進行搜索。因此在一封郵件中,除了郵件ID不被搜索到,郵件的其余局部都要能被搜索到。但是郵件ID有其特殊的功能,所以在本系統中,每一封郵件的各個局部都建立相關的索引。建立索引的具體實現判斷要存放索引的路徑是否被鎖定,假設沒被鎖定,就下一步,否那么就等待該鎖定的路徑被解鎖;用路徑名和JE分詞器生成一個IndexWriter對象;生成一個Document對象;生成一個郵件ID的索引域,并參加到Document對象中;生成一個收件人的索引域,并參加到Document對象中;生成一個發件人的索引域,并參加到Document對象中;生成
59、一個郵件主題的索引域,并參加到Document對象中;生成一個郵件內容的索引域,并參加到Document對象中;生成一個發信時間的索引域,并參加到Document對象中;將Document對象添加到IndexWriter對象中;IndexWriter對象進行索引優化操作;關閉IndexWriter。建立郵件索引核心代碼:public static boolean addIndex(String path,MailMessage msg)String indexPath=path;try while(IndexReader.isLocked(indexPath);IndexWriter writ
60、er = new IndexWriter(indexPath,new MMAnalyzer();Document doc=new Document();Field field=new Field(id,msg.getId(),Field.Store.YES,Field.Index.UN_TOKENIZED);doc.add(field);field=new Field(from,msg.getMailfrom(),Field.Store.YES,Field.Index.TOKENIZED);doc.add(field);field=new Field(to,msg.getMailto(),Fi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 愛的教育讀書分享
- 幼兒身心健康活動指導體系
- 生命安全知識專題教育
- 電網改造場地調研與工程設計合同
- 車輛租賃行業法律法規咨詢合同
- 智能新能源汽車維修服務及數據共享協議
- 車輛貸款風險控制與居間服務協議J
- 拉美跨境電商支付接口接入與風險管理協議
- 跨境電商平臺股權架構調整與業務拓展合同
- 柴油銷售與終端用戶利益共享合同
- 金融行業安全生產責任管理
- 中國敏感性皮膚臨床診療指南(2024版)
- EPS模塑聚苯板施工方案
- 馬拉松志愿者培訓方案
- 近3年國網系統安全事故(事件)通報+各專業嚴重違章專項測試題附答案
- 肺孢子菌肺炎護理查房
- 2023年法律職業資格《主觀題》真題及答案
- LY/T 3391-2024植物新品種特異性、一致性、穩定性測試指南紫荊屬
- 柬埔寨高棉語學習
- 二年級下冊期末無紙筆測評方案
- CJJ89-2012 城市道路照明工程施工及驗收規程
評論
0/150
提交評論