第一篇:讀書筆記《Java郵件開發(fā)詳解》
讀書筆記《Java郵件開發(fā)詳解》
DNS
MX
自動(dòng)回復(fù) 不填from 避免循環(huán)回復(fù)。
Pop3:可以查郵件總數(shù)、已占空間。
電子郵件的RFC822格式:
Return-Path:代表郵件的回復(fù)地址,該字段的內(nèi)容由接收郵件的SMTP服務(wù)器填寫,接收郵件的SMTP服務(wù)器從郵件發(fā)送程序發(fā)出的mail form命令中獲得內(nèi)容。
Received:通常格式是:Received from A by B for C,A為發(fā)送方,B為接收方,C為收件人的郵箱地址。常常被用來追蹤?quán)]件傳輸?shù)穆肪€和分析郵件的來源。From:
To:
Subject:
Date:
Cc:
Bcc:
郵件的頭字段可以擴(kuò)充成MIME類型。Content-Type: multipart/mixed;頭字段指定編碼方法。另外,也定義了郵件頭字段的內(nèi)涵。
MIME消息的頭字段具體資源的數(shù)據(jù)類型和組合消息的組合關(guān)系,都是通過消息頭中的Content-Type頭字段來指定的,格式為“主類型/子類型”的形式出現(xiàn),主類型有text、image、audio、application、multipart、message等;每個(gè)主類型下面又都有好多子類型。
MIME消息可以有三種組合關(guān)系:
Multipart/mixed 混合組合 內(nèi)容可以是文本、附件等等。
Multipart/related 關(guān)聯(lián)組合 如郵件正文要使用HTML代碼引用內(nèi)嵌的圖片資源。意思是說某些資源要關(guān)聯(lián)引用另外的資源。
Multipart/alternative 選擇組合這三種關(guān)系是可以隨意嵌套的,比如你寄一個(gè)復(fù)雜的盒子出去,這個(gè)盒子里面可以有好多好多小盒子,而每個(gè)盒子都可以看作一個(gè)MIME。
其他的頭字段都是顧名思義的,略!
設(shè)置內(nèi)容的另一種方法:
setContent(Object object, String type)
setContent(body, “text/html;charset=gb2312”);
另外一種客戶端的發(fā)信方式:SMTP服務(wù)器功能的郵件發(fā)送程序
具有SMTP服務(wù)器功能的郵件發(fā)送程序會(huì)根據(jù)收件人地址的域名,直接連接到該域的SMTP服務(wù)器和進(jìn)行郵件發(fā)送。根本用不到??
JNDI:命名式:把對(duì)象綁定到context中;目錄式:保存對(duì)象的屬性信息實(shí)際應(yīng)用中命名式和對(duì)象式常常結(jié)合使用。
Tomcat可以通過配置文件自己創(chuàng)建javax.mail.Session
META-INF/context.xml
auth=”Container” type=”javax.mail.Session” mail.smtp.host=”smtp.sina.com.cn” mail.transport.protool=”smtp” mail.smtp.auth=”true” /> 在web.xml中說明一下,有資源是被tomcat創(chuàng)建的,如果換了別的應(yīng)用服務(wù)器也要?jiǎng)?chuàng)建。 不知道書上為什么費(fèi)那么大勁找個(gè)Session出來,還是個(gè)沒有校驗(yàn)的Session,收發(fā)郵件時(shí)都得再寫用戶名密碼給服務(wù)器。為什么不隨便new一個(gè)或者從System中調(diào)一個(gè)呢?感覺基本用不著,我自己寫一個(gè)properties文件豈不是更好? JAF 對(duì)于通過JAF封裝的數(shù)據(jù),應(yīng)用程序通過JAF提供的接口可以完成如下功能:。訪問數(shù)據(jù)源中的數(shù)據(jù) 。獲知數(shù)據(jù)源的數(shù)據(jù)類型 。獲知可對(duì)數(shù)據(jù)源進(jìn)行的各種操作 。用戶對(duì)數(shù)據(jù)源執(zhí)行某種操作時(shí),自動(dòng)創(chuàng)建執(zhí)行該操作的軟件部件的實(shí)例對(duì)象 好像是用來封裝數(shù)據(jù)源的(比如:聲音文件,java文件),這樣的好處是?可以識(shí)別文件類型對(duì)文件直接操作?不知道,回頭再看看。好像是附件用的,ms。 郵件搜索 用于創(chuàng)建邏輯組合關(guān)系的類AND、OR、NOT、Comparison 用于創(chuàng)建具體搜索條件的類DATE、CONTENT、HEADER 例:SearchTerm st = new AndTerm(new FromStringTerm(“zx@sina.com”),new ReceivedDateTerm(ComparisonTerm.EQ, new Date())); 這里主要說明ComparisonTerm類,常用于日期類的比較其中使用留個(gè)常量來標(biāo)識(shí)六種不同的操作:EQ(=)、GE(>=)、GT(>)、LE(<=)、LT(<)、NE(!=)郵件的解析與顯示 如果Message的類型是“text/*”直接顯示之。如果Message的類型 (getContentType())是“multipart/mixed”,調(diào)getContent()方法得到Multipart,對(duì)其調(diào)getCount()看看其中有多少個(gè)BodyPart,遍歷之;當(dāng)MIME類型為“text/*”顯示之,當(dāng)MIME是圖片、聲音或附件等二進(jìn)制時(shí),調(diào) getDataHandler方法得到封裝數(shù)據(jù)的對(duì)象,然后調(diào)其getInputSteam??.;當(dāng)MIME類型為“mutlipart/mixed”再次遍歷得到其中的BodyPart。 注意:Message.isMimeType(“multipart/*”)這個(gè)方法居然可以寫通配附?!看看API的解釋:If the subType of mimeType is the special character '*', then the subtype is ignored during the comparison.。 處理內(nèi)嵌類型的multipart(multipart/related)直接交給IE瀏覽器去顯示就好了: response.setContentType(”message/rfc822”); message.writeTo(response.getOutputStream()); 總結(jié): 總的來說這本書講的很基礎(chǔ),前半部分告訴我們什么是email、email是如何收發(fā)的及email的格式、著重說明了smtp協(xié)議和pop3協(xié)議,甚至告訴大家怎么使用協(xié)議的命令收發(fā)郵件,這些對(duì)于使用API做web開發(fā)的程序員來說用處不是很大,但第3章郵件的組織結(jié)構(gòu)講述的還是比較好的;后半部分主要對(duì)Javamail進(jìn)行說明,但是我個(gè)人覺得不如IBM的在線教程介紹的實(shí)用,主要是例子寫的別扭,呵呵。不過里面有一些細(xì)節(jié)可以起到拓寬知識(shí)面的作用。 此書對(duì)開發(fā)webmail用處不是很大,比如對(duì)于pop3協(xié)議來說,如何標(biāo)記郵件,如何建立文件夾,如何移動(dòng)郵件,甚至通訊錄什么的都一點(diǎn)也沒有提到,講郵件搜索的時(shí)候沒有說郵件過濾能不能通過搜索實(shí)現(xiàn)或者還是有更好的辦法。更深入一點(diǎn)的比如用工廠模式解耦合、使用線程池提高性能等更是只字未提。哎~看來還得再找找,實(shí)在不行就操作數(shù)據(jù)庫(kù),那樣麻煩很多但是應(yīng)該什么都能實(shí)現(xiàn)。最近看webmail看的很不爽,網(wǎng)上這樣的東西也很少,感覺沒有一個(gè)套路...郁悶~~ 讀書筆記 1、類和對(duì)象:類是用來定義一組對(duì)象共同具有的狀態(tài)和行為的模版。而對(duì)象是現(xiàn)實(shí)世界中個(gè)體或事物的抽象表示,并且封裝了它們的屬性和行為。 2、為了防止命名沖突,Java采用了管理類文件的機(jī)制,即類包機(jī)制。(package)定義包名的語(yǔ)法格式: “package包名;” Java命名規(guī)則要求包的命名需要使用小寫字母。 3、成員變量和成員方法: 1成員變量是在類體中定義的變量即全局變量,○成員變量一般用于定義對(duì)象的狀態(tài)。成員變量是給對(duì)象使用的,每個(gè)對(duì)象被創(chuàng)建后都會(huì)有屬于自己的屬性,即成員變量。通過修改這些屬性,從而改變對(duì)象的某個(gè)狀態(tài)。 2成員方法是對(duì)象行為的描述。○ 定義成員方法的語(yǔ)法格式: “[修飾符] 返回值類型方法名([形參表]){ ······//方法體 }” 修飾符:可以是:publicprivateprotactedstaticfinall等; 返回值類型:如果方法需要返回值,必須這里聲明方法的返回值類型,可以是基 本數(shù)據(jù)類型(int short double booleanvoid等),也可以是對(duì)象 類型如:數(shù)組、字符串等。 形參表:(可選部分)說明方法被調(diào)用時(shí)應(yīng)該向它傳遞的數(shù)據(jù)。形參表可以有一 個(gè)也可以有多個(gè),當(dāng)有多個(gè)形參時(shí)每個(gè)形參之間要用“,”隔開。 1創(chuàng)建對(duì)象:創(chuàng)建對(duì)象使用到new語(yǔ)句。 4、對(duì)象:○ 聲明并創(chuàng)建對(duì)象的語(yǔ)法格式如下: “類名對(duì)象名=new 類構(gòu)造方法()” 構(gòu)造方法:構(gòu)造方法是類創(chuàng)建對(duì)象是必須執(zhí)行的方法,用于構(gòu)造一個(gè)新的對(duì)象并 初始化對(duì)象屬性。 2訪問對(duì)象的屬性: ○ 語(yǔ)法格式: “對(duì)象名.屬性” 3執(zhí)行對(duì)象的行為:○對(duì)象的行為就是對(duì)象的成員方法,通常說調(diào)用或執(zhí)行對(duì)象的某個(gè)方法。 語(yǔ)法格式: “對(duì)象名.成員方法名();” 4對(duì)象的銷毀:Java提供了垃圾回收機(jī)制,對(duì)不再使用的對(duì)象會(huì)自動(dòng)銷毀,也可○ 以在程序中顯式的為某個(gè)對(duì)象賦null值,使對(duì)象不再被使用。 垃圾回收機(jī)制會(huì)找到并銷毀它,釋放該對(duì)象所占用的資源。 語(yǔ)法格式: “對(duì)象名=null” 1創(chuàng)建類:Java中使用class關(guān)鍵字來創(chuàng)建類。 5、類:○ 聲明并創(chuàng)建類的語(yǔ)法格式: “權(quán)限修飾符 class類名{ 類體; }” 權(quán)限修飾符:(可選項(xiàng))可以使用public protected private 或者省略這3者。類體主要由成員變量和方法兩部分組成。 2成員變量:在Java中對(duì)象的屬性也稱為成員變量?!?/p> 聲明并創(chuàng)建成員變量的語(yǔ)法格式: “權(quán)限修飾符數(shù)據(jù)類型成員變量名;” (用static關(guān)鍵字定義的成員變量被稱為靜態(tài)成員變量即類變量。靜態(tài)成員變量不是分配給每個(gè)對(duì)象的,而是屬于累的變量。它在內(nèi)存中是唯一的,可以直接使用“類名.成員變量名”的格式去訪問,他在內(nèi)存中的位置是固定的,是該類的所有實(shí)例對(duì)象所共享的存儲(chǔ)單元。) 3成員方法:在Java語(yǔ)言中使用成員方法對(duì)應(yīng)與類對(duì)象的行為?!?/p> 定義成員方法的語(yǔ)法格式: “權(quán)限修飾符返回值類型方法名(參數(shù)類型參數(shù)名){ ·······//方法體 }” (同類變量一樣,由static關(guān)鍵字定義的成員方法被稱為類方法,類方法可以不必創(chuàng)建對(duì)象而由類直接訪問,靜態(tài)方法不可以直接調(diào)用非靜態(tài)方法)4局部變量:○在方法體中聲明的變量為局部變量,局部變量的有效范圍為方法體結(jié)束。 5this關(guān)鍵字:在Java語(yǔ)言中用this關(guān)鍵字來代表類對(duì)象的引用,this關(guān)鍵字被○ 隱式地用于引用對(duì)象的成員變量和方法。(在類方法中不可以使用this關(guān)鍵字。)this關(guān)鍵字和和對(duì)象都可以調(diào)用成員變量和方法,兩者的區(qū)別: 事實(shí)上,this引用的就是本類的一個(gè)對(duì)象,在局部變量或方法參數(shù)覆蓋了成員變量時(shí),就要添加this關(guān)鍵字明確引用的是類成員還是局部變量的方法參數(shù)。6類的構(gòu)造方法:構(gòu)造方法與類同名。○ 7類的主方法:主方法是類的入口點(diǎn),它定義了程序從何處開始;主方法提供對(duì)○ 程序流向的控制,Java編譯器通過主方法來執(zhí)行程序。 1)主方法是靜態(tài)的,所以如果要直接在主方法體中 調(diào)用其他方法,則該方法必須也是靜態(tài)的。 2)主方法沒有返回值。 3)主方法的形參為數(shù)組。其中args[0]~args[n]分別 代表程序的第一個(gè)參數(shù)到第n個(gè)參數(shù),可以使用 args.length獲取參數(shù)的個(gè)數(shù)。 Java中完整的類聲明格式: “權(quán)限修飾符class類名{ 權(quán)限修飾符數(shù)據(jù)類型成員變量名1; 權(quán)限修飾符數(shù)據(jù)類型成員變量名2; ······· 權(quán)限修飾符數(shù)據(jù)類型成員變量名n; 權(quán)限修飾符返回值類型成員方法名1(形參類型形參變量){ 方法體 } 權(quán)限修飾符返回值類型成員方法名2(形參類型形參變量){ 方法體 } ······ 權(quán)限修飾符返回值類型成員方法名n(形參類型形參變量){ 方法體 } }” 6.由于類的主方法是靜態(tài)方法所以不可以調(diào)用類中的非靜態(tài)方法所以當(dāng)需要調(diào)用非靜態(tài)方法時(shí)必須創(chuàng)建對(duì)象來調(diào)用。在輸入不同類型的數(shù)據(jù)時(shí)要使用不同的Scanner類對(duì)象,否則只能實(shí)現(xiàn)輸入一種數(shù)據(jù)類型。 7.abstract關(guān)鍵字是定義抽象類的關(guān)鍵字。使用abstract定義的發(fā)放成為抽象方法。抽象方法沒有方法體。抽象方法的唯一意義就是被重載。 個(gè) 人 簡(jiǎn) 歷 個(gè)人信息 姓名:xxxxxxx性別:x 電話:187-xxx7-xxxx年齡:22 郵箱: lxxxxxxx@xxx.com專業(yè):軟件技術(shù)應(yīng)聘職位 Java軟件開發(fā)工程師 專業(yè)技能 熟練掌握CoreJava編程,具有扎實(shí)的編程功底和良好的編碼習(xí)慣 熟練掌握ssh(Struts2+hibernate+Spring)等輕量級(jí)框架 熟悉MVC開發(fā)模式 熟練使用Eclipse/MyEclipse工具進(jìn)行Java軟件開發(fā) 熟練Unix/Linux環(huán)境下Java的應(yīng)用軟件開發(fā) 熟練掌握MySQL、Oracle等數(shù)據(jù)庫(kù)操作,能編寫常用SQL語(yǔ)句 熟悉軟件開發(fā)的主要流程,可以根據(jù)指定要求快速完成設(shè)計(jì)、編碼等工作了解xml、HTML、JavaScript、Ajax技術(shù) 項(xiàng)目經(jīng)驗(yàn) 一、通用電子商務(wù)平臺(tái)(當(dāng)當(dāng)網(wǎng)購(gòu)物系統(tǒng)) 開發(fā)環(huán)境:Linux 開發(fā)工具:MyEclipse8.6,Tomcat,MySQL 技術(shù)實(shí)現(xiàn):Struts2+Hibernate+Spring+JavaScript+JSP+AJAX 項(xiàng)目描述:此系統(tǒng)為網(wǎng)上購(gòu)物系統(tǒng),用戶可以用過該系統(tǒng)實(shí)現(xiàn)網(wǎng)上購(gòu)物、注冊(cè)、登錄、瀏覽商 品、訂貨、生成訂單功能。也包括對(duì)普通商品增刪改查功能和購(gòu)物車內(nèi)書的數(shù)量的增刪改功能。 責(zé)任描述:獨(dú)自完成項(xiàng)目的整個(gè)開發(fā)過程 用戶模塊包括登錄與注冊(cè),主要使用了AJAX對(duì)其輸入的信息進(jìn)行驗(yàn)證,結(jié)合Hibernate存儲(chǔ)和驗(yàn)證用戶登錄等。 商品列表模塊主要是用List集合來展示商品。 購(gòu)物車模塊則是使用Session技術(shù)來保存購(gòu)物車,通過Struts2調(diào)用不通方法來操作購(gòu)物車中的商品集合,實(shí)現(xiàn)對(duì)購(gòu)物車的增刪改查。 訂單模塊主要是用Hibernate對(duì)用戶所買商品的記錄進(jìn)行存儲(chǔ)。 經(jīng)驗(yàn)總結(jié):這個(gè)項(xiàng)目讓我們把我們所學(xué)習(xí)的三大框架以及JS,Ajax等都聯(lián)系起來。尤其是使用 Hibernate經(jīng)常出現(xiàn)異常,在和組內(nèi)成員討論中逐步解決問題,并且更加完善代碼。 通過這個(gè)項(xiàng)目不僅提高我個(gè)人能力,而且還促進(jìn)了與他人合作的能力。 二、教學(xué)管理系統(tǒng) 開發(fā)環(huán)境:Linux 開發(fā)工具:MyEclipse8.6,Tomcat,MySQL 技術(shù)實(shí)現(xiàn):Struts2+JavaScript+JDBC+AJAX 項(xiàng)目描述:項(xiàng)目實(shí)現(xiàn)了管理員對(duì)教師信息的增刪改查和對(duì)學(xué)生選課的管理 責(zé)任描述:獨(dú)立完成該項(xiàng)目的設(shè)計(jì)和實(shí)現(xiàn),主要應(yīng)用MVC模式的設(shè)計(jì)思想對(duì)項(xiàng)目進(jìn)行劃分。 采用JDBC對(duì)教師信息進(jìn)行增刪改查,在學(xué)生選課模塊,使用到了Ajax來對(duì)選課進(jìn) 行檢驗(yàn)。 經(jīng)驗(yàn)總結(jié): 通過該項(xiàng)目讓我對(duì)MVC設(shè)計(jì)模式有了更深一步的認(rèn)識(shí)。在數(shù)據(jù)的存儲(chǔ)方面尤其是 對(duì)JDBC對(duì)數(shù)據(jù)存儲(chǔ)的亂碼問題。通過與組內(nèi)成員的不懈努力將其克服。極大的鍛 煉了自己團(tuán)隊(duì)合作能力,項(xiàng)目計(jì)劃能力以及寫文檔的能力獨(dú)立解決問題的能力。 三、其它項(xiàng)目:BBS論壇,交友網(wǎng)等 實(shí)習(xí)經(jīng)歷 2011/12 — 2012/05北京xxx科技Java工程師實(shí)習(xí)生 教育背景 2010/09―2012/07開封大學(xué)軟件技術(shù) 所獲證書 C+ E國(guó)際軟件工程師Java培訓(xùn)證書 自我評(píng)價(jià) 專業(yè)技能:雖然在大學(xué)里,我學(xué)習(xí)的是軟件技術(shù)專業(yè),已經(jīng)具備了一些專業(yè)方面的基礎(chǔ)知識(shí)。但是想在行業(yè)中有更好的發(fā)展就必須學(xué)習(xí)更多與企業(yè)應(yīng)用相關(guān)的知識(shí),所以我選擇來達(dá)內(nèi)進(jìn)行培訓(xùn)。在學(xué)習(xí)期間,我踏實(shí)勤奮,按時(shí)完成課后練習(xí)及作業(yè),不斷的積累代碼量,同時(shí)也能幫同學(xué)解決一些力所能及的問題。遇到難題能夠主動(dòng)動(dòng)手查閱資料,解決問題。通過項(xiàng)目實(shí)戰(zhàn)提高我的個(gè)人能力和團(tuán)隊(duì)協(xié)作能力。 綜合能力:性格比較沉穩(wěn),為人誠(chéng)懇,不怕吃苦,有高度的責(zé)任心和團(tuán)隊(duì)合作精神。對(duì)環(huán)境的適應(yīng)能力強(qiáng),有較強(qiáng)的團(tuán)隊(duì)意識(shí)和集體榮譽(yù)感,做事情比較認(rèn)真仔細(xì),對(duì)每一件事情都能認(rèn)真對(duì)待,能很好的自我調(diào)節(jié)。樂于學(xué)習(xí)新的知識(shí)與技術(shù)。 1、編寫程序 題目:古典問題:有一對(duì)公母豬,從出生后第3個(gè)月起每個(gè)月都生一對(duì)豬,小豬長(zhǎng)到第三個(gè)月后每個(gè)月又生一對(duì)豬,假如豬都不死,問每個(gè)月的豬總數(shù)為多少? 答案: public class lianxi01 { public static void main(String[] args){ System.out.println(“第1個(gè)月的兔子對(duì)數(shù): 1”); System.out.println(“第2個(gè)月的兔子對(duì)數(shù):1”); int f1 = 1, f2 = 1, f, M=24; for(int i=3;i<=M;i++){ f = f2; f2 = f1 + f2; f1 = f; System.out.println(“第” + i +“個(gè)月的兔子對(duì)數(shù): ”+f2); } } } 2、是非題 2.1 Java程序中的起始類名稱必須與存放該類的文件名相同。() 答案:正確 2.2 原生類中的數(shù)據(jù)類型均可任意轉(zhuǎn)換。() 答案:錯(cuò)誤 3、問答題 3.1 try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后? 答案: 會(huì)執(zhí)行,在return前執(zhí)行。 3.2 sleep()和 wait()有什么區(qū)別: 答案: sleep是線程類(Thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì) 釋放對(duì)象鎖。wait是Object類的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyAll)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。 4、數(shù)據(jù)庫(kù)題 聚集函數(shù)的應(yīng)用 編寫一條sql語(yǔ)句,希望從藝術(shù)家表artist_tab中,看到只有一個(gè)專長(zhǎng)specialty的是哪些專長(zhǎng) 答案:seelctspecialty from artist_tab group by specialty having count(*)=1’; commons-fileupload-1.1.1.jar 上傳文件總結(jié): 1、驗(yàn)證是否要處理的是上傳文件 ServletFileUpload.isMultipartContent(request) 2、創(chuàng)建DiskFileItemFactory 對(duì)象并對(duì)其初始化設(shè)置 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(20 * 1024); factory.setRepository(factory.getRepository()); 3、創(chuàng)建ServletFileUpload 對(duì)象并設(shè)置其編碼方式 ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding(“gbk”); 4、開始獲取上傳文件的集合: formlists = upload.parseRequest(request); 5、設(shè)置上傳文件允許的大小 int size = 2 * 1024 * 1024; 6、循環(huán)遍歷formlists集合來根據(jù)其元素的類型(普通表單域還是文件域)進(jìn)行賦值還是上傳功能 Iterator iter = formlists.iterator(); while(iter.hasNext()){ FileItem formitem =(FileItem)iter.next(); 7、是文件域則執(zhí)行上傳: 具體做法:(1)、獲取文件路徑全名:String name = formitem.getName(); (2)、判斷文件名后綴是否符合要求:!name.endsWith(“mp3”) (3)、判斷文件大小是否符合要求formitem.getSize()> size If/else(4)、都符合要求則上傳: 第一步:判斷文件的名稱不能為空(formitem.getName())、大小不能為0 (formitem.getSize()),如果不符合要求則continue執(zhí)行下一循環(huán) 第 二步: 獲取文件的單純文件名稱: name.substring(name.lastIndexOf(“”) + 1, name.length()); 第 三步: 設(shè)置保存到的服務(wù)器地址:fileDir(“file/”)+ “” + 單純名稱;File saveFile = new File(服務(wù)器地址); 第 四步: 上傳: formitem.write(saveFile);、是普通表單域則將表單項(xiàng)的值賦值給相關(guān)對(duì)象變量,如JavaBean(每一次循環(huán)將該次對(duì)應(yīng)的表單項(xiàng)的值付 給適當(dāng)?shù)淖兞繉?duì)象) String formname = formitem.getFieldName();獲取普通表單項(xiàng)的名稱 String con = formitem.getString(“gbk”); 用formname.equals(““)來判斷 下載文件具體方法: 1、獲取服務(wù)器下載地址并將此地址字符串進(jìn)行編碼: String path=request.getParameter(“path”); 2、創(chuàng)建下載目錄: File file = new File(path);獲取普通表單項(xiàng)的值并編碼 path=new String(path.getBytes(“iso-8859-1”)); 3、創(chuàng)建文件字節(jié)輸入流 InputStream in = new FileInputStream(file); 4、創(chuàng)建輸出流對(duì)象 OutputStream os = response.getOutputStream(); 5、設(shè)置該輸出流的應(yīng)大頭、編碼等配置 response.addHeader(“Content-Disposition”, “attachment;filename=” + new String(file.getName().getBytes(“gbk”),“iso-8859-1”)); response.addHeader(“Content-Length”, file.length()+ “");response.setCharacterEncoding(”gbk“); 6、開始下載: int data = 0; while((data = in.read())!=-1) { os.write(data);} 7、關(guān)閉輸入輸出流 os.close(); in.close(); 郵件接收的方法: DAO: 1、創(chuàng)建郵件接收類:Store 思路:創(chuàng)建Properties類并添加屬性->創(chuàng)建Session對(duì)象->創(chuàng)建store對(duì)象并連接到服務(wù)器和編寫關(guān)閉方法 2、獲取全部已讀郵件的名稱集合的方法 返回String3、獲取全部已讀或未讀郵件的內(nèi)容的方法返回List(包含郵件信息和附件狀態(tài),但不包含具體附件內(nèi)容)思路: 獲取Store對(duì)象->獲取POP3Folder對(duì)象->打開POP3Folder郵件夾->創(chuàng)建FetchProfile預(yù)提取對(duì)象并對(duì)其添加兩個(gè)常用屬性->定義Message[]對(duì)象數(shù)組并設(shè)為null->獲取全部已讀郵件的uid字符串->若字符串不為空則->轉(zhuǎn)換為數(shù)組并進(jìn)行排序->根據(jù)要求的已讀或者未讀條件來獲取全部已讀或未讀郵件信息給Message[](folder.search)->后退三步-若字符串為空則->獲取全部未讀郵件信息Message[]---?開始提取上述郵件數(shù)組中每一個(gè)郵件的詳細(xì)信息->循環(huán)遍歷Message[]數(shù)組->定義MimeMessage對(duì)象并賦值為數(shù)組元素->獲取郵件ID、發(fā)件人、郵件時(shí)間->根據(jù)編碼類型獲取郵件主題->由自定義方法獲取此郵件的附件對(duì)象(String[])->message[i].getFlags().getSystemFlags().toString();->如果判斷返回的郵件有附件,則獲取附件設(shè)置為1,否則設(shè)置為0(來控制頁(yè)面中的附件圖標(biāo)的顯示)->將此郵件信息對(duì)象添加到List中。 4、向數(shù)據(jù)庫(kù)中添加已讀郵件的標(biāo)記的方法:iduid address5、獲取指定郵件中附件的方法:此方法中重點(diǎn)是對(duì)郵件內(nèi)容的編碼處理,故這里重點(diǎn)介紹主要功能語(yǔ)法: 思路:(1)定義該郵件名稱對(duì)應(yīng)的所有附件連接字符串為超鏈接(附件之間用空格隔開)(String,由多個(gè)”附件序號(hào)=&附件名稱=&郵件序號(hào)”組成),定義郵件名稱字符串(已知條件) (2)Multipart multipart =(Multipart)part.getContent();得到該郵件所有的內(nèi)容集合,然后對(duì)其遍歷以獲取每一個(gè)multipart中每一個(gè)BodyPart->判斷此BodyPart是否為附件,若是附件則獲取該附件的名稱 并添加到(1)中的連接字符串中,連接字符串中附件序號(hào)為遍歷變量j 最后: int counts = multipart.getCount(); BodyPart對(duì)象的個(gè)數(shù) //返回MimeMultipart對(duì)象中保存的//關(guān)閉流 response.setContentType(”application/octet-stream“); for(int i = 0;i < counts;i++){} getMailAttach(multipart.getBodyPart(i), emailv); 并返回String[] obj = { 郵件主題內(nèi)容, fileName1 }; 6、對(duì)輸入的UTF7編碼的內(nèi)容進(jìn)行轉(zhuǎn)碼的方法 Servlet: 下載附件servlet: 思路:設(shè)置response.setContentType(”text/html;charset=GBK“)、request.setCharacterEncoding(”GBK“)->創(chuàng)建HttpSession對(duì)象->創(chuàng)建ServletOutputStream對(duì)象->獲取頁(yè)面?zhèn)鬟f變量:附件序號(hào)、附件名稱;獲取session變量”message“->將附件名稱進(jìn)行編碼處理:filename=new String(filename.getBytes(),”ISO-8859-1“)->response.setHeader(”Content-Disposition“,”attachment;filename=“+filename)->由”message”獲取Multipart對(duì)象->由Multipart對(duì)象獲取BodyPart對(duì)象->由BodyPart對(duì)象獲取InputStream對(duì)象->開始下載: int c=0; while((c=is.read())!=-1){out.write(c);} 收取郵件servlet(郵件的全部具體信息): 1、郵箱登陸的驗(yàn)證方法: 思路:獲取表單傳遞值的host username pwd->用DAO(1)中的方法進(jìn)行用戶驗(yàn)證如果正確->創(chuàng)建HttpSession對(duì)象->用session.setAttribute的方法保存登陸的用戶信息(以上三個(gè))-> store.close(); 2、獲取當(dāng)前分頁(yè)頁(yè)面中已讀或未讀的全部郵件的集合(包含郵件信息和附件狀態(tài),但不包含具體附件內(nèi)容)思路:創(chuàng)建HttpSession對(duì)象,并獲session變量host username pwd和request變量”flag“和”Page“-> request.setAttribute(”flag“, flag)->根據(jù)request變量”page”來判斷是否已經(jīng)開始分頁(yè)瀏覽->若沒有則先執(zhí)行DAO(3)方法獲取已讀或未讀的全部郵件集合,然后執(zhí)行自定義分頁(yè)類中的初始化方法獲取上述集合中的第一頁(yè)中的郵件集合,并request.getSession().setAttribute(”pagination", 分頁(yè)類的實(shí)例化);->若已經(jīng)開始分頁(yè),則將當(dāng)前頁(yè)page賦值為已經(jīng)存在的session類型的分頁(yè)類對(duì)象中的getPage方法中返回的page,并且執(zhí)行自定義分頁(yè)類中的類似初始化方法的獲取當(dāng)前頁(yè)面集合的方法(具體看程序) 3、查看郵件詳細(xì)信息:(獲取指定郵件的信息) 思路:同DAO(3)中的方法相似 不同之處是:DAO(3)查詢的是全部已讀或未讀 而本案查詢的是指定的郵件ID TOOLS: 本案中主要為分頁(yè)類的編寫: 1、初始化獲取第一頁(yè)的集合2、獲取已分頁(yè)的當(dāng)前頁(yè)面的集合3、獲取全部記錄數(shù) 4、獲取最大頁(yè)數(shù) 5、獲取當(dāng)前頁(yè)數(shù) 6、獲取分頁(yè)導(dǎo)航第二篇:Java讀書筆記
第三篇:JAVA開發(fā)個(gè)人簡(jiǎn)歷
第四篇:java開發(fā)面試題
第五篇:java web郵件學(xué)習(xí)