第五講:JAF架構及其在JavaMail中的應用

第五講:JAF架構及其在JavaMail中的應用

一、JavaBeans Activation Framework,JavaBeans激活框架
其功能有:
  1. 訪問數據源中的數據;
  2. 獲知數據的數據類型;
  3. 獲知可對數據源進行的各種操作
  4. 用戶對數據源執行某種操作時,自動創建執行該操作的軟件的實例對象
JAF中主要的API及其間的關係如下圖所示:

圖1:JAF中核心API的關係
(1).DataHandler類是JAF的核心API應用程序通過它訪問數據源中封裝的數據以及數據的MIME類型並通過它獲得JAF中爲數據的MIME類型定義的操作列 表(CommandMap)。應用程序訪問操作列表中的操作時,DataHandler還負責構建相應的命令對象(CommandObject)共程序使用。
(2).DataSource接口用於將數據封裝成可被JAF框架使用的對象,它定義了對數據源的通過操作包括得到輸入輸出流的getInputStream和getOutputStrea m方法以及得到數據MIME類型的getContentType方法。
它的兩個實現類:FileDataSource(從文件系統中獲取數據)、URLDataSource(從URL地址中獲取數據)
(3). DataContentHandler接口用於把DataSource中封裝的數據轉換成相應的Java對象,或把Java對象轉化爲MIME形式的字節流並將其寫入到輸出流中。
(4).CommandObject接口定義了一個特定MIME類型數據執行特定操作的命令對象。
(5).CommandMap代表操作特定MIME類型數據的所有命令對象集合。

二、接口類介紹

2.1 DataSource接口

常用的方法有:

java.io.InputStream getInputStream() 返回對數據進行讀取的InputStream對象
java.io.OutputStream getOutputStream()
返回可以向數據源寫入數據的OutputStream對象
String getContentType() 返回數據源中封裝的數據的MIME類型
格式: “application/octet-stream”
String getName() 返回DataSource封裝的數據的名稱
URLDataSource(java.net.URL url)                                                                                                                              構造函數和一個URL關聯通過這個URL獲得輸入輸出流以及通過URL的Content-Type屬性獲取數據的MIME類型
DataSource的兩個實現子類是:URLDataSource、FileDataSource

其中FileDataSource通過文件獲取輸入輸出流,並通過一個名爲FileTypeMap類獲得數據的MIME類型。

FileDataSource(java.io.File file)
FileDataSource(java.lang.String)
使用File對象或文件名實例化一個FileDataSource對象
setFileTypeMap(FileTypeMap map) 設置判斷數據MIME類型的FileTypeMap對象
getContentTyep()                                                                                                                                                                                          返回數據的MIME類型。若設置了FileTypeMap則返回,否則返回 getDefaultFileTypeMap對象,調用FileTypeMap中的getContentType方法返回MIME類型。
FileTypeMap類是一個抽象類,它用於判斷文件數據的MIME類型,JAF提供的它的實現類 MimetypesFileTypeMap,如果應用程序沒有顯示的調用FileDataSource.setFileTypeMap設置任何的FileTypeMap的話,JAF默認使用此類來判斷文件的MIME類型,FileTypeMap常用的方法有:

abstract String getContentType(File )
abstract String getContentType(String filename)
返回文件的MIME類型
static void setDefaultFileTypeMap(FileTypeMap) 設置默認的FileTypeMap類型
static FileTypeMap getDefaultFileTypeMap() 獲取默認的FileTypeMap類型
JAF獲取文件的MIME類型有: "text/plain"、"text/html"、"text/jpeg"、"text/gif"等可以在activation.jar架包中的mimetypes.default文件中的查看。用戶也可以自定義MIME類型文件自定義文件名爲".mime.types"的文件用於定義文件後綴名和其MIME類型之間的映射關係。
2.2 DataHandler類
是應用程序和JAF框架之間定義了一個通用的數據訪問 接口,其常用的方法有:
DataHandler(DataSource ds)
DataHandler(Object o, String mimeType)
DataHandler(java.net.URL url)                                                                                                                                                                                                                                       
實例化DataHandler對象可以指定MIME類型或者使用一個URL實例一個對象
DataSource getDataSource()                                                                                          返回與此DataHandler相關聯的DataSource對象。要麼返回創建該DataHandler對象的DataSource對象,要麼返回實例化DataHandler對象是指定的DataSource對象
String getName() 返回數據對象的名稱,此方法調用DataSource.getName()方法
String getContentType() 獲取封裝在數據源中的MIME類型
InputStream getInputStream() 
   throws IOException
返回DataHandler對象的InputStream對象
writeTo(OutputStream os)
   throws IOException
將數據寫到一個指定的OutputStream流中
OutputStream getOutputStream()
   throws IOException                                   
獲取DataHandler對象的OutputStream流以允許重寫底層數據
setCommandMap(CommandMap)                          
 CommandInfo[] getPreferredCommands()                                                                                                                                    獲取操作此數據類型的首選命令
CommandInfo[] getAllCommands()   
獲取操作此數據類型的所有命令
CommandInfo getCommand
              (String cmdName)                                                                                                                                                                                  
獲取指定名稱的命令
Object getContent() 返回代表數據的Java對象
Object getBean() 返回一個JavaBean組件,這個JavaBean組件中關聯呢DataHandler中封裝的數據,以及對數據的操作命令
2.3 使用JAF操作數據的類
CommandMap類: DataHandler.getAllCommands獲取數據額所有操作實際上是調用關聯到DataHandler對象中的CommandMap.getAllCommands方法。CommandMap類中的主要方法有:
static setDefaultCommandMap(CommandMap) 設置CommandMap對象的默認CommandMap
static CommandMap getDefaultCommandMap() 獲取默認的CommandMap類型
abstract CommandInfo[] getPreferredCommands(String mimetype) 根據指定的MIME類型獲取首選的可用命令列表
abstract CommandInfo[] getAllCommands()
abstract CommandIfo getCommand(String mimeType, String cmdName)                                                   
String[] getMimeType() 獲取CommandMap映射的所有MIME類型
CommandInfo類: CommandMap的實現類使用CommandInfo類描述命令請求的結果。CommandInfo類爲調用者提供所請求的命令動詞,以及命令對象的一個實例。其常用方法有:
CommandInfo(String verb, String className) verb表示此CommandInfo描述的命令動詞,className表示命令對象的完整類名
String getCommandName()
String getCommandClass() 返回命令對象的完整類名
Object getCommandObject(DataHandler dh,
ClassLoader loader) throws IOException, ClassNotFoundException              
返回已經實例化的JavaBean組件
CommandObject類: JavaBean組件實現此接口,以獲取該組件將要操作的數據,以及請求這些組件執行的命令動詞。該接口中只有一個方法:
void setCommandContext(String verb, DataHandler dh) throws IOException
verb: 指定關聯到組件上的命令動詞
dh: 指定將要操作的數據,數據使用DataHandler對象進行封裝。

三、使用JAF創建MIME消息

		FileDataSource fds = new FileDataSource(filename);
		imgBodyPart.setDataHandler(new DataHandler(fds));

PS: 編寫和安裝自定義命令處理器、JAF構建CommandObject對象的過程可以參見《JavaMail開發詳解》,以後在加以補充。



發佈了32 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章