您的位置:首页 > 运维架构 > 网站架构

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

2014-04-26 17:14 316 查看
第五讲: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接口

常用的方法有:

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开发详解》,以后在加以补充。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: