Commons-configuration Commons-FileUpload Commons DbUtils Commons BeanUtils Commons CLI Commons Codec Commons Collections Commons DBCP Commons HttpClient Commons IO Commons JXPath Commons Lang Commons Math Commons Net Commons Validator
在看項(xiàng)目代碼的過(guò)程中你會(huì)發(fā)現(xiàn)某些代碼完全可以直接用開(kāi)源框架來(lái)減少代碼量的,如一些帶有util的工具類、一些常用的io操作等; 研究發(fā)現(xiàn)一般的應(yīng)用程序每 1,000 行代碼就包含 20 到 250 個(gè) bug!這個(gè)度量被稱作缺陷密度。因此可得出一個(gè)重要的結(jié)論:更少的代碼意味著更少的缺陷。 個(gè)人認(rèn)為在項(xiàng)目開(kāi)發(fā)過(guò)程中最好能有這樣的習(xí)慣:能用開(kāi)源框架(開(kāi)源框架基本都是眾多程序員智慧的結(jié)晶,經(jīng)得住考驗(yàn))就盡量用,最大限度地減少編碼量;即當(dāng)編碼處理一些業(yè)務(wù)邏輯時(shí)首先想想或找找有沒(méi)相關(guān)的開(kāi)源框架,有適合的就用。 重視Apache Commons 公司的各個(gè)應(yīng)用下基本都有Apache Commons下的一些jar包,但在開(kāi)發(fā)過(guò)程中習(xí)慣性用到這些工具包的童鞋可能比較少(經(jīng)常使用到這些jar包的童鞋可以忽視),其實(shí)用好Apache Commons下工具集和幫助集可以減少好些編碼量。 Apache Commons包含了很多開(kāi)源的工具,用于解決平時(shí)編程經(jīng)常會(huì)遇到的問(wèn)題,減少重復(fù)編碼。
commons-beanutils commons-lang commons-logging commons-collections commons-digester commons-codec commons-jxpath
1. Properties files 2. XML documents 3. Property list files (.plist) 4. JNDI 5. JDBC Datasource 6. System properties 7. Applet parameters 8. Servlet parameters 最主要的作用是讀取資源文件,每一種文件格式都有一個(gè)對(duì)應(yīng)的類,如下
properties文件--PropertiesConfiguration類; xml文件—XMLConfiguration; .ini文件—INIConfiguration; .plist文件—PropertyListConfiguration;
還可以從JNDI中讀取properties—JNDIConfiguration;當(dāng)然還可以使用system的properties--SystemConfiguration
usergui.properties(放在類根路徑下面): colors.background = #FFFFFF colors.foreground = #000080 window.width = 500 window.height = 300 keys=cn,com,org,uk,edu,jp,hk
(1) 一般寫法: public static void readProperties() { InputStream in = null; try { in = new BufferedInputStream((new ClassPathResource( "usergui.properties")).getInputStream()); } catch (IOException e1) { e1.printStackTrace(); } Properties p = new Properties(); try { p.load(in); System.out.println(p.getProperty("colors.background")); } catch (IOException e) { } }
(2) 另一種ResourceBundle方式: public static void readProperties() { Locale locale = Locale.getDefault(); ResourceBundlelocalResource = ResourceBundle.getBundle("usergui", locale); String value = localResource.getString("colors.background"); System.out.println("ResourceBundle: " + value); }
(3) 使用PropertiesConfiguration public static void loadProperty() { try { PropertiesConfigurationconfig = new PropertiesConfiguration( "usergui.properties"); config.setProperty("colors.background", "#00000F");// 更改值 config.save(); config.save("usergui.backup.properties");// save a copy System.out.println(config.getProperty("colors.background")); System.out.println(config.getInt("window.width")); String[] keys = config.getStringArray("keys"); List key2 = config.getList("keys"); for (int i = 0; i < keys.length; i++) { System.out.println(keys[i]); } for (Object str : key2) { System.out.println(str.toString()); } } catch (Exception e) { } }
詳細(xì)案例請(qǐng)參考 文件上傳---普通文件和url文件
這個(gè)工具并不是現(xiàn)在流行的OR-Mapping工具(比如Hibernate),只是簡(jiǎn)化數(shù)據(jù)庫(kù)操作,比如 QueryRunner run = new QueryRunner(dataSource); commons-dbutils是 Apache 組織提供的一個(gè)開(kāi)源 JDBC 工具類庫(kù),對(duì)傳統(tǒng)操作數(shù)據(jù)庫(kù)的類進(jìn)行二次封裝,可以把結(jié)果集轉(zhuǎn)化成List。 項(xiàng)目主頁(yè): http://commons./dbutils/ 文檔地址: http://commons./dbutils/examples.html 下載地址:http://commons./downloads/download_dbutils.cgi (1) org.apache.commons.dbutils DbUtils : 提供如關(guān)閉連接、裝載 JDBC 驅(qū)動(dòng)程序等常規(guī)工作的工具類 QueryRunner : 該類簡(jiǎn)單化了 SQL 查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫(kù)操作,能夠大大減少編碼量。 QueryLoader : 屬性文件加載器,主要用于加載屬性文件中的 SQL 到內(nèi)存中。 (2) org.apache.commons.dbutils.handlers ArrayHandler:將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成對(duì)象數(shù)組 ArrayListHandler將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是Object[] BeanHandler:將ResultSet中第一行的數(shù)據(jù)轉(zhuǎn)化成類對(duì)象 BeanListHandler:將ResultSet中所有的數(shù)據(jù)轉(zhuǎn)化成List,List中存放的是類對(duì)象 ColumnListHandler:將ResultSet中某一列的數(shù)據(jù)存成List,List中存放的是Object對(duì)象 KeyedHandler:將ResultSet中存成映射,key為某一列對(duì)應(yīng)為Map。Map中存放的是數(shù)據(jù) MapHandler:將ResultSet中第一行的數(shù)據(jù)存成Map映射 MapListHandler:將ResultSet中所有的數(shù)據(jù)存成List。List中存放的是Map ScalarHandler:將ResultSet中一條記錄的其中某一列的數(shù)據(jù)存成Object (3) org.apache.commons.dbutils.wrappers SqlNullCheckedResultSet:該類是用來(lái)對(duì)sql語(yǔ)句執(zhí)行完成之后的的數(shù)值進(jìn)行null的替換。 StringTrimmedResultSet:去除ResultSet中中字段的左右空格。Trim()
View Code
Commons BeanUtils是針對(duì)Bean的一個(gè)工具集。由于Bean往往是有一堆get和set組成,所以BeanUtils也是在此基礎(chǔ)上進(jìn)行一些包裝。 使用示例:一個(gè)比較常用的功能是Bean Copy,也就是copy bean的屬性。如果做分層架構(gòu)開(kāi)發(fā)的話就會(huì)用到,比如從PO(Persistent Object)拷貝數(shù)據(jù)到VO(Value Object)。
TeacherFormteacherForm=(TeacherForm)form; //得到TeacherForm Teacher teacher=new Teacher();//構(gòu)造Teacher對(duì)象 //賦值 teacher.setName(teacherForm.getName()); teacher.setAge(teacherForm.getAge()); teacher.setGender(teacherForm.getGender()); teacher.setMajor(teacherForm.getMajor()); teacher.setDepartment(teacherForm.getDepartment()); //持久化Teacher對(duì)象到數(shù)據(jù)庫(kù) HibernateDAO= ; HibernateDAO.save(teacher);
使用BeanUtils后,代碼就大大改觀了,如下所示: TeacherForm teacherForm=(TeacherForm)form; //得到TeacherForm Teacher teacher=new Teacher();//構(gòu)造Teacher對(duì)象 BeanUtils.copyProperties(teacher,teacherForm); //賦值 HibernateDAO.save(teacher); //持久化Teacher對(duì)象到數(shù)據(jù)庫(kù)
說(shuō)明:這是一個(gè)處理命令的工具。比如main方法輸入的string[]需要解析。你可以預(yù)先定義好參數(shù)的規(guī)則,然后就可以調(diào)用CLI來(lái)解析。 View Code
說(shuō)明:這個(gè)工具是用來(lái)編碼和解碼的,包括Base64,URL,DES、SHA1、MD5、Soundx等等。 MD5 String str = "abc"; DigestUtils.md5Hex(str);
SHA1 String str = "abc"; DigestUtils.shaHex(str);
BASE64 //加密 String str= "abc"; // abc為要加密的字符串 byte[] b = Base64.encodeBase64(str.getBytes(), true); System.out.println(new String(b));
//解密 String str = "YWJj"; // YWJj為要解密的字符串 byte[] b = Base64.decodeBase64(str.getBytes()); System.out.println(new String(b));
Commons Collections說(shuō)明:你可以把這個(gè)工具看成是java.util的擴(kuò)展。 使用示例:舉一個(gè)簡(jiǎn)單的例子 OrderedMap map = new LinkedMap();
說(shuō)明:數(shù)據(jù)庫(kù)連接池,類似的還有common-pool和c3p0等,具體以后再總結(jié)
詳情請(qǐng)參考:HttpClient學(xué)習(xí)整理
說(shuō)明:可以看成是java.io的擴(kuò)展 使用示例:
a) 標(biāo)準(zhǔn)代碼: InputStream in = new URL( "http://jakarta." ).openStream(); b) 使用IOUtils
File file = new File("/commons/io/project.properties");
longfreeSpace = FileSystemUtils.freeSpace("C:/");
說(shuō)明:那么JXpath就是基于Java對(duì)象的Xpath,也就是用Xpath對(duì)Java對(duì)象進(jìn)行查詢。 Addressaddress=(Address)JXPathContext.newContext(vendor).getValue("locations[address/zipCode='90210']/address"); Address address = null;
說(shuō)明:這個(gè)工具包可以看成是對(duì)java.lang的擴(kuò)展。提供了諸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具類。 Lang.*下有很多Utils類,提供了若干static方法供調(diào)用,涵蓋了字符串操作、字符操作、JVM交互操作、歸類、異常和位域校驗(yàn)等等。 首先看看字符串處理類StringUtils 全部的靜態(tài)方法,StringUtils繼承自O(shè)bject。屬于null safe操作。何謂null safe,就是遇到是null的string對(duì)象,也會(huì)quietly的把它處理掉,而不會(huì)有NullPointerException異常,如果有這個(gè)異常,那么就是該類的bug了~~ 看看StringUtils的各種方法對(duì)比吧 比較一下isEmpty和isBlank這兩個(gè)方法。isEmpty在判斷” “這樣的字符串時(shí)返回的是false,而isBlank返回的是true。這就明顯了吧,empty只對(duì)null和””有效,而blank對(duì)” ”也有效~~ Clean方法和trim方法都封裝了String的trim方法,唯一的不同是clean將null處理為””,而trim將null處理為null。 以Strip開(kāi)頭的一系列方法基本可以看做trim方法的擴(kuò)展,但是更強(qiáng)大的是可以處理前導(dǎo)和后續(xù)的各種stripChars,不局限于空白符了。 Equal系列的方法加入了null的判斷,如果都是null那么也返回true。 IndexOf與String的indexOf類似,加入了null的判斷而已,且多了一個(gè)ordinalIndexOf方法,可以找到第n個(gè)字符串出現(xiàn)的位置。還有一個(gè)indexOfIgnoreCase可以不考慮大小寫的判斷位置匹配。實(shí)際代碼是調(diào)用了string的regionMatches方法,只不過(guò)在ignorecase參數(shù)上選擇了true。 Contains的實(shí)現(xiàn)是一樣的,只是加入了null的判斷。剩下的indexOfAny和containsAny方法都很不錯(cuò),完成了集合的匹配~~都包含一個(gè)字符數(shù)組的參數(shù),可以檢測(cè)字符串中是否包含字符數(shù)組中的任意個(gè)元素,算法沒(méi)有特殊的地方,復(fù)雜度O(MN)吧~~相比較而言,contains系列的containsOnly和containsNone我倒是覺(jué)得更有用一些。 Substring系列的方法,除了substring封裝了string的substring完成了null safe的檢查外,還加入了left、right和mid方法。顧名思義,left可以得到最左邊的若干個(gè)字符作為字串,其實(shí)就是調(diào)用了str.substring(0, len);而right同樣是調(diào)用了str.substring(str.length() - len);另外還有一些比如substringBefore和substringAfter之類的,用法類似。substringBetween可以找到兩個(gè)字串中間的子串。 Split是值得說(shuō)道的一個(gè)改動(dòng),原本大量封裝string的方法,split是個(gè)例外,大家知道,string的split方法用到的參數(shù)是一個(gè)正則式,雖然強(qiáng)大,但是有時(shí)候容易出錯(cuò)。而且string并沒(méi)有提供簡(jiǎn)化版本。StringUtils提供的split改變了這一狀況,開(kāi)始使用完整的字符串作為參數(shù),而不是regex。同時(shí),對(duì)類似功能的jdk版本的StringTokenizer,在內(nèi)部方法splitWorker中有段注釋:Direct code is quicker than StringTokenizer.也就是說(shuō),這個(gè)是更快的一個(gè)工具了~~ 對(duì)于split的反向操作join,用到了一個(gè)lang.text包下的StrBuilder類。主要實(shí)現(xiàn)即將若干個(gè)object數(shù)組一個(gè)個(gè)的append到buffer中。然后最后toString就好。 Delete和remove可以用來(lái)刪除string中的內(nèi)容,比如deleteSpaces可以除去字符串中的所有空白字符(" "t"r"n"b");remove更強(qiáng)大,可以removeStart(只匹配開(kāi)頭)和removeEnd(只匹配結(jié)尾),當(dāng)然remove可以刪掉字符串中的任意字串。 Replace,同理這里的replace不像string中的一樣是基于正則的,用起來(lái)更簡(jiǎn)單。而且有replaceOnce和replaceEach等各種用法。還有一個(gè)輔助的overlay方法,可以直接替換~~ Chomp和chop我覺(jué)得是比較雞肋的一個(gè)功能了,去除字符串的最后一個(gè)字符或者尾部串,這功能很必要么? Repeat將已有字符串復(fù)制n次。 Pad是一個(gè)很有意思的方法,可以將一個(gè)已有字符串?dāng)U展n個(gè)大小,并且填充特定的字符。比如StringUtils.rightPad("bat", 5, 'z') = "batzz"。Pad調(diào)用了string的concat方法。 Case conversion的操作就不用多講了,upper和lower都是一樣的。補(bǔ)充說(shuō)的是,capitalize系列的方法真的很貼心。 補(bǔ)充一個(gè)容易讓人誤會(huì)的方法——countMatches,記錄一個(gè)字符串str中某串sub出現(xiàn)的次數(shù)。為什么容易誤會(huì),“aaaa”中有多少“aa”呢?用該方法得到的答案是2~~~大家懂的 Is打頭的一系列方法都非常強(qiáng)大,可以判斷字符串是否符合某種格式,比如isAlpha判斷是否都是字母,isNumeric判斷是否都是數(shù)字等等等等。 Reverse這個(gè)功能出來(lái)后,最先想到的是當(dāng)初筆試面試時(shí)候的一堆回文字符串翻轉(zhuǎn)之類的考試都要囧了。 Abbreviate方法我覺(jué)得是相當(dāng)實(shí)用的一個(gè)方法封裝,我們?cè)诟鞣N應(yīng)用中都很常見(jiàn)的“一堆文字……”就是這個(gè)方法的最好應(yīng)用。 Difference方法返回兩個(gè)字符串的不同處,可以說(shuō)是返回第二個(gè)字符串的第一個(gè)不同的位置開(kāi)始的子串。indexOfDifference返回不同處的位置。 getCommonPrefix這個(gè)方法也很好,可以找到一組字符串的公共前綴。當(dāng)然只是調(diào)用了indexOfDifference這個(gè)方法。 接著就是ArrayUtils了 ArrayUtils是一個(gè)對(duì)數(shù)組進(jìn)行特殊處理的類。當(dāng)然jdk中的Arrays是有一些功能的,Array也提供了一些動(dòng)態(tài)訪問(wèn)java數(shù)組的方法,這里的ArrayUtils擴(kuò)展提供了更多的功能。 第一個(gè)可以說(shuō)的方法是toMap方法,該方法就是將一個(gè)二維數(shù)組轉(zhuǎn)換為一個(gè)HashMap。當(dāng)然對(duì)輸入的參數(shù)要求比較嚴(yán)格,會(huì)拋出各種異常。NullToEmpty方法是一個(gè)防御性編程方法的代表,將null的數(shù)組直接變?yōu)橐粋€(gè)空(長(zhǎng)度為0)的數(shù)組。Subarray方法提供了基于拷貝的子數(shù)組生成方法。Reverse方法提供了一個(gè)數(shù)組翻轉(zhuǎn)的算法實(shí)現(xiàn)。indexOf方法是一個(gè)查找指定對(duì)象的線性數(shù)組查找方法。還提供了一系列裝箱拆箱方法(toPrimitive和toObject),就是將Integer之類的對(duì)象類型變成int,反之亦然。addAll方法提供了基于數(shù)組拷貝的數(shù)組合并,就是將數(shù)組1和數(shù)組2合并為一個(gè)新的數(shù)組返回。當(dāng)然,add方法雖然只添加了一個(gè)元素,但是也是要數(shù)組拷貝的(數(shù)組的效率啊?。。。?。同樣的原理,remove(刪除)方法也是基于數(shù)組拷貝的,以指定刪除元素為界,分別兩次拷貝它前后的子數(shù)組。 再來(lái)就是一些補(bǔ)充了 把一些看到的有意思的可能有用的接口方法提取出來(lái)。 RandomStringUtils類里有一個(gè)random方法,可以產(chǎn)生一個(gè)固定長(zhǎng)度的隨機(jī)字符串。用到了java.util.Random。其中的注釋中提到了對(duì)Unicode中沒(méi)法處理的surrogate的處理方法。如果不幸隨機(jī)到那個(gè)位置(D800-DBFF, DC00-DFFF),那么算法中將進(jìn)行count補(bǔ)充,即提供一次重新隨機(jī)的機(jī)會(huì)。 另外一個(gè)比較有趣的類是StopWatch,這是一個(gè)秒表類,通過(guò)start方法開(kāi)始計(jì)時(shí),通過(guò)split方法截?cái)嗝恳淮蔚姆侄斡?jì)時(shí),suspend方法可以暫停秒表,resume恢復(fù)計(jì)時(shí)。最后stop后可以通過(guò)getTime獲得總共計(jì)時(shí)。當(dāng)然在split后的分段計(jì)時(shí)可以用getSplitTime獲取。技術(shù)實(shí)現(xiàn)上就是定義了幾個(gè)狀態(tài),然后通過(guò)每次狀態(tài)的轉(zhuǎn)變和系統(tǒng)時(shí)間的差來(lái)表達(dá)計(jì)時(shí)效果。
說(shuō)明:這個(gè)包提供的功能有些和Commons Lang重復(fù)了,但是這個(gè)包更專注于做數(shù)學(xué)工具,功能更強(qiáng)大。 Math 是一個(gè)輕量的,自包含的數(shù)學(xué)和統(tǒng)計(jì)組件,解決了許多非常通用但沒(méi)有及時(shí)出現(xiàn)在Java標(biāo)準(zhǔn)語(yǔ)言中的實(shí)踐問(wèn)題. 我們可以參考其主頁(yè)上的用戶指導(dǎo)(User Guide ).或者直接研究其API,發(fā)現(xiàn)在commons-math中有以下幾個(gè)包: ?。保畂rg.apache.commons.math Common classes used throughout the commons-math library. ?。玻畂rg.apache.commons.math.analysis Implementations of common numerical analysis procedures, including root finding and function interpolation. 主要解決一些數(shù)學(xué)通常的分析方法,包括求方程的根,其中有對(duì)分算法,牛頓算法等等.以及函數(shù)的改寫. ?。常畂rg.apache.commons.math.complex Complex number type and implementations of complex transcendental functions. 主要用來(lái)解決復(fù)數(shù)的計(jì)算. 4.org.apache.commons.math.distribution Implementations of common discrete and continuous distributions. 主要用來(lái)解決連續(xù)分布和不連續(xù)分布的計(jì)算. ?。担畂rg.apache.commons.math.fraction Fraction number type and fraction number formatting.主要討論分?jǐn)?shù)的格式和類型. 6.org.apache.commons.math.linear Linear algebra support. 線性代數(shù)中矩陣和行列式的算法. ?。罚畂rg.apache.commons.math.random Random number and random data generators.隨機(jī)數(shù)算法 ?。福畂rg.apache.commons.math.special Implementations of special functions such as Beta and Gamma.一些特別的函數(shù)算法. 9.org.apache.commons.math.stat Data storage, manipulation and summary routines. ?。保埃畂rg.apache.commons.math.util Convenience routines and common data structures used throughout the commons-math library.
說(shuō)明:這個(gè)包還是很實(shí)用的,封裝了很多網(wǎng)絡(luò)協(xié)議。
1. FTP
使用示例: TelnetClient telnet = new TelnetClient();
說(shuō)明:用來(lái)幫助進(jìn)行驗(yàn)證的工具。比如驗(yàn)證Email字符串,日期字符串等是否合法。 DateValidator validator = DateValidator.getInstance();// Get the Date validator Commons Virtual File System 說(shuō)明:提供對(duì)各種資源的訪問(wèn)接口。支持的資源類型包括
1. CIFS
這個(gè)包的功能很強(qiáng)大,極大的簡(jiǎn)化了程序?qū)Y源的訪問(wèn)。
1、一個(gè)簡(jiǎn)單的文本郵件 我們的第一個(gè)例子是利用你本地的郵件服務(wù)器向"John Doe"發(fā)送一個(gè)基本郵件信息。 import org.apache.commons.mail.SimpleEmail; ... SimpleEmail email = new SimpleEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("Test message"); email.setMsg("This is a simple test of commons-email"); email.send(); 調(diào)用setHostName("mail.myserver.com")來(lái)設(shè)置發(fā)送信息的SMTP服務(wù)器地址。如果你不設(shè)置,將會(huì)使用系統(tǒng)屬性"mail.host"。 2、發(fā)送帶附件的郵件 為了向一個(gè)郵件添加附件,你需要使用MultiPartEmail這個(gè)類。這個(gè)類的工作方式和SimpleEmail類似,但是其重載了attach()方法使其可以向郵件添加附件。你可以通過(guò)附加或者內(nèi)聯(lián)來(lái)添加無(wú)限數(shù)量的附件,這些附件將采用MIME編碼。 最簡(jiǎn)單的方式是使用EmailAttachment類引用你得附件來(lái)添加附件。 下面的例子我們將創(chuàng)建一個(gè)圖片的附件。把圖片附加在郵件中并發(fā)送它。 import org.apache.commons.mail.*; ... // Create the attachment EmailAttachment attachment = new EmailAttachment(); attachment.setPath("mypictures/john.jpg"); attachment.setDisposition(EmailAttachment.ATTACHMENT); attachment.setDescription("Picture of John"); attachment.setName("John"); // Create the email message MultiPartEmail email = new MultiPartEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("The picture"); email.setMsg("Here is the picture you wanted"); // add the attachment email.attach(attachment); // send the email email.send(); 你也可以使用EmailAttachment引用一個(gè)非本地的URL文件。當(dāng)發(fā)送郵件時(shí),URL文件會(huì)被自動(dòng)下載下來(lái)附件在郵件中。 下面的例子演示如何把a(bǔ)pache的徽標(biāo)附件在郵件中發(fā)送給John 。 import org.apache.commons.mail.*; ... // Create the attachment EmailAttachment attachment = new EmailAttachment(); attachment.setURL(new URL("http://www./images/asf_logo_wide.gif")); attachment.setDisposition(EmailAttachment.ATTACHMENT); attachment.setDescription("Apache logo"); attachment.setName("Apache logo"); // Create the email message MultiPartEmail email = new MultiPartEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("The logo"); email.setMsg("Here is Apache's logo");
// add the attachment email.attach(attachment); // send the email email.send();
3、發(fā)送HTML格式的郵件 發(fā)送HTML格式郵件要使用HtmlEmail類。這個(gè)類的工作方式很像使用附加方法設(shè)置html內(nèi)容的MultiPartEmail類類似,如果接收者不支持HTML郵件將替換成普通的文本和內(nèi)聯(lián)圖片。 在下面例子中,我們使用HTML格式內(nèi)容和以俄國(guó)內(nèi)聯(lián)圖像。 import org.apache.commons.mail.HtmlEmail; ... // Create the email message HtmlEmail email = new HtmlEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@", "Me"); email.setSubject("Test email with inline image"); // embed the image and get the content id URL url = new URL("http://www./images/asf_logo_wide.gif"); String cid = email.embed(url, "Apache logo"); // set the html message email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>"); // set the alternative message email.setTextMsg("Your email client does not support HTML messages"); // send the email email.send(); 首先,注意,調(diào)用embed函數(shù)返回一個(gè)字符串。這個(gè)字符串是一個(gè)隨機(jī)的標(biāo)識(shí)符用來(lái)引用一個(gè)圖像標(biāo)簽中的圖像。下一步,在這個(gè)例子中我們沒(méi)有調(diào)用setMsg()函數(shù)。這個(gè)方法在HtmlEmail中仍然可用,但是如果你使用內(nèi)聯(lián)圖像時(shí)就不應(yīng)該使用,應(yīng)該使用setHtmlMsg()函數(shù)和setTextMsg()函數(shù)。 4、調(diào)試 JavaMail API支持一個(gè)調(diào)試選項(xiàng),如果你遇到了問(wèn)題這個(gè)可能非常有用。你可以通過(guò)調(diào)用setDebug(true)來(lái)激活調(diào)試模式,調(diào)試信息將被輸出到標(biāo)準(zhǔn)輸出中。 5、驗(yàn)證 如果SMTP服務(wù)器需要驗(yàn)證,你可以在發(fā)送郵件前調(diào)用setAuthentication(userName,password)設(shè)置賬號(hào)和密碼。這個(gè)將會(huì)創(chuàng)建一個(gè)DefaultAuthenticator實(shí)例,JavaMail API在發(fā)送郵件時(shí)會(huì)使用它。你的服務(wù)器必須支持RFC2554標(biāo)準(zhǔn)。 |
|
來(lái)自: hkls0003 > 《apache_Commons》