引?言?
??? 對于電子商務(wù)網(wǎng)站的用戶來說,他們需要的是一個穩(wěn)定,美觀的購物環(huán)境,和一個設(shè)計良好的購物流程。但是在線購買之余,用戶們也需要一些交流和反饋,這就需要留言簿,論壇,電郵等一些模塊同樣設(shè)置在網(wǎng)站中。但是這些模塊大多在網(wǎng)站中分散設(shè)計,用戶使用起來很不方便,對于后臺管理來說,分散而非集中的電子商務(wù)模塊是耗費成本的。本文集中講述了其中的一個模塊:電郵部分如何與電子商務(wù)集成。它的設(shè)計模式,同樣可以適用于其他各個模塊。?
程序功能模塊和分化?
??? Java Mail System包含了如下三個部分:?
(1)類似于Outlook的客戶端軟件Java Mail Box,允許用戶在當(dāng)前系統(tǒng)中配置其他網(wǎng)站的電郵,包括發(fā)送郵件,接收郵件,包括圖片,HTML文檔,附件的處理。?
(2)服務(wù)器端的電郵Java Mail Web Service,使用JavaMail構(gòu)建了一個SMTP,IMAP的服務(wù)器(或者是POP3,協(xié)議可以更改)。電子商務(wù)網(wǎng)站中的用戶在注冊成功的同時,就擁有了該系統(tǒng)的一個帳號,無需再配置,可以收發(fā)郵件一些操作,對服務(wù)器的文件夾進(jìn)行常規(guī)操作。?
(3)與電子商務(wù)的集成:Tomcat的JNDI解決方案,實現(xiàn)了電子商務(wù)系統(tǒng)和Java mail system的連接,當(dāng)用戶的注冊信息,和其他在電子商務(wù)網(wǎng)站中的信息用JDBC寫入數(shù)據(jù)庫后,JNDI指向了共同的CONNECTING POOL,這些,一方面通過修改TOMCAT的配置文件,令一方面,JSP的頁面元素中,指明JNDI?
Java Mail System: Java Mail Box?
??? 運用面向?qū)ο蟮脑?,將程序分為顯示模塊,邏輯模塊,和各個顯示間的通信。用戶名,密碼,SMTP服務(wù)器等等用戶信息,用Java Bean描述。它和電子商務(wù)的集成,主要是讓用戶方便的調(diào)出這個郵件工具,來配置在其他網(wǎng)站上的電郵,點擊連接即顯示面板。?
??? Java Mail Box當(dāng)中用了18個類,網(wǎng)頁中的APPLET標(biāo)記需要引用包派生自JApplet的CLASS文件:
????當(dāng)瀏覽器讀到此行時,它會創(chuàng)建到一個連接WEB服務(wù)器來提取CLASS文件,內(nèi)嵌與瀏覽器中的JAVA解釋器的類加載器接著從該文件中加載CLASS文件,加載過程中,類加載器必須解析此類中使用的其他類,這樣,類加載器才會知道它需要加載更多的類才會運行該APPLET,因此,瀏覽器就會創(chuàng)建到該服務(wù)器的另外的連接來提取這些類,通常要耗費幾分鐘的時間。打包成JAR文件,可以使用另一個HTTP請求下載。JAR包括了JAVA MAIL BOX所需要的所有圖形,類,屬性文件,減少了下載的,時間。然后從APPLET調(diào)用?在JSP中指向APPLET,就實現(xiàn)了JAVA MAIL BOX的集成。
Java Mail System: Java Mail Web Service
??? Java Mail Web Service的設(shè)計結(jié)構(gòu),取決于電子商務(wù)如何實現(xiàn)。這里,兩者采用的都是一個經(jīng)典的MVC。即:Java Bean 做邏輯,JSP做顯示層,Servlet做Controller,同樣,還是用BEAN封裝了用戶的信息,由于JSP的容器使用了Apache的Tomcat,這個電郵服務(wù)器可看作一個3層結(jié)構(gòu),如圖:?

圖一:電子郵件服務(wù)器的3層結(jié)構(gòu)?
集成:JNDI方面?
【Naming Service的查詢模型】

圖二:Naming Service 的查詢模型?
??? 可以看到,對于一個Client來說,一個Naming Service 提供了對于一個對象(Object)到名字(Name)的綁定和查詢(Binding and Lookup),以提供對于資源的訪問,就是說,對于一個程序,訪問這個Name就等于訪問了其綁定的Object?
JNDI(Java Naming and Directory interface)是JAVA提供的命名服務(wù)解決方案,它的靈魂是Context接口,并且用 SubContext和InitialContext來輔助。
【Tomcat中的JNDI配置】?
??? Tomcat中,指明JNDI,需要對兩個文件作出修改,并且要確定做到參數(shù)一致:系統(tǒng)服務(wù)器配置文件SERVER.XML和應(yīng)用描述文件WEB.XML,描述如下:?
??????????
??????????????????? type="javax.mail.Session"/>??? ——>JNDI所屬類名?
集成:JDBC連接緩沖池方面?
??? 在DATASOURCE中事先建立了多個數(shù)據(jù)庫連接,這些數(shù)據(jù)庫保存到連接池(CONNECT POOL)中,JAVA程序訪問數(shù)據(jù)庫時,只需要從連接池中取出空閑狀態(tài)的數(shù)據(jù)庫連接,當(dāng)程序訪問數(shù)據(jù)庫結(jié)束,再將數(shù)據(jù)庫連接放回到連接池,這樣可以提高訪問數(shù)據(jù)庫的效率,如果WEB 應(yīng)用每一次都接收到用戶的客戶請求,都和數(shù)據(jù)庫建立一個連接,數(shù)據(jù)庫操作結(jié)束就斷開連接,這樣會耗費大量的時間和資源,因為數(shù)據(jù)庫每一次配置鏈接都要將CONNECTION對象加載到內(nèi)存中,再驗證用戶名和密碼。?
??? 例如,當(dāng)一個電子商務(wù)網(wǎng)站的用戶進(jìn)行操作的時候,下訂單,提交(Commit),撤銷(DrawBack)涉及到一個狀態(tài)BEAN的HASHMAP的清空和添加。用戶的在線時間是10多分鐘左右,而實際操作數(shù)據(jù)庫的連接時間,是微秒級的。顯然,必須要用到連接池技術(shù)。 ?
集成:JNDI,JDBC共同放置實現(xiàn)?
DataSource對象是由TOMCAT提供的,因此不能在程序中采用創(chuàng)建一個實例的方式來生成DataSource對象,而需要JNDI,來獲得DataSource的應(yīng)用?

圖三:在JNDI和JDBC的共同放置下,實現(xiàn)了一個用戶和數(shù)據(jù)庫的訪問
【程序中InitialContext()的應(yīng)用】?
Context ctx = new InitialContext();?
if(ctx == null ) ?throw new Exception("No Context");?
Session mailsession =(Session)ctx.lookup("java:comp/env/mail/session");?
結(jié)束語?
??? 采用了JAVA MAIL API后,電子商務(wù)網(wǎng)站的設(shè)計模式,直接影響著Java Mail System 的實現(xiàn)。有時候,需要訪問SQL ,Oracle,Cloudscape不同的數(shù)據(jù)庫,就需要運用DAO和工廠模式來設(shè)計一致接口,同理可以設(shè)想,將一個通用的模式來實現(xiàn)Java Mail System和電子商務(wù)的連接,其意義在于,為其他的模塊連接提供了一個模板。有了這些輔助功能,一個電子商務(wù)功能才更豐富,自身也更有吸引力。?
參考文獻(xiàn):?
1《JAVA2 核心技術(shù)》? 卷Ⅰ原理???????????????? 機械工業(yè)出版社???????? 2002年2月?
2《JAVA2核心技術(shù)》?? 卷Ⅱ高級特性???????????? 機械工業(yè)出版社???????? 2002年4月?
3 《JSP應(yīng)用開發(fā)詳解(第二版)》飛思科技產(chǎn)品研發(fā)中心? 電子工業(yè)出版社?? 2004年3月?
4《JSP應(yīng)用開發(fā)詳解(第二版)》 飛思科技產(chǎn)品研發(fā)中心? 電子工業(yè)出版社?? 2004年3月?
5《J2EE企業(yè)級應(yīng)用開發(fā)》飛思科技產(chǎn)品研發(fā)中心???????? 電子工業(yè)出版社?? 2003年8月?
6《Tomcat與Java Web開發(fā)技術(shù)詳解》飛思科技產(chǎn)品研發(fā)中心 電子工業(yè)出版社2004年4月?
7《Mastering JSP》???????????? Todd Cook???????? SYBEX??????????????? 2003年3月?
8《VC++ SMTP協(xié)議電子郵件傳送剖析》 朗銳?? 01空間??????????????? 2003年9月12日?
9《JavaMail操作的總結(jié)》土人制造編程園地JAVA討論區(qū) the_east_key 2004年4月15日?
10《用JAVA開發(fā)EMAIL工具之接收郵件》馮睿??? UML軟件工程組織?? 2002年12月20日?
11《用JAVA MAIL API編寫可帶附件的郵件程序》?? 邢雅莉?? 賽迪網(wǎng)? 2001年9月11日?
12《Cloudscape和Websphere Application Server:使用核心JDBC API》 Bennett Falt?
? IBM Data Management Group?? http://www.developworks.ibm.com?
13《創(chuàng)建J2EE中的郵件發(fā)送和接收程序》?? 蘇洋??????????? 賽迪網(wǎng)?? 2002年9月4日?
14《JAVA的網(wǎng)絡(luò)編程,用JAVA實現(xiàn)SMTP服務(wù)器》谷和啟?? 賽迪網(wǎng)?? 2003年3月21日 ?
15《JNDI overview, Part 1: An introduction to naming services》?????? java one?
16JNDI Documentation???????????????????????? http://www.java.sun.com/products/doc.html 17JAVA MAIL API Online?
