第五讲:JAF架构及其在JavaMail中的应用

来源:互联网 发布:上海交通大学网络大专 编辑:程序博客网 时间:2024/06/02 15:24
第五讲: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对象的默认CommandMapstatic 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开发详解》,以后在加以补充。



0 0