JSP快信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)(論文+源碼+PPT)
摘 要
計(jì)算機(jī)網(wǎng)絡(luò)的出現(xiàn)到現(xiàn)在已經(jīng)經(jīng)歷了翻天覆地的重大改變。因特網(wǎng)也從最早的供科學(xué)家交流心得的簡(jiǎn)單的文本瀏覽器發(fā)展成為了商務(wù)和信息的中心。到了今天,互聯(lián)網(wǎng)已經(jīng)成為了大量應(yīng)用的首選平臺(tái),人們已經(jīng)漸漸習(xí)慣了網(wǎng)絡(luò)交易,漸漸對(duì)網(wǎng)絡(luò)產(chǎn)生了依賴。公司會(huì)議、機(jī)票預(yù)定、酒店預(yù)定、公司之間貨物訂單的下達(dá)等等工作都可以通過(guò)網(wǎng)絡(luò)快速的完成。網(wǎng)絡(luò)已經(jīng)滲透到了人們生活中的方方面面,甚至已經(jīng)延伸至人們?nèi)粘5囊率匙⌒懈鱾€(gè)領(lǐng)域。本項(xiàng)目就是在此背景下設(shè)計(jì)的企業(yè)快信系統(tǒng)。 本系統(tǒng)在開(kāi)發(fā)中,采用了 MYSQL 數(shù)據(jù)庫(kù),同時(shí)使用到了 Java Swing、短信貓組件、Java MailAPI 等相關(guān)技術(shù)。在進(jìn)行詳細(xì)設(shè)計(jì)之前,根據(jù)總體設(shè)計(jì)的結(jié)構(gòu),確定每部分功能的解決方案,并完成相關(guān)技術(shù)的可行性分析以及技術(shù)原型的實(shí)現(xiàn)。在該系統(tǒng)中,采用數(shù)據(jù)服務(wù)器,和客戶機(jī)相結(jié)合形成 B/S 結(jié)構(gòu),由相關(guān)人員或系統(tǒng)管理員執(zhí)行如系統(tǒng)的備份、恢復(fù)、修改等重要操作,從而用來(lái)提高系統(tǒng)的安全性,并且降低了了黑客通過(guò) Web 入侵來(lái)獲取以及改變系統(tǒng)中重要數(shù)據(jù)信息的可能性。同時(shí),采用 Web 客戶機(jī)架構(gòu) B/S 三層結(jié)構(gòu),Web 客戶機(jī)可通過(guò) Internet 或?qū)>€連接應(yīng)用服務(wù)器,向其發(fā)送指令,從而獲取服務(wù)。這樣做的優(yōu)點(diǎn)是用瀏覽器便可進(jìn)行,使用起來(lái)方便快捷,為客戶提供了很大的便利。而對(duì)于記錄管理,系統(tǒng)維護(hù)功能而言,主要是對(duì)記錄信息進(jìn)行處理,即對(duì)數(shù)據(jù)庫(kù)信息進(jìn)行添加,查詢,導(dǎo)入和導(dǎo)出操作,這部分功能涉及的主要技術(shù)為通過(guò) java連接 MYSQL 數(shù)據(jù)庫(kù),并通過(guò) Java 代碼完成對(duì)表內(nèi)信息的查詢和添加操作。 本文首先對(duì)企業(yè)快信的開(kāi)發(fā)進(jìn)行了較深入的研究,然后對(duì)短信發(fā)送與郵件發(fā)送原理進(jìn)行了介紹,接下來(lái)對(duì)系統(tǒng)的概要設(shè)計(jì)、功能模塊、數(shù)據(jù)庫(kù)設(shè)計(jì),以及名片夾管理功能與郵件發(fā)送功能的具體實(shí)現(xiàn)作了細(xì)致闡述,最后是系統(tǒng)效果的展示。企業(yè)快信系統(tǒng)是一個(gè)集短信與郵件為一體的移動(dòng)商務(wù)應(yīng)用系統(tǒng)。是針對(duì)企業(yè)內(nèi)部II及外部不同需求和應(yīng)用方面,而專門定制開(kāi)發(fā)的系統(tǒng)軟件。它完全集成了企業(yè)的業(yè)務(wù)推廣、客情溝通、內(nèi)部管理等應(yīng)用功能。企業(yè)快信的作用是幫助企業(yè)解決企業(yè)內(nèi)部、企業(yè)與外部溝通難、信息不能及時(shí)傳播等問(wèn)題。為此,系統(tǒng)提供郵件群發(fā)、短信群發(fā)、人員檔案、信息的管理等功能。系統(tǒng)是短信貓與郵件在企業(yè)商務(wù)應(yīng)用中的典型實(shí)例,因此必然受到眾多企業(yè)的青睞,成為企業(yè)通信的最佳選擇。 關(guān)鍵詞:短信發(fā)送;郵件發(fā)送;企業(yè)快信 The Design and Implementation of Enterprise’s Express Letter System Abstract
Computer network has undergone a great change.The internet has also developed intoa business and information center from the earliest.The company eeting,airlinereservation,hotel reservation, release the order of goods between the companies and so on,these all can becompleted through the network quikly.Internet has penetrated into every aspect of people’s life, even extending to the basic necessities of life in all areas of people’s daily life, The enterprise’s express letter system is designed in this context. The system development uses MYSQL database, uses Java Swing, GSM Modem, Java mail API and other Technology. Before the detailed design of the structure of the overall design to determine the solution of some of the features, and complete the feasibility analysis and prototype implementation of the related technologies. In this system, data server and client combine to form the C/S structure, performed by the financial staff or system managers, such as system backup, restore, and modify the amount of important operating to improve the security of the system, reduce hacker by Web Intrusion to access and change the possibility of important information. The same time, the use of the Web client organizations into the B / S three-tier Web client can be connected through the Internet or green application server, send commands, and thus access to services. The advantage is you can operate from a browser, easy to use, fast and efficient, convenient to the customer with the greatest convenience. For records management, system maintenance functions, record information that the database information to add, query, import and export operations, some of the features involved in technology to through VC6 connect the MYSQL database, and Java code to query and add operations on the information in the table. In this paper, we research the development of enterprise’s express letter system at first,and then introduce the principles of sending SMS and mails, After that, we made a elaboration of the summary of the system design, function modules, database design,business card folder management capabilities, as well as of the e-mail function’s concreterealization.Finally, we show the system’s effect.The enterprise’s express letter system is a mobile business of application systemwhich sets SMS and E-mail as a whole .The system software is specificallycustom-developed for internal and external needs and applications. It is fully integrated enterprise business promotion, customer intelligence, communication, internal management applications. The enterprise’s express letter system of the role is to help businesses solve internal, corporate and external communication difficult, not timely issemination of information and other issues. To this end, the system provides functions as java mail, BSwing , personnel files, information management and so on. The system is a typical example of the GSM Modem and e-mail in the enterprise business applications, so it will be subject to the favor of many enterprises, the best choice for business communications. Key words:Java Mail;BSwing;Express Letter 目錄 摘 要ii Abstractii 1 緒論11 1.1 開(kāi)發(fā)背景11 1.2 國(guó)內(nèi)外發(fā)展概況11 1.3 研究目的和意義11 1.4 研究主要內(nèi)容22 2 系統(tǒng)分析33 2.1 需求分析33 2.2 可行性研究33 2.2.1 經(jīng)濟(jì)可行性33 2.2.2 技術(shù)可行性33 2.3 開(kāi)發(fā)環(huán)境33 3 系統(tǒng)總體設(shè)計(jì)55 3.1 系統(tǒng)目標(biāo)55 3.2 系統(tǒng)功能結(jié)構(gòu)55 3.3 業(yè)務(wù)流程圖55 3.4 系統(tǒng)預(yù)覽66 3.5 文件夾組織結(jié)構(gòu)77 4 系統(tǒng)詳細(xì)設(shè)計(jì)88 4.1 數(shù)據(jù)庫(kù)設(shè)計(jì)88 4.1.1 數(shù)據(jù)庫(kù)分析88 4.1.2 數(shù)據(jù)庫(kù)概念設(shè)計(jì)88 4.1.3 數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì)99 4.2 公共模塊設(shè)計(jì)1010 4.2.1 數(shù)據(jù)庫(kù)連接及操作類的編寫1010 4.2.2 字符串處理類的編寫1212 4.2.3 配置Struts13Struts13Struts13 4.3 主頁(yè)設(shè)計(jì)1414 4.3.1 主頁(yè)概述1414 4.3.2 主頁(yè)技術(shù)分析1515 4.4 名片夾管理模塊設(shè)計(jì)1717 4.4.1 名片夾管理模塊概述1717 4.4.2 名片夾管理模塊技術(shù)分析1717 4.4.3 查看客戶信息列表的實(shí)現(xiàn)過(guò)程1818 4.4.4 添加客戶信息的實(shí)現(xiàn)過(guò)程1919 4.4.5 刪除客戶信息的實(shí)現(xiàn)過(guò)程2222 4.5 發(fā)送短信模塊設(shè)計(jì)2323 4.5.1 發(fā)送短信模塊功能概述2323 4.5.2 發(fā)送短信的實(shí)現(xiàn)過(guò)程2323 4.5.3 發(fā)送短信模塊技術(shù)分析2424 4.5.4 單元測(cè)試2828 4.6 發(fā)送郵件模塊設(shè)計(jì)2828 4.6.1 發(fā)送郵件模塊功能概述2828 4.6.2 發(fā)送郵件模塊技術(shù)分析2828 4.6.3 發(fā)送郵件模塊實(shí)現(xiàn)過(guò)程2929 4.6.4 單元測(cè)試3232 5 技術(shù)分析3333 5.1 開(kāi)發(fā)技巧與難點(diǎn)分析3333 5.1.1 添加收信人3333 5.1.2 插入短信3333 5.2 使用Java Mail 組件3434 5.2.1 Session 類3434 5.2.2 Address 類3535 5.2.3 Authenticator 類3535 5.2.4 Transport 類3535 結(jié)論3636 參考文獻(xiàn)3737 致 謝3838 外文原文3939 外文翻譯4747 1 緒論
1.1 開(kāi)發(fā)背景
在企業(yè)信息化的今天,效率決定成敗,企業(yè)內(nèi)、外部溝通的及時(shí)性將直接影響企業(yè)的運(yùn)作效率?,F(xiàn)在多數(shù)企業(yè)的辦公自動(dòng)化系統(tǒng)(即OA)的信息傳遞僅限于計(jì)算機(jī)內(nèi)部網(wǎng)絡(luò),如果用戶不在線,將無(wú)法知道是否有新的工作或緊急通知,為了確認(rèn)是否有待辦工作,不得不經(jīng)常去訪問(wèn)OA,檢索是否有新任務(wù),而事實(shí)上這種檢索的結(jié)果經(jīng)常是徒勞。這樣一來(lái),不僅造成了機(jī)器資源的浪費(fèi),也造成了人力資源的浪費(fèi)。因此急需一套成型的企業(yè)快信系統(tǒng)解決上述問(wèn)題。 1.2 國(guó)內(nèi)外發(fā)展概況
短消息服務(wù)市場(chǎng)近來(lái)如此火爆,讓許多人始料未及,預(yù)示著短消息的巨大市場(chǎng)空間。短消息(Short Message Service)是手機(jī)通過(guò)移動(dòng)網(wǎng)進(jìn)行個(gè)人簡(jiǎn)易數(shù)據(jù)通信的一種方式,具有覆蓋范圍廣、雙向?qū)ず?、使用?jīng)濟(jì)、可緩存處理等優(yōu)點(diǎn),滿足了人們爆炸性增長(zhǎng)的信息需求,使人們可以以低廉的價(jià)格、便捷的方式,隨時(shí)隨地得到充滿個(gè)性化的信息,是無(wú)線通信在 20 世紀(jì)末所做的一次重要飛躍。這使得移動(dòng)網(wǎng)絡(luò)不僅可以傳送音頻,也可以傳送數(shù)據(jù),而數(shù)據(jù)傳輸是互聯(lián)網(wǎng)技術(shù)的根本。 在國(guó)外,短消息業(yè)務(wù)占移動(dòng)運(yùn)營(yíng)商收入的很大比例。國(guó)內(nèi)移動(dòng)通信在保持較高增長(zhǎng)速度的同時(shí),數(shù)據(jù)業(yè)務(wù)正在成為運(yùn)營(yíng)商的重要收入來(lái)源,幾大電信公司不約而同地把目光盯住了手機(jī)短信。據(jù)統(tǒng)計(jì),從 2000 年第四季度開(kāi)始,全國(guó)短消息業(yè)務(wù)量以每月幾千萬(wàn)條的數(shù)量突然激增,已經(jīng)成為一個(gè)不容忽視的巨大的市場(chǎng)! 而隨著中國(guó)移動(dòng)通信用戶的不斷增長(zhǎng),如何最大程度地利用現(xiàn)有網(wǎng)絡(luò),挖掘網(wǎng)絡(luò)潛力,方便靈活地開(kāi)展增值服務(wù),拓展網(wǎng)絡(luò)應(yīng)用服務(wù)領(lǐng)域,滿足用戶日益增長(zhǎng)的服務(wù)需求成為網(wǎng)絡(luò)運(yùn)營(yíng)商所要考慮的重點(diǎn),因此,短消息增值服務(wù)已成為吸引用戶和增加收入的有效手段。開(kāi)展增值服務(wù)不僅可以直接增加業(yè)務(wù)收入,而且通過(guò)提供不同種類的服務(wù),可以吸引更多的顧客群體,對(duì)于拓展用戶、提高市場(chǎng)應(yīng)用效率具有非常重要的意義,潛在的收益更為巨大。 1.3 研究目的和意義
本課題通過(guò)對(duì)企業(yè)快信系統(tǒng)的開(kāi)發(fā)主要達(dá)到以下兩個(gè)目的: 1)企業(yè)快信系統(tǒng)面對(duì)成千上萬(wàn)用戶的連接以及同時(shí)的數(shù)據(jù)庫(kù)請(qǐng)求,對(duì)數(shù)據(jù)庫(kù)訪問(wèn)的效率和安全成了必須解決的問(wèn)題。通過(guò)對(duì)JAVA 平臺(tái)下數(shù)據(jù)庫(kù)存取機(jī)制的深入研究,找出一條效率,性能與安全平衡的道路。 2)Web 開(kāi)發(fā)的實(shí)例,對(duì)如何把 B/S 與 C/S 相結(jié)合進(jìn)行了研究,并對(duì)面向?qū)ο髮?duì)多層結(jié)構(gòu)的支持進(jìn)行了詳細(xì)的分析。 企業(yè)快信主要是高效和安全的對(duì)企業(yè)提供企業(yè)級(jí)快信和服務(wù),基于JAVA的多層結(jié)構(gòu)來(lái)進(jìn)行 web 開(kāi)發(fā)必然是今后的主流,并且由于同時(shí)面對(duì)多用戶及多連接,對(duì)數(shù)據(jù)庫(kù)存取效率及性能,安全都有很高要求,因此,文中對(duì)數(shù)據(jù)庫(kù)的高效安全的存取進(jìn)行了深入研究并且獲得了有效的進(jìn)展。通過(guò)對(duì)其具體應(yīng)用進(jìn)行研究對(duì)相關(guān)開(kāi)發(fā)人員和以后的軟件開(kāi)發(fā)及應(yīng)用都有十分重要的意義。 1.4 研究主要內(nèi)容
在一個(gè)提供企業(yè)級(jí)短信的系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)中,把 C/S 和 B/S 架構(gòu)根據(jù)實(shí)際情況進(jìn)行結(jié)合,著重對(duì)數(shù)據(jù)庫(kù)存取中的各種機(jī)制進(jìn)行了深入地研究并且根據(jù)系統(tǒng)自身特點(diǎn)進(jìn)行了選擇和加強(qiáng),采用了MySQL 數(shù)據(jù)供應(yīng)器池化,并使用 Windows7 自帶的性能監(jiān)視器來(lái)監(jiān)視鏈接池,最后討論了設(shè)置鏈接池大小的各種問(wèn)題,選擇合適的大小,實(shí)現(xiàn)高效與安全有效的結(jié)合。并且結(jié)合 web 開(kāi)發(fā)的實(shí)例,對(duì)面向?qū)ο髮?duì)多層結(jié)構(gòu)的支持進(jìn)行了詳細(xì)的分析。 基于JAVA的 B/S 架構(gòu)來(lái)進(jìn)行 web 開(kāi)發(fā)必然是今后的主流,并且由于同時(shí)面對(duì)多用戶及多連接,對(duì)數(shù)據(jù)庫(kù)存取效率及性能,安全都有很高要求,因此,通過(guò)對(duì)其具體應(yīng)用進(jìn)行研究對(duì)相關(guān)開(kāi)發(fā)人員和以后的軟件開(kāi)發(fā)及應(yīng)用都有十分重要的意義。 2 系統(tǒng)分析
2.1 需求分析
企業(yè)快信的作用是幫助企業(yè)解決企業(yè)內(nèi)部、企業(yè)與外部溝通難、信息不能及時(shí)傳播等問(wèn)題。為此,企業(yè)快信系統(tǒng)需要提供郵件群發(fā)、短信群發(fā)等功能。通過(guò)對(duì)多數(shù)企業(yè)日常業(yè)務(wù)的考察、分析,并結(jié)合短信及郵件自身的特點(diǎn),得出本系統(tǒng)要求具有以下功能。 ??用于管理客戶和員工信息的名片夾管理功能。 ??用于對(duì)常用短語(yǔ)及其類別進(jìn)行管理的信息庫(kù)管理功能。 ??短信群發(fā)功能。 ??郵件群發(fā)功能。 ??發(fā)送郵件附件的功能。 2.2 可行性研究
開(kāi)發(fā)任何一個(gè)基于計(jì)算機(jī)的系統(tǒng),都會(huì)受到時(shí)間和資源上的限制。因此,在接受任何一個(gè)項(xiàng)目開(kāi)發(fā)任務(wù)之前,必須根據(jù)客戶可能提供的時(shí)間和資源條件進(jìn)行可行性分析,以減少項(xiàng)目開(kāi)發(fā)風(fēng)險(xiǎn),避免人力、物力和財(cái)力的浪費(fèi)??尚行苑治雠c風(fēng)險(xiǎn)分析在很多方面是相互關(guān)聯(lián)的,項(xiàng)目風(fēng)險(xiǎn)越大,開(kāi)發(fā)高質(zhì)量的軟件的可行性就越小。 2.2.1 經(jīng)濟(jì)可行性 采用短信作為企業(yè)的移動(dòng)通信手段,將給企業(yè)對(duì)內(nèi)、對(duì)外進(jìn)行信息傳遞與溝通帶來(lái)革命性的變化,從而使得移動(dòng)辦公、客戶服務(wù)、員工溝通等運(yùn)作效率顯著提升,而成本則顯著下降。值得說(shuō)明的是,雖然短信有以上諸多優(yōu)點(diǎn),但它還是有一定的不足,例如信息內(nèi)容單一和受到字?jǐn)?shù)限制等。為解決這一問(wèn)題,在企業(yè)快信中提供了郵件群發(fā)功能。通過(guò)郵件進(jìn)行溝通也是目前比較流行的方式,它也具備實(shí)用、方便和廉價(jià)等優(yōu)點(diǎn)。 2.2.2 技術(shù)可行性 開(kāi)發(fā)一個(gè)企業(yè)快信系統(tǒng),涉及到的技術(shù)問(wèn)題不會(huì)太多,主要用到的技術(shù)就是使用短信貓和Java Mail組件來(lái)實(shí)現(xiàn)收發(fā)短信和群發(fā)郵件等功能。Java Mail 組件是Sun 公司發(fā)布的一種用于讀取、編寫和發(fā)送電子郵件的包,利用它可以方便地實(shí)現(xiàn)郵件群發(fā)。 2.3 開(kāi)發(fā)環(huán)境
在開(kāi)發(fā)企業(yè)快信時(shí),需要具備下面的軟件環(huán)境。 服務(wù)器端: ??操作系統(tǒng):Windows 7。 ??Java 開(kāi)發(fā)包:JDK 1.5 以上。 ??Web服務(wù)器:Tomcat6.0。 ??Java Mail 開(kāi)發(fā)包:Java Mail 1.4。 ??數(shù)據(jù)庫(kù):MYSQL。 ??瀏覽器:IE 10.0。 ??分辨率:最佳效果為1024×768 像素。 客戶端: ??瀏覽器:IE 10.0。 ??分辨率:最佳效果為1024×768 像素。 由于本系統(tǒng)中需要使用Java Mail 組件,下面將詳細(xì)介紹如何配置及Java Mail 的開(kāi)發(fā)環(huán)境。 由于目前Java Mail 還沒(méi)有被加在標(biāo)準(zhǔn)的Java 開(kāi)發(fā)工具中,所以在使用前必須另外下載Java MailAPI,以及Sun 公司的JAF(JavaBeans Activation Framework),Java Mail 的運(yùn)行必須信賴于JAF 的支持。 ??下載并構(gòu)建Java Mail API Java Mail API 是發(fā)送和接收E-mail 的核心API。需自行下載后解壓縮到硬盤上,并在系統(tǒng)的環(huán)境變量CLASSPATH 中指定activation.jar 文件的放置路徑。 ??下載并構(gòu)建JAF 目前Java Mail API 的所有版本都需要JAF(JavaBeans Activation Framework)的支持。JAF 為輸入的任意數(shù)據(jù)塊提供了支持,并能相應(yīng)地對(duì)其進(jìn)行處理。下載后解壓縮到硬盤上,并在系統(tǒng)的環(huán)境變量CLASSPATH 中指定activation.jar 文件的放置路徑。 如果不想更改環(huán)境變量,也可以把a(bǔ)ctivation.jar 添加到工程的構(gòu)建路徑中。 3 系統(tǒng)總體設(shè)計(jì)
3.1 系統(tǒng)目標(biāo)
根據(jù)前面所作的需求分析及用戶的需求可知,企業(yè)快信屬于小型的企業(yè)通信軟件,在系統(tǒng)實(shí)施后,應(yīng)達(dá)到以下目標(biāo)。 ??界面設(shè)計(jì)友好、美觀。 ??操作靈活、方便。 ??提供功能強(qiáng)大的信息庫(kù)管理,方便用戶進(jìn)行短信息的編寫。 ??提供郵件群發(fā)功能,提高工作效率。 ??在發(fā)送短信時(shí),可以直接從現(xiàn)有信息庫(kù)中獲取信息內(nèi)容。 ??對(duì)用戶輸入的數(shù)據(jù),進(jìn)行嚴(yán)格的數(shù)據(jù)檢驗(yàn),盡可能地避免人為錯(cuò)誤。 ??數(shù)據(jù)存儲(chǔ)安全、可靠。 3.2 系統(tǒng)功能結(jié)構(gòu)
根據(jù)企業(yè)快信的特點(diǎn),可以將其分為名片夾管理、信息庫(kù)管理、短信群發(fā)、郵件群發(fā)、系統(tǒng)參數(shù)設(shè)置、系統(tǒng)設(shè)置6個(gè)部分,其中各個(gè)部分及其包括的具體功能模塊如圖3-1 所示。 圖3-1 系統(tǒng)功能結(jié)構(gòu) 3.3 業(yè)務(wù)流程圖
企業(yè)快信的系統(tǒng)流程如圖3-2 所示。
圖3-2 系統(tǒng)流程圖 3.4 系統(tǒng)預(yù)覽
企業(yè)快信由多個(gè)程序頁(yè)面組成,下面僅列出幾個(gè)典型界面。 系統(tǒng)登錄頁(yè)面如圖3-3所示,該頁(yè)面用于實(shí)現(xiàn)管理員登錄功能;主頁(yè)如圖3-4所示,該頁(yè)面用于實(shí)現(xiàn)顯示系統(tǒng)導(dǎo)航、操作業(yè)務(wù)流程和版權(quán)信息等功能。
圖3-3 系統(tǒng)登錄頁(yè)面
圖3-4 主 頁(yè) 發(fā)送短信頁(yè)面如圖3-5所示,該頁(yè)面用于實(shí)現(xiàn)將短信息同時(shí)發(fā)給多個(gè)接受者的功能;同時(shí),為方便用戶還提供了從客戶及員工列表中選擇接收者及從信息庫(kù)中選擇指定信息的功能。
圖3-5 發(fā)送短信頁(yè)面 郵件群發(fā)頁(yè)面如圖3-6所示,該頁(yè)面用于實(shí)現(xiàn)將郵件同時(shí)發(fā)給多個(gè)接受者的功能;同時(shí),為方便用戶還提供了從客戶及員工列表中選擇接收者的功能。
圖3-6 郵件群發(fā) 3.5 文件夾組織結(jié)構(gòu)
在編寫代碼之前,需要把系統(tǒng)中可能用到的文件夾先創(chuàng)建出來(lái)(例如創(chuàng)建一個(gè)名為img 的文件夾,用來(lái)保存程序中使用的效果圖片),這樣不但方便以后的開(kāi)發(fā)工作,也可以規(guī)范軟件的整體架構(gòu)。本人在開(kāi)發(fā)企業(yè)快信時(shí),設(shè)計(jì)了如圖3-7 所示的文件夾架構(gòu)。在開(kāi)發(fā)時(shí),只需要將所創(chuàng)建的文件保存在相應(yīng)的文件夾中就可以了。
圖3-7 企業(yè)快信文件夾組織結(jié)構(gòu) 4 系統(tǒng)詳細(xì)設(shè)計(jì)
4.1 數(shù)據(jù)庫(kù)設(shè)計(jì)
4.1.1 數(shù)據(jù)庫(kù)分析 由于本系統(tǒng)是一個(gè)小型實(shí)用的信息群發(fā)系統(tǒng),提供了名片夾和信息庫(kù)的功能,用戶可以將常用的人員保存到名片夾中,將常用的短語(yǔ)保存到信息庫(kù)中,以方便使用。基于這個(gè)特點(diǎn)以及語(yǔ)言特點(diǎn),本系統(tǒng)將采用MySQL 數(shù)據(jù)庫(kù)作為底層數(shù)據(jù)庫(kù),以方便用戶使用本系統(tǒng)。 4.1.2 數(shù)據(jù)庫(kù)概念設(shè)計(jì) 根據(jù)以上對(duì)系統(tǒng)所作的需求分析和系統(tǒng)設(shè)計(jì),規(guī)劃出本系統(tǒng)中使用的數(shù)據(jù)庫(kù)實(shí)體分別為類型實(shí)體、檔案實(shí)體、常用短語(yǔ)實(shí)體、管理員實(shí)體。下面將給出幾個(gè)關(guān)鍵實(shí)體的E-R 圖。 ??檔案實(shí)體 檔案實(shí)體包括編號(hào)、客戶名稱、地址、郵政編碼、所屬區(qū)域、手機(jī)號(hào)碼、郵件地址、銀行賬戶、開(kāi)戶銀行和聯(lián)系人屬性,檔案實(shí)體的E-R 圖如圖4-1 所示。
圖4-1 檔案實(shí)體E-R 圖 ??短信實(shí)體 短信實(shí)體包括編號(hào)、收信人的手機(jī)號(hào)碼、短信內(nèi)容、發(fā)信人和發(fā)送時(shí)間屬性,短信實(shí)體的E-R 圖如圖4-2 所示。 ??常用短語(yǔ) 常用短語(yǔ)實(shí)體包括編號(hào)、類型和內(nèi)容,常用短語(yǔ)實(shí)體的E-R 圖如圖4-3 所示。
圖4-2 短信實(shí)體E-R 圖圖4-3 類型實(shí)體E-R 圖 4.1.3 數(shù)據(jù)庫(kù)邏輯結(jié)構(gòu)設(shè)計(jì) 在數(shù)據(jù)庫(kù)概念設(shè)計(jì)中已經(jīng)分析了檔案實(shí)體、常用短語(yǔ)實(shí)體和類型實(shí)體,這些實(shí)體對(duì)象是數(shù)據(jù)表結(jié)的基本模型,最終的數(shù)據(jù)模型都要實(shí)施到數(shù)據(jù)庫(kù)中,形成整體的數(shù)據(jù)結(jié)構(gòu)。圖4-4 為通過(guò)PowerDesigner創(chuàng)建完成的數(shù)據(jù)庫(kù)模
圖4-4 數(shù)據(jù)庫(kù)模型圖 表tb_customer 的表結(jié)構(gòu)如表4-1 所示。 表4-1 表tb_customer 的表結(jié)構(gòu) 字 段 名數(shù) 據(jù) 類 型是 否 為 空是 否 主 鍵默 認(rèn) 值描 述IDintNoYesID(自動(dòng)編號(hào))namevarchar(50)NoNULL客戶名稱addressvarchar(100)NoNULL地址postcodevarchar(6)NoNULL郵政編碼areavarchar(20)YesNULL所屬區(qū)域mobileTelavarchar(15)NoNULL手機(jī)號(hào)碼emailvarchar(100)NoNULL郵件地址bankNovarchar(30)YesNULL銀行帳號(hào)bankNamevarchar(20)YesNULL開(kāi)戶銀行l(wèi)inkNamevarchar(10)NoNULL聯(lián)系人 表tb_shortLetter 的表結(jié)構(gòu)如表4-2 所示。 表4-2 表tb_shortLetter 的表結(jié)構(gòu) 字 段 名數(shù) 據(jù) 類 型是 否 為 空是 否 主 鍵默 認(rèn) 值描 述IDintNoYesID(自動(dòng)編號(hào))toManvarchar(200)NoNULL發(fā)信人手機(jī)號(hào)碼contentvarchar(500)NoNULL短信內(nèi)容fromManvarchar(30)NoNULL發(fā)信人sendTimedatetimeNogetdate()發(fā)送時(shí)間 4.2 公共模塊設(shè)計(jì)
在開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)用到一些公共模塊,如數(shù)據(jù)庫(kù)連接及操作的類、字符串處理的類及Struts配置等,因此,在開(kāi)發(fā)系統(tǒng)前首先需要設(shè)計(jì)這些公共模塊。下面將具體介紹企業(yè)快信系統(tǒng)中所需要的公共模塊的設(shè)計(jì)過(guò)程。 4.2.1 數(shù)據(jù)庫(kù)連接及操作類的編寫 數(shù)據(jù)庫(kù)連接及操作類通常包括連接數(shù)據(jù)庫(kù)的方法getConnection()、執(zhí)行查詢語(yǔ)句的方法executeQuery()、執(zhí)行更新操作的方法executeUpdate()、關(guān)閉數(shù)據(jù)庫(kù)連接的方法close().下面將詳細(xì)介紹如何編寫企業(yè)快信系統(tǒng)中的數(shù)據(jù)庫(kù)連接及操作的類ConnDB。 (1)定義ConnDB類 定義用于進(jìn)行數(shù)據(jù)庫(kù)連接及操作的類ConnDB,并將其保存到com.wgh.core包中,同時(shí)定義該類中所需的全局變量及構(gòu)造方法。代碼如下: public class ConnDB { public Connection conn = null; // 聲明Connection對(duì)象的實(shí)例 public Statement stmt = null; // 聲明Statement對(duì)象的實(shí)例 public ResultSet rs = null; // 聲明ResultSet對(duì)象的實(shí)例 private static String propFileName = "/com/connDB.properties"; // 指定資源文件保存的位置 private static Properties prop = new Properties(); // 創(chuàng)建并實(shí)例化Properties對(duì)象實(shí)例 private static String dbClassName = " ";//定義保存數(shù)據(jù)庫(kù)驅(qū)動(dòng)的變量 private static String dbUrl = " "; private static String dbUser = "sa"; private static String dbPwd = ""; public ConnDB() {//定義構(gòu)造方法 try {//捕捉異常 //將Properties文件讀取到InputStream對(duì)象中 InputStream in = getClass().getResourceAsStream(propFileName); prop.load(in); // 通過(guò)輸入流對(duì)象加載Properties文件 dbClassName = prop.getProperty("DB_CLASS_NAME");//獲取數(shù)據(jù)庫(kù)驅(qū)動(dòng) dbUrl = prop.getProperty("DB_URL", dbUrl);//獲取URL dbUser = prop.getProperty("DB_USER", dbUser);//獲取登錄用戶 dbPwd = prop.getProperty("DB_PWD", dbPwd);//獲取密碼 } catch (Exception e) { e.printStackTrace(); // 輸出異常信息 } } } (2)將數(shù)據(jù)保存到資源文件中 為了方便程序移植,將數(shù)據(jù)庫(kù)連接所需信息保存到properties文件中,并將該文件保存在com包中。connDB.properties文件的內(nèi)容如下: DB_CLASS_NAME=com.mysql.jdbc.Driver DB_URL=jdbc:mysql://127.0.0.1:3306/db_expressLetter DB_USER=sa DB_PWD= (3)創(chuàng)建數(shù)據(jù)庫(kù)連接 創(chuàng)建連接數(shù)據(jù)庫(kù)的方法getConnection(),該方法返回connection對(duì)象的一個(gè)實(shí)例。getConnection()方法的實(shí)現(xiàn)代碼如下: public static Connection getConnection() { Connection conn = null; try { Class.
forName
(
dbClassName
).newInstance(); conn = DriverManager.
getConnection
(
dbUrl
,?
dbUser
,?
dbPwd
); } catch (Exception ee) { ee.printStackTrace(); } if (conn == null) { System.err.println("警告: DbConnectionManager.getConnection() 獲得數(shù)據(jù)庫(kù)鏈接失敗.\r\n\r\n鏈接類型:"+?
dbClassName
+ "\r\n鏈接位置:"+?
dbUrl
+ "\r\n用戶/密碼"+?
dbUser
+ "/" +?
dbPwd
); } return conn; } (4)創(chuàng)建查詢方法 創(chuàng)建執(zhí)行查詢語(yǔ)句的方法exccuteQuery(),返回值為Resultset結(jié)果集。executeQuery()方法的代碼如下: public ResultSet executeQuery(String sql) { try { // 捕捉異常 conn =?
getConnection
(); // 調(diào)用getConnection()方法構(gòu)造Connection對(duì)象的一個(gè)實(shí)例conn stmt = conn.createStatement(ResultSet.
TYPE_SCROLL_INSENSITIVE
, ResultSet.
CONCUR_READ_ONLY
); rs = stmt.executeQuery(sql); } catch (SQLException ex) { System.
err
.println(ex.getMessage()); // 輸出異常信息 } return rs; // 返回結(jié)果集對(duì)象 } (5)創(chuàng)建更新操作方法 創(chuàng)建執(zhí)行更新操作的方法executeUpdate(),返回值為int型的整數(shù),代表更新的行數(shù)。executeUpdate()方法的代碼如下: public int executeUpdate(String sql) { int result = 0; // 定義保存返回值的變量 try { // 捕捉異常 conn =?
getConnection
(); // 調(diào)用getConnection()方法構(gòu)造Connection對(duì)象的一個(gè)實(shí)例conn stmt = conn.createStatement(ResultSet.
TYPE_SCROLL_INSENSITIVE
, ResultSet.
CONCUR_READ_ONLY
); result = stmt.executeUpdate(sql); // 執(zhí)行更新操作 } catch (SQLException ex) { result = 0; // 將保存返回值的變量賦值為0 } return result; // 返回保存返回值的變量 } (6)關(guān)閉數(shù)據(jù)庫(kù)連接 創(chuàng)建關(guān)閉數(shù)據(jù)庫(kù)連接的方法close()。close()方法的代碼如下: public void close() { try { // 捕捉異常 if (rs != null) { // 當(dāng)ResultSet對(duì)象的實(shí)例rs不為空時(shí) rs.close(); // 關(guān)閉ResultSet對(duì)象 } if (stmt != null) { // 當(dāng)Statement對(duì)象的實(shí)例stmt不為空時(shí) stmt.close(); // 關(guān)閉Statement對(duì)象 } if (conn != null) { // 當(dāng)Connection對(duì)象的實(shí)例conn不為空時(shí) conn.close(); // 關(guān)閉Connection對(duì)象 } } catch (Exception e) { e.printStackTrace(System.
err
); // 輸出異常信息
}
}
4.2.2 字符串處理類的編寫
字符串處理類主要用于解決程序中經(jīng)常出現(xiàn)的有關(guān)字符串處理的問(wèn)題,包括將數(shù)據(jù)庫(kù)中及頁(yè)面中有中文問(wèn)題的字符串進(jìn)行正確地顯示和對(duì)字符串中的空值進(jìn)行處理的方法。其代碼如下:
public class ChStr {
public static String toChinese(String strvalue) {
try {
if (strvalue == null) {
return "";
} else {
strvalue = new String(strvalue.getBytes("ISO8859_1"), "GBK").trim();
return strvalue;
}
} catch (Exception e) {
return "";
}
}
//處理字符串中的空值
public static final String nullToString(String v, String toV) {
if (v == null || "".equals(v)) {
v = toV;
}
return v;
}
4.2.3 配置Struts
Struts框架需要通過(guò)一個(gè)專門的配置文件來(lái)控制,就是struts-config.xml。那么網(wǎng)站是怎么找到這個(gè)Struts的配置文件的呢?只要在web.xml中配置一下就可以了。具體實(shí)現(xiàn)代碼如下:
"1.0"
?encoding=
"UTF-8"
?>
"managerForm" type= "com.wgh.actionForm.ManagerForm" ?/>
…//此處省略其他 "managerForm" ?path= "/manager" scope= "request" type= "com.wgh.action.Manager" validate= "true" >
"managerLoginok" path= "/main.jsp" ?/>
"managerQuery" path= "/manager.jsp" ?/>
"managerAdd" path= "/manager_ok.jsp?para=1" ?/>
"pwdQueryModify" path= "/pwd_Modify.jsp" ?/>
"managerDel" path= "/manager_ok.jsp?para=3" ?/>
"modifypwd" ?path= "/main.jsp" ?/>
"error" ?path= "/error.jsp" ?/>
4.3.1 主頁(yè)概述 管理員通過(guò)系統(tǒng)登錄模塊的驗(yàn)證后,可以登錄到企業(yè)快信的系統(tǒng)主頁(yè)。系統(tǒng)主頁(yè)主要包括系統(tǒng)導(dǎo)航欄、顯示區(qū)和版權(quán)信息3部分。其中,導(dǎo)航欄中的功能菜單將根據(jù)登錄管理員的權(quán)限進(jìn)行顯示。例如,系統(tǒng)管理員tsoft登錄后,將擁有整個(gè)系統(tǒng)的全部功能,因?yàn)樗浅?jí)管理員。系統(tǒng)主頁(yè)的運(yùn)行效果如圖4-5 所示。
圖4-5 企業(yè)快信主頁(yè)運(yùn)行效果
4.3.2 主頁(yè)技術(shù)分析
在實(shí)現(xiàn)系統(tǒng)主頁(yè)時(shí),最關(guān)鍵的就是如何實(shí)現(xiàn)導(dǎo)航菜單.本系統(tǒng)中采用的方法是通過(guò)Javascript+CSS樣式控制<div>標(biāo)記來(lái)實(shí)現(xiàn)。其具體實(shí)現(xiàn)方法如下:
(1)在要顯示導(dǎo)航菜單的位置添加相應(yīng)的主菜單項(xiàng)。具體代碼如下:
"main.jsp" >首頁(yè) 'navlink' style="CURSOR: hand " >名片夾管理 'navlink' style="CURSOR: hand " >信息庫(kù)管理 'navlink' style="CURSOR: hand " >發(fā)送短信 "sendMail.do?action=addMail" >郵件群發(fā) "sysParameterSet.do?action=parameterQuery" ?>系統(tǒng)參數(shù)設(shè)定 'navlink' style="CURSOR: hand ">系統(tǒng)設(shè)置 "#" ?onClick="quit()">退出系統(tǒng)
4.4.1 名片夾管理模塊概述 名片夾管理模塊主要包括客戶信息管理和員工信息管理,其中,客戶信息管理包括查看客戶列表、添加客戶信息、修改客戶信息和刪除客戶信息4個(gè)功能:?jiǎn)T工信息管理包括查看員工列表、添加員工信息、修改員工信息和刪除員工信息4個(gè)功能。 4.4.2 名片夾管理模塊技術(shù)分析 名片夾管理模塊主要包括客戶管理和員工管理兩部分,由于這兩部分的買現(xiàn)方法大致相同,所以本節(jié)將以客戶管理為例介紹名片夾管理模塊。在實(shí)現(xiàn)客戶管理時(shí),需要編寫客戶管理對(duì)應(yīng)的ActionForm類和Action實(shí)現(xiàn)類。下面將詳細(xì)介紹如何編寫客戶管理的ActionForm類和創(chuàng)建客戶管理的Action實(shí)現(xiàn)類。 編寫客戶管理的ActionForm類
在客戶管理中,只涉及到一個(gè)數(shù)據(jù)表,即tb_customer(客戶信息表),根據(jù)這個(gè)數(shù)據(jù)表可以得出客戶管理的ActionForm類。客戶管理的ActionForm類的名稱為CustomerForm,具體代碼如下:
public class CustomerForm extends ActionForm {
private String bankNo;//銀行賬號(hào)
private String area;//所屬區(qū)域
private String email;//郵箱
private String address;//地址
private String mobileTel;//手機(jī)號(hào)碼
private String name;//客戶全稱
private int ID;//編號(hào)
private String bankName;//開(kāi)戶銀行
private String postcode;//郵政編碼
private String linkName;//聯(lián)系人
public String getBankNo() {
return bankNo;
}
public void setBankNo(String bankNo) {
this.bankNo = bankNo;
}
… //此處省略其他控制客戶信息的get()和set()方法
}創(chuàng)建客戶管理的Action實(shí)現(xiàn)類
客戶管理的Action實(shí)現(xiàn)類Customer繼承了Action類.在該類中,首先需要在該類的構(gòu)造方法中實(shí)例化客戶管理的CustomerDAO類(該類用于實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互)。Action實(shí)現(xiàn)類的主要方法是execute(),該方法會(huì)被自動(dòng)執(zhí)行其本身沒(méi)有具體的事務(wù),是根據(jù)通過(guò)HttpservletRequest的getParamer()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的??蛻艄芾淼腁ction實(shí)現(xiàn)類的關(guān)鍵代碼如下: public class Customer extends Action{ private CustomerDAO customerDAO = null; private ChStr chStr=new ChStr(); public Customer() { this.customerDAO = new CustomerDAO(); } public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){ String action = request.getParameter("action"); System.out.println("獲取的查詢字符串:" + action); if (action == null || "".equals(action)) { request.setAttribute("error","您的操作有誤!"); return mapping.findForward("error"); }else if ("customerQuery".equals(action)) { return customerQuery(mapping, form, request,response); }else if("customerAdd".equals(action)){ return customerAdd(mapping, form, request,response); }? else if("customerModify".equals(action)){ return customerModify(mapping, form, request,response); } request.setAttribute("error", "操作失敗!"); return mapping.findForward("error"); } ……//此處省略了該類中其他方法,這些方法將在后面的具體過(guò)程中給出。 } 4.4.3 查看客戶信息列表的實(shí)現(xiàn)過(guò)程 查看客戶信息列表使用的數(shù)據(jù)表:tb_customer 管理員登錄后,選擇“名片夾管理/客戶管理”命令,進(jìn)入到查看客戶列表頁(yè)面,在該頁(yè)面中將以列表形式顯示全部客戶信息,同時(shí)提供添加客戶信息、修改客戶信息、刪除客戶信息的超鏈接。查看客戶信息列表頁(yè)面的運(yùn)行效果如圖4-6 所示。
圖4-6 客戶信息列表頁(yè)面 在查看客戶信息列表的方法customerQuery()中,首先調(diào)用CustomerDAO類中的query()方法查詢?nèi)靠蛻粜畔?,再將返回的查詢結(jié)果保存到HttpServletRequest對(duì)象的CustomerQuery參數(shù)中.查看客戶信息列表的方法CustomerQuery()的具體代碼如下: private ActionForward customerQuery(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) { request.setAttribute("customerQuery", customerDAO.query(0)); return mapping.findForward("customerQuery"); } 查看客戶信息列表使用的CustomerDAO類的方法是query()。該方法只有一個(gè)用于指定客戶ID的參數(shù)id(如果記的值為null,則查詢?nèi)靠蛻粜畔ⅲ缓髮⒉樵兘Y(jié)果保存到List集合中并返回該集合的實(shí)例。Query()方法的具體代碼如下: public List query(int id) { List customerList = new ArrayList(); CustomerForm cF = null; String sql=""; if(id==0){ sql = "SELECT * FROM tb_customer"; }else{ sql = "SELECT * FROM tb_customer WHERE ID=" +id+ ""; } ResultSet rs = conn.executeQuery(sql); try { while (rs.next()) { cF = new CustomerForm(); cF.setID(rs.getInt(1)); cF.setName(rs.getString(2)); ……//此處省略獲取并設(shè)置其他屬性的代碼 cF.setLinkName(rs.getString(10)); customerList.add(cF); } } catch (SQLException ex) {} finally{ conn.close();//關(guān)閉數(shù)據(jù)庫(kù)連接} return customerList; } 4.4.4 添加客戶信息的實(shí)現(xiàn)過(guò)程 添加客戶信息使用的數(shù)據(jù)表:tb_customer. 管理員登錄后,選擇“名片夾管理/客戶管理”命令,進(jìn)入到查看客戶列表頁(yè)面。在該頁(yè)面中,單擊“添加客戶信息”超鏈接,進(jìn)入到添加客戶信息頁(yè)面。添加客戶信息頁(yè)面的運(yùn)行效果如圖4-7 所示。
圖4-7 添加客戶信息頁(yè)面 設(shè)計(jì)添加客戶信息頁(yè)面
添加客戶信息頁(yè)面主要用于收集輸入的客戶信息及通過(guò)自定義的Javascript函數(shù)驗(yàn)證輸入信息是否合法,該頁(yè)面中所涉及的表單元素如表4-3 所示。
表4-3 表tb_customer的表結(jié)構(gòu)名 稱元 素 類 型重 要 屬 性含義titleformaction="customer.do?action=customerAdd" method="post" onSubmit="return checkform(form1)表單nametextsize=”50”客戶全稱areatextsize=”30”所在區(qū)域addresstextsize=”60”地址postcodetextsize=”6”郵政編碼linkNametextsize=”20”聯(lián)系人mobileTeltextsize=”30”手機(jī)號(hào)碼Emailtextsize=”50”郵箱bankNametextsize=”20”開(kāi)戶銀行bankNotextsize=”30”銀行帳號(hào)Submitsubmitvalue=”提交”“提交”按鈕Submit2resetvalue=”重置”“重置”按鈕Submit3buttononClick="window.location.href='customer.do?action=customerQuery'" value="返回"“返回”按鈕修改客戶的Action實(shí)現(xiàn)類
在添加客戶信息頁(yè)面中輸入合法的客戶信息后,單擊“提交”按鈕,網(wǎng)頁(yè)會(huì)訪問(wèn)一個(gè)URL,即
customer.do?action=customerAdd
從該URL地址中可以知道添加客戶信息模塊涉及到的action的參數(shù)值為customerAdd,也就是當(dāng)action=customerAdd時(shí),會(huì)調(diào)用添加客戶信息的方法customerAdd()。具體實(shí)現(xiàn)代碼如下
if("customerAdd".equals(action)){
return customerAdd(mapping, form, request,response);
}
在添加客戶信息的方法customerAdd()首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,并用獲得指定屬性的getXXX()重新設(shè)置該屬性的setXXX()方法,然后調(diào)用customerDAO類中的insert()方法,將添加的客戶信息保存到數(shù)據(jù)表中,并將返回值保存到變量ret中.如果返回值為l,表示信息添加成功,將頁(yè)面重定向到添加信息成功頁(yè)面:如果返回值為2,表示該客戶信息己經(jīng)添加,將錯(cuò)誤提示信息“該客戶信息己經(jīng)添加!”保存到HttpServletRequest對(duì)象的error參數(shù)中,然后將頁(yè)面重定向到錯(cuò)誤提示信息頁(yè)面;否則將錯(cuò)誤提示信息“客戶信息添加失敗里”保存到HttpServletRequest對(duì)象的error參數(shù)中,并將頁(yè)面重定向到錯(cuò)誤提示頁(yè)面.添加客戶信息的方法customerAdd()的具體代碼如下:
private ActionForward customerAdd(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
CustomerForm customerForm = (CustomerForm) form;
//此處需要進(jìn)行中文轉(zhuǎn)碼
customerForm.setName(chStr.
toChinese
(customerForm.getName()));
customerForm.setAddress(chStr.
toChinese
(customerForm.getAddress()));
customerForm.setArea(chStr.
toChinese
(customerForm.getArea()));
customerForm.setBankName(chStr.
toChinese
(customerForm.getBankName()));
customerForm.setLinkName(chStr.
toChinese
(customerForm.getLinkName()));
int ret = customerDAO.insert(customerForm);
System.
out
.println("返回值ret:"+ret);
if (ret == 1) {
return mapping.findForward("customerAdd");
} else if(ret==2){
request.setAttribute("error","該客戶信息已經(jīng)添加!");
return mapping.findForward("error");
}else {
request.setAttribute("error","添加客戶信息失??!");
return mapping.findForward("error");
}
}編寫添加客戶信息的CustomerDAO類的方法
添加客戶信息使用的customerDAO類的方法是insert()。在insert()方法中,首先從數(shù)據(jù)表tb_customer中查詢輸入的客戶全稱是否存在,如果存在,將標(biāo)志變最設(shè)置為2,否則將輸入的信息保存到客戶信息表中,并將返回值賦給標(biāo)志變量,最后返回標(biāo)志變量。Insert()方法的具體代碼如下:
public int insert(CustomerForm cF) {
String sql1="SELECT * FROM tb_customer WHERE name='"+cF.getName()+"'";
ResultSet rs = conn.executeQuery(sql1);
String sql = "";
int falg = 0;
try {
if (rs.next()) { falg=2;} else {
sql = "INSERT INTO tb_customer (id,name,address,area,postcode,mobileTel,email,bankName,bankNo,linkName) values(null,'" + cF.getName() + "','" +cF.getAddress() +"','"+cF.getArea()+"','"+cF.getPostcode()+"','"+cF.getMobileTel()+"','"+ cF.getEmail()+"','"+cF.getBankName()+"','"+cF.getBankNo()+"','"+cF.getLinkName()+"')";
falg = conn.executeUpdate(sql);
System.
out
.println("添加客戶信息的SQL:" + sql);
conn.close();
}
} catch (SQLException ex) { falg=0;}
return falg;
}Struts-config.xml文件配置
在struts-config.xml文件中配置添加客戶信息所涉及的<forward>元素。代碼如下:
parseInt
(request.getParameter("id"))); int ret = customerDAO.delete(customerForm); if (ret != 0) { request.setAttribute("error","刪除客戶信息失?。?!"); return mapping.findForward("error"); } else { return mapping.findForward("customerDel"); } } 刪除客戶信息使用的CustomerDAO類的方法是delete()。在delete()方法中,將從客戶信息表tb_customer中刪除符合條件的數(shù)據(jù),并返回執(zhí)行結(jié)果。delete()方法的具體代碼如下: public int delete(CustomerForm customerForm) { int flag=0; try{ String sql = "DELETE FROM tb_customer where id=" + customerForm.getID() +""; flag = conn.executeUpdate(sql); }catch(Exception e){ System.
out
.println("刪除客戶信息時(shí)產(chǎn)生的錯(cuò)誤:"+e.getMessage());
}finally{conn.close();//關(guān)閉數(shù)據(jù)庫(kù)連 }
return flag;
}
在struts-config.xml文件中配置添加客戶信息所涉及的<forward>元素。代碼如下:
4.5.1 發(fā)送短信模塊功能概述 發(fā)送短信模塊主要包括發(fā)送短信、查看發(fā)送日志兩個(gè)功能。這兩個(gè)功能之間的業(yè)務(wù)流程如圖4-8 所示。
圖4-8 業(yè)務(wù)流程圖 發(fā)送短信模塊是企業(yè)快信系統(tǒng)的核心模塊之一,操作員可以通過(guò)該模塊對(duì)企業(yè)內(nèi)部的所有或者部分員工,以短信的形式發(fā)送企業(yè)通知、工資條、具體技術(shù)、開(kāi)會(huì)等信息,并且這個(gè)信息是群體發(fā)送的。 4.5.2 發(fā)送短信的實(shí)現(xiàn)過(guò)程 發(fā)送短信使用的數(shù)據(jù)表:tb_shortLetter、tb_shortIfo、tb_info、tb_infoType、tb_customer和tb_personnel。 管理員登錄后,選擇“發(fā)送短信”命令,進(jìn)入到發(fā)送短信頁(yè)面。在該頁(yè)面中展開(kāi)“名片夾”中的客戶列表或員工列表,將顯示相應(yīng)的客戶名稱或員工姓名,單擊指定的客戶名稱或員工姓名,系統(tǒng)會(huì)自動(dòng)將該客戶或員工的手機(jī)號(hào)碼添加到右側(cè)的“接收方手機(jī)號(hào)碼”文本框中。如果用戶想從信息庫(kù)中選擇常用短語(yǔ)直接添加到“短信內(nèi)容”文本框中,可以先在“添加常用短語(yǔ)”下拉列表框中選擇相應(yīng)的類別,然后單擊“確定”按鈕,在打開(kāi)的網(wǎng)頁(yè)對(duì)話框中單擊要添加的信息,即可將該信息添加到“短信內(nèi)容”文本框中。短信內(nèi)容填寫完畢,單擊“發(fā)送”按鈕即可發(fā)送。發(fā)送短信頁(yè)面的運(yùn)行效果如圖圖4-9 所示。
圖4-9 企業(yè)快信的短信發(fā)送界面 4.5.3 發(fā)送短信模塊技術(shù)分析 在實(shí)現(xiàn)發(fā)送短信模塊時(shí),需要編寫發(fā)送短信模塊對(duì)應(yīng)的ActionForm類和Action實(shí)現(xiàn)類。下面將詳細(xì)介紹如何編寫發(fā)送短信模塊的ActionForm類和創(chuàng)建發(fā)送短信的Action實(shí)現(xiàn)類。 編寫收發(fā)短信的ActionForm類
在發(fā)送短信模塊中,涉及到tb_shortLetter(短信表)、tb_customer(客戶信息表)、tb_personnel(員工信息表)、tb_shortInfo(常用短語(yǔ)表)、tb_infoType(信息類型表)和tb_Parameter(系統(tǒng)參數(shù)表)6個(gè)數(shù)據(jù)表,與這6個(gè)數(shù)據(jù)表相對(duì)應(yīng)的ActionForm類分別為ShortLetterForm、CustomerForm、PerrsonnelForm、shortInfoForm、InfoTypyForm、ParameterForm,這些類都是由屬性及對(duì)應(yīng)的getXXX()和setXX()方法組成,不再詳細(xì)介紹。
(2) 創(chuàng)建發(fā)送短信的Action類
收發(fā)短信模塊的Action實(shí)現(xiàn)類SendLetter維承了Action類.在該類中.首先需要在該類的構(gòu)造方法中分別實(shí)例化收發(fā)短信模塊的SendLetterDAO類、員工管理摸塊的PersonnelDAO類、客戶管理模塊的CustomerDAO類和信息類別管理模塊的InfoTypeDAO類。Action實(shí)現(xiàn)類的主要方法是execute(),該方法會(huì)被自動(dòng)執(zhí)行其本身沒(méi)有具體的事務(wù),是根據(jù)HttpServletRequest的getParameter()方法獲取的Action參數(shù)值執(zhí)行相應(yīng)方法的。發(fā)送短信模塊Action實(shí)現(xiàn)類的關(guān)健代碼如下:
public class SendLetter extends Action{
private SendLetterDAO sendLetterDAO = null;
private PersonnelDAO personnelDAO=null;
private CustomerDAO customerDAO=null;
private InfoTypeDAO infoTypeDAO=null;
private ChStr chStr=new ChStr();
public SendLetter() {
this.sendLetterDAO = new SendLetterDAO();
this.personnelDAO=new PersonnelDAO();
this.customerDAO=new CustomerDAO();
this.infoTypeDAO=new InfoTypeDAO();
}
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){
String action = request.getParameter("action");
System.out.println("獲取的查詢字符串:" + action);
if (action == null || "".equals(action)) {
request.setAttribute("error","您的操作有誤!");
return mapping.findForward("error");
}else if ("addLetter".equals(action)) {
return addLetter(mapping, form, request,response);
}else if("sendLetter".equals(action)){
return sendLetter(mapping, form, request,response);
}else if("historyQuery".equals(action)){
return queryHistory(mapping, form, request,response);
}
request.setAttribute("error", "操作失??!");
return mapping.findForward("error");
}
//編寫短信頁(yè)面應(yīng)用的查詢方法,用于查詢收信人列表信息類別
private ActionForward addLetter(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response) {
request.setAttribute("personnelQuery",personnelDAO.query(0));
request.setAttribute("customerQuery",customerDAO.query(0));
request.setAttribute("shortInfo",infoTypeDAO.query(0));
return mapping.findForward("addLetter");
}
//群發(fā)短信
private ActionForward sendLetter(ActionMapping mapping, ActionForm form,
HttpServletRequest request,HttpServletResponse response){
SendLetterForm sendLetterForm=(SendLetterForm) form;
sendLetterForm.setContent(chStr.toChinese(sendLetterForm.getContent()));
sendLetterForm.setFromMan(chStr.toChinese(sendLetterForm.getFromMan()));
String ret=sendLetterDAO.sendLetter(sendLetterForm);
if(ret.equals("ok")){
return mapping.findForward("sendLetter");
}else{
request.setAttribute("error",ret);
return mapping.findForward("error");
}
}
//查看歷史記錄
private ActionForward queryHistory(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
request.setAttribute("history",sendLetterDAO.query());
return mapping.findForward("queryHistory");
}
}
(3) 編寫發(fā)送短信的SendLetterDAO類的方法
發(fā)送短信使用的sendLetterDAO類的方法是sendLetter()。在sendLettr()方法中,首先從數(shù)據(jù)表tb_parameter中查詢出系統(tǒng)參數(shù)(即使用飛信接口發(fā)送短信所使用的端口、帳號(hào)、密碼等參數(shù)),然后調(diào)用發(fā)送短信的方法mySend(),最后將發(fā)送短信的日志信息保存到數(shù)據(jù)表tbshortLetter中。sendLetter()方法的具體代碼如下:
public class SendLetterDAO {
private ConnDB conn=new ConnDB();
List parameter = ParameterDAO.query();
ParameterForm parameterForm = (ParameterForm) parameter.get(0);
private smssend smssendinformation = null;
// 發(fā)送短信
public String sendLetter(SendLetterForm s) {
String ret = "";
String info="";
String sendnum="";
String flag="";
try {
String sql_p="SELECT * FROM tb_parameter";
ResultSet rs=conn.executeQuery(sql_p);
if(rs.next()){
String phone=parameterForm.getDevice();
String pwd=parameterForm.getBaud();
info=s.getContent();
sendnum=s.getToMan();
flag=mySend(phone,pwd,sendnum,info);//發(fā)送短信
if(flag.equals("ok")){
String sql = "INSERT INTO tb_shortLetter values(null,'" +s.getToMan() +"','"+s.getContent()+"','"+s.getFromMan()+"',now())";
int r= conn.executeUpdate(sql);
System.out.println("添加短信發(fā)送歷史記錄的SQL:" + sql);
if(r==0){
ret="添加短信發(fā)送歷史記錄失??!";
}else{
ret="ok";
}
}else{
ret=flag;
}
}else{
ret="發(fā)送短信失敗!";
}
} catch (Exception e) {
System.out.println("發(fā)送短信產(chǎn)生的錯(cuò)誤:" + e.getMessage());
ret = "發(fā)送短信失敗!";
}finally{
conn.close();
}
return ret;
}
public static String mySend(String phone,String pwd,String to,String msg) throws HttpException, IOException{?
String ret="";
HttpClient client = new HttpClient();??
PostMethod post = new PostMethod("
http://
quanapi.sinaapp.com/fet
ion.php
");
post.addRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");//在頭文件中設(shè)置轉(zhuǎn)碼??
NameValuePair[] data ={??
new NameValuePair("u", phone),??
new NameValuePair("p", pwd),??
new NameValuePair("to",to),??
new NameValuePair("m",msg),??
};??
post.setRequestBody(data);??
client.executeMethod(post);??
Header[] headers = post.getResponseHeaders();??
int statusCode = post.getStatusCode();??
System.out.println("statusCode:"+statusCode);??
for(Header h : headers){??
System.out.println(h.toString());??
}??
post.releaseConnection();
ret = "ok";
return ret;}?
//中間省略查詢?nèi)罩镜拇a
}
(4) struts-config.xml文件配置
在struts-config.xml文件中配置發(fā)送短信所設(shè)計(jì)的
4.5.4 單元測(cè)試
在開(kāi)發(fā)完收發(fā)短信模塊后,為了保證程序正常運(yùn)行,要對(duì)模塊進(jìn)行單元測(cè)試.單元測(cè)試在程序開(kāi)發(fā)中非常重要,只有通過(guò)單元測(cè)試才能發(fā)現(xiàn)模塊中的不足之處,才能及時(shí)地糾正程序中出現(xiàn)的錯(cuò)誤。進(jìn)入到發(fā)送短信頁(yè)面,在“接收方手機(jī)號(hào)碼”文本框中
輸入相應(yīng)的手機(jī)號(hào)碼(多個(gè)手機(jī)號(hào)碼間用逗號(hào)分隔),在“短信內(nèi)容”文本框中輸入短信內(nèi)容后,單擊“發(fā)送”按鈕,正常情況下,會(huì)彈出“短信發(fā)送成功”的提示對(duì)話框,如果發(fā)送失敗,則會(huì)彈出“短信發(fā)送失敗”的提示對(duì)話框。
4.6 發(fā)送郵件模塊設(shè)計(jì)
4.6.1 發(fā)送郵件模塊功能概述
發(fā)送郵件模塊也是企業(yè)快信系統(tǒng)的核心模塊之一,操作員可以通過(guò)該模塊對(duì)企業(yè)內(nèi)部的所有或者部分員工,以E-mail 電子郵件的形式發(fā)送企業(yè)通知、工資條等。另外,由于E-mail 有信息容量大、包含附件的兩大優(yōu)點(diǎn),使它支持更多的信息內(nèi)容,可以攜帶更豐富的資料,比較適合發(fā)送技術(shù)信息、會(huì)議主題、工作內(nèi)容等信息,并且這個(gè)信息是群體發(fā)送的。該模塊的運(yùn)行效果如圖4-10 所示。
圖4-10 企業(yè)快信的郵件發(fā)送界面 4.6.2 發(fā)送郵件模塊技術(shù)分析 在實(shí)現(xiàn)郵件發(fā)送模塊時(shí),需要編寫郵件發(fā)送模塊對(duì)應(yīng)的ActionForm類和Action實(shí)現(xiàn)類。下面將詳細(xì)介紹如何編寫郵件發(fā)送模塊的ActionForm類和創(chuàng)建郵件發(fā)送的Action實(shí)現(xiàn)類。 (1) 編寫郵件群發(fā)的ActionForm類 雖然在郵件發(fā)送模塊中,只涉及到tb_customer(客戶信息表)和tb_personnel(員工信息表)兩個(gè)數(shù)據(jù)表,但是郵件群發(fā)并不是只涉及到與這兩個(gè)數(shù)據(jù)表相對(duì)應(yīng)的ActionForm類--CustomerForm和PcrsonnelForm,本模塊中還涉及到用于獲取發(fā)送郵件所需的表單信息的ActionForm類―sendMailForm.? (2) 創(chuàng)建郵件發(fā)送的Action實(shí)現(xiàn)類 郵件發(fā)送模塊的Action實(shí)現(xiàn)類SendMail繼承了Action類。在該類中,首先需要在該類的構(gòu)造方法中分別實(shí)例化郵件發(fā)送模塊的SendMailDAO類、員工管理模塊的PersonnelDAO類和客戶管理模塊的customerDAO類.Action實(shí)現(xiàn)類的主要方法是execute(),該方法會(huì)被自動(dòng)執(zhí)行.這個(gè)方法本身沒(méi)有具體的事務(wù),它是根據(jù)HttpServletRequest的getParameter()方法獲取的action參數(shù)值執(zhí)行相應(yīng)方法的。郵件發(fā)送模塊Action實(shí)現(xiàn)類的關(guān)鍵代碼如下: public class SendMail extends Action{ private SendMailDAO sendMailDAO = null; private PersonnelDAO personnelDAO=null; private CustomerDAO customerDAO=null; private ChStr chStr=new ChStr(); public SendMail() { this.sendMailDAO = new SendMailDAO(); this.personnelDAO=new PersonnelDAO(); this.customerDAO=new CustomerDAO(); } public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response){ String action = request.getParameter("action"); System.
out
.println("獲取的查詢字符串:" + action); if (action == null || "".equals(action)) { request.setAttribute("error","您的操作有誤!");//將錯(cuò)誤信息保存到error中 return mapping.findForward("error");//轉(zhuǎn)到顯示錯(cuò)誤信息的頁(yè)面 }else if ("addMail".equals(action)) { return addMail(mapping, form, request,response); }else if("sendMail".equals(action)){ return sendMail(mapping, form, request,response); } request.setAttribute("error", "操作失敗!"); return mapping.findForward("error"); } } 4.6.3 發(fā)送郵件模塊實(shí)現(xiàn)過(guò)程 (1) 發(fā)送郵件的Action實(shí)現(xiàn)類 在郵件群發(fā)頁(yè)面中填寫相應(yīng)的郵件信息后,單擊“發(fā)送”按鈕,網(wǎng)頁(yè)會(huì)訪問(wèn)一個(gè)URL,即sendMail.do?action=sendMail。從該URL地址中可以知道發(fā)送郵件時(shí)涉及到的action的參數(shù)值為sendMail,也就是當(dāng)action=sendMail時(shí),會(huì)調(diào)用群發(fā)郵件的方法sendMail()。具體代碼如下: if("sendMail".equals(action)){ return sendMail(mapping, form, request,response); } 在發(fā)送郵件的方法sendMail()中,首先需要將接收到的表單信息強(qiáng)制轉(zhuǎn)換成ActionForm類型,并用獲得指定屬性的getXXX()方法獲取主題、附件、內(nèi)容屬性并進(jìn)行轉(zhuǎn)碼后,再使用setXXX()方法重新設(shè)置該屬性,然后調(diào)用SendMailDAO類中的sendMail()方法發(fā)送郵件,并將返回值保存到變量ret中。如果返回值為ok,則表示郵件發(fā)送成功,將頁(yè)面重定向到郵件發(fā)送成功頁(yè)面:否則,將錯(cuò)誤提示信息保存到HttpservletRequest對(duì)象的errror參數(shù)中,并且將頁(yè)面重定向到錯(cuò)誤提示信息頁(yè)面.群發(fā)郵件的方法sendMail()的具體代碼如下: private ActionForward sendMail(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response){ SendMailForm sendMailForm=(SendMailForm) form; sendMailForm.setTitle(chStr.
toChinese
(sendMailForm.getTitle())); sendMailForm.setAdjunct(chStr.
toChinese
(sendMailForm.getAdjunct())); sendMailForm.setContent(chStr.
toChinese
(sendMailForm.getContent())); int ret=sendMailDAO.sendMail(sendMailForm); if(ret==0){ request.setAttribute("error","郵件發(fā)送失?。?); return mapping.findForward("error"); }else{ return mapping.findForward("sendMail"); } } (2) 編寫發(fā)送郵件的SendMailDAO類的方法 發(fā)送郵件使用的SendMailDA0類的方法是sendMail()。具體代碼如下: public int sendMail(SendMailForm s) { int ret = 0; String from = s.getAddresser(); String to = s.getAddressee(); String subject = s.getTitle(); String content = s.getContent(); String password = s.getPwd(); String path = s.getAdjunct(); try { String mailserver ="smtp."+from.substring(from.indexOf('@')+1,from.length());//在Internet上發(fā)送郵件時(shí)的代碼 Properties prop = new Properties(); prop.put("mail.smtp.host", mailserver); prop.put("mail.smtp.auth", "true"); Session sess = Session.
getDefaultInstance
(prop);
sess.setDebug(true);
MimeMessage message = new MimeMessage(sess);
message.setFrom(new InternetAddress(from));// 給消息對(duì)象設(shè)置發(fā)件人
//設(shè)置收件人
String toArr[]=to.split(",");
InternetAddress[] to_mail=new InternetAddress[toArr.length];
for(int i=0;i BCC ,to_mail);
//設(shè)置主題
message.setSubject(subject);
Multipart mul = new MimeMultipart(); // 新建一個(gè)MimeMultipart對(duì)象來(lái)存放多個(gè)BodyPart對(duì)象
BodyPart mdp = new MimeBodyPart(); // 新建一個(gè)存放內(nèi)容的BodyPart對(duì)象
mdp.setContent(content, "text/html;charset=gb2312");
mul.addBodyPart(mdp); // 將含有信件內(nèi)容的BodyPart加入到MimeMulitipart對(duì)象中
if(!path.equals("") && path!=null){//當(dāng)存在附件時(shí)
// 設(shè)置信件的附件(用本機(jī)上的文件作為附件)
mdp = new MimeBodyPart(); // 新建一個(gè)存放附件的BodyPart
String adjunctname = new String(path.getBytes("GBK"), "ISO-8859-1"); // 此處需要轉(zhuǎn)碼,否則附件中包括中文時(shí),將產(chǎn)生亂碼
path = (System. getProperty ("java.io.tmpdir") + "/" + path).replace("\\", "/");
System. out .println("路徑:" + path);
FileDataSource fds = new FileDataSource(path);
DataHandler handler = new DataHandler(fds);
mdp.setFileName(adjunctname);
mdp.setDataHandler(handler);
mul.addBodyPart(mdp);
}
message.setContent(mul); // 把mul作為消息對(duì)象的內(nèi)容
message.saveChanges();
Transport transport = sess.getTransport("smtp");
// 以smtp方式登錄郵箱,第1個(gè)參數(shù)是發(fā)送郵件用的郵件服務(wù)器SMTP地址,第2個(gè)參數(shù)為用戶名,第3個(gè)參數(shù)為密碼
transport.connect(mailserver, from, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
ret = 1;
} catch (Exception e) {
e.printStackTrace();
System. out .println("發(fā)送郵件產(chǎn)生的錯(cuò)誤:" + e.getMessage());
ret = 0;}
return ret;
}
4.6.4 單元測(cè)試
在開(kāi)發(fā)完郵件群發(fā)模塊后,為了保證程序正常運(yùn)行,一定要對(duì)模塊進(jìn)行單元測(cè)試,下面是原始的實(shí)現(xiàn)郵件發(fā)送的代碼:
if(!path.equals("") && path!=null){//當(dāng)存在附件時(shí)
// 設(shè)置信件的附件(用本機(jī)上的文件作為附件)
mdp = new MimeBodyPart(); // 新建一個(gè)存放附件的BodyPart
String adjunctname=path;
path = (System. getProperty ("java.io.tmpdir") + "/" + path).replace("\\", "/");
System. out .println("路徑:" + path);
FileDataSource fds = new FileDataSource(path);
DataHandler handler = new DataHandler(fds);
mdp.setFileName(adjunctname);
mdp.setDataHandler(handler);
mul.addBodyPart(mdp);
}
通過(guò)上面的代碼實(shí)現(xiàn)的郵件群發(fā)會(huì)存在以下問(wèn)題:當(dāng)發(fā)送帶有中文名稱的郵件后.使用Outlook軟件接收郵件時(shí),附件的名稱將產(chǎn)生亂碼。這是因?yàn)樵卩]件群發(fā)的Action類中,己經(jīng)將接收到的附件名稱轉(zhuǎn)換為GBK編碼格式,而在OutLook接收附件時(shí),采用的編碼格式為ISO-8859-1,所以此處還需要將其轉(zhuǎn)換為巧IOS-8859-1編碼格式。那為什么還要在Action類中進(jìn)行轉(zhuǎn)碼呢?這是因?yàn)槿绻贿M(jìn)行轉(zhuǎn)換,在類中通過(guò)文件名獲取文件路徑時(shí),將不能正常獲取。修改后的完成郵件群發(fā)的代碼如下:
if(!path.equals("") && path!=null){//當(dāng)存在附件時(shí)
// 設(shè)置信件的附件(用本機(jī)上的文件作為附件)
mdp = new MimeBodyPart(); // 新建一個(gè)存放附件的BodyPart
String adjunctname = new String(path.getBytes("GBK"), "ISO-8859-1"); // 此處需要轉(zhuǎn)碼,否則附件中包括中文時(shí),將產(chǎn)生亂碼
path = (System. getProperty ("java.io.tmpdir") + "/" + path).replace("\\", "/");
System. out .println("路徑:" + path);
FileDataSource fds = new FileDataSource(path);
DataHandler handler = new DataHandler(fds);
mdp.setFileName(adjunctname);
mdp.setDataHandler(handler);
mul.addBodyPart(mdp);
5 技術(shù)分析
5.1 開(kāi)發(fā)技巧與難點(diǎn)分析
5.1.1 添加收信人
為了方便用戶,系統(tǒng)中需要提供通過(guò)單擊客戶列表(或員工列表)中的客戶全稱(或員工姓名),即可將該客戶(或員工)的聯(lián)系手機(jī)號(hào)碼添加到“接收方手機(jī)號(hào)碼”文本框中的功能。實(shí)現(xiàn)該功能時(shí).需要編寫自定義的JavaScript函教add(),在該函數(shù)中需要對(duì)手機(jī)號(hào)碼進(jìn)行驗(yàn)證并實(shí)現(xiàn)累加手機(jī)號(hào)碼到“接收方手機(jī)號(hào)碼”文本框中的功能。Add()函數(shù)的具體代碼如下:
function add(mobileTel){
if(checkTel(mobileTel)){
s=form1.toMan.value;
if(s.length>=11){
arrS=s.split(",");
flag=false;//標(biāo)記是否已經(jīng)添加
for(i=0;i "javascript" >
function selectInfo(info){
window.returnValue=info;
window.close();}
(3)在selectShortInfo.jsp中顯示常用短語(yǔ)的代碼上添加一個(gè)空的超鏈接,并且在其onClick事件中調(diào)用selectInfo()函數(shù)。具體代碼如下:
<%=s.getContent()%>
5.2 使用Java Mail 組件
Java Mail 是Sun 公司發(fā)布用來(lái)處理E-mail 的API,是一種可選的、用于讀取、編寫和發(fā)送電子消息的包(標(biāo)準(zhǔn)擴(kuò)展)。使用Java Mail 可以創(chuàng)建MUA(Mail User Agent,郵件用戶代理的簡(jiǎn)稱)類型的程序,它類似于Eudora、Pine 及Microsoft Outlook 等郵件程序。其主要目的不是像發(fā)送郵件或提供MTA(Mail Transfer Agent,郵件傳輸代理)類型程序那樣用于傳輸、發(fā)送和轉(zhuǎn)發(fā)消息,而是可以與MUA 類型的程序交互,以閱讀和撰寫電子郵件。MUA 依靠MTA 處理實(shí)際的發(fā)送任務(wù)。Java Mail API 中提供很多用于處理E-mail 的類,其中比較常用的有Session(會(huì)話)類、Message(消息)類、Address(地址)類、 Authenticator(認(rèn)證方式)類、Transport(傳輸)類、Store(存儲(chǔ))類和Folder(文件夾)類7 個(gè)類。這7 個(gè)類都可以在Java Mail API 的核心包mail.jar 中找到,下面進(jìn)行