- 訪問數據源中的數據;
- 獲知數據的數據類型;
- 獲知可對數據源進行的各種操作
- 用戶對數據源執行某種操作時,自動創建執行該操作的軟件的實例對象
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接口
常用的方法有:
DataSource的兩個實現子類是:URLDataSource、FileDataSource
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類型 其中FileDataSource通過文件獲取輸入輸出流,並通過一個名爲FileTypeMap類獲得數據的MIME類型。
FileTypeMap類是一個抽象類,它用於判斷文件數據的MIME類型,JAF提供的它的實現類 MimetypesFileTypeMap,如果應用程序沒有顯示的調用FileDataSource.setFileTypeMap設置任何的FileTypeMap的話,JAF默認使用此類來判斷文件的MIME類型,FileTypeMap常用的方法有:
FileDataSource(java.io.File file)
FileDataSource(java.lang.String)使用File對象或文件名實例化一個FileDataSource對象 setFileTypeMap(FileTypeMap map) 設置判斷數據MIME類型的FileTypeMap對象 getContentTyep() 返回數據的MIME類型。若設置了FileTypeMap則返回,否則返回 getDefaultFileTypeMap對象,調用FileTypeMap中的getContentType方法返回MIME類型。
JAF獲取文件的MIME類型有: "text/plain"、"text/html"、"text/jpeg"、"text/gif"等可以在activation.jar架包中的mimetypes.default文件中的查看。用戶也可以自定義MIME類型文件自定義文件名爲".mime.types"的文件用於定義文件後綴名和其MIME類型之間的映射關係。
abstract String getContentType(File )
abstract String getContentType(String filename)返回文件的MIME類型 static void setDefaultFileTypeMap(FileTypeMap) 設置默認的FileTypeMap類型 static FileTypeMap getDefaultFileTypeMap() 獲取默認的FileTypeMap類型
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類中的主要方法有:CommandInfo類: CommandMap的實現類使用CommandInfo類描述命令請求的結果。CommandInfo類爲調用者提供所請求的命令動詞,以及命令對象的一個實例。其常用方法有:
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類型 CommandObject類: JavaBean組件實現此接口,以獲取該組件將要操作的數據,以及請求這些組件執行的命令動詞。該接口中只有一個方法:
CommandInfo(String verb, String className) verb表示此CommandInfo描述的命令動詞,className表示命令對象的完整類名 String getCommandName() String getCommandClass() 返回命令對象的完整類名 Object getCommandObject(DataHandler dh,
ClassLoader loader) throws IOException, ClassNotFoundException返回已經實例化的JavaBean組件 void setCommandContext(String verb, DataHandler dh) throws IOExceptionverb: 指定關聯到組件上的命令動詞dh: 指定將要操作的數據,數據使用DataHandler對象進行封裝。
三、使用JAF創建MIME消息
FileDataSource fds = new FileDataSource(filename);
imgBodyPart.setDataHandler(new DataHandler(fds));
PS: 編寫和安裝自定義命令處理器、JAF構建CommandObject對象的過程可以參見《JavaMail開發詳解》,以後在加以補充。