第五讲:JAF架构及其在JavaMail中的应用
一、JavaBeans Activation Framework,JavaBeans激活框架
其功能有:
- 访问数据源中的数据;
- 获知数据的数据类型;
- 获知可对数据源进行的各种操作
- 用户对数据源执行某种操作时,自动创建执行该操作的软件的实例对象
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接口
常用的方法有:
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开发详解》,以后在加以补充。