JAF(JavaBeans Activation Framework)

  • Post author:
  • Post category:java


——–http://blog.sina.com.cn/s/blog_61583c540100dw42.html

JAF(JavaBeans Activation Framework)


(2009-08-02 22:20:09)


JAF(JavaBeans™ Activation Framework Specification Version1.1-JSR 925)

1、对其用途进行一个通俗描述

我们经常在用浏览器,浏览器强大的媒体识别和显示能力大家应该深有体会。当我们想在浏览器中显示浏览器默认支持之外的内容时,我们可以通过装插件的方式来达到目的。在html/xhtml中有一个标签:embed。典型的属性如下:

<embed /> Attributes:

  • align(optional)
  • alt (optional)
  • code (optional) (Internet Explorer)
  • codebase (recommended)
  • frameborder (optional)
  • heigh (optional) (Netscape)
  • hidden (optional)
  • hspace (optional)
  • name (optional)
  • pallette (optional)
  • pluginspage (optional)
  • pluginurl (optional)
  • src (optional)
  • type (optional)
  • units (optional)
  • vspace (optional)

除了一些显示属性定义之外,最重要的两个属性是src和type:


<embed src=”hi.flv” type=”video/x-flv”/>

其实与其相关的有很多类似的例子:

  • 你在桌面上双击一个文件为什么就会直接用对应的程序打开呢?
  • 如果你是开发者,你不会不知道eclipse,eclipse->Window->Preferences->General ->Content type&Editor->File Associations

这种例子太多了。

上面的共同点是:

任何资源应该有一个对应的类型,所有的类型应该至少有一个对应的处理程序。如果要资源和应用对应起来,必须要有一个

注册管理表

。有兴趣的人可以研究Windows的在什么地方放,linux的在什么地方放?呵呵。

回到我们的主题,JavaBeans Activation Framework就是提供一个标准的框架,让应用程序和资源类型对应起来,从而实现资源识别和资源处理的自动化。

简单的一个对应例子:

.gif -> image/gif -> gif显示器

2 抓出核心框架

2.1 资源 DataSource(接口)

资源至少要告诉自己的类型,当然我们可以通过后缀简单直接获取类型(需要mime.types对应表)。类似:

text/html












html htm HTML HTM

text/plain












txt text TXT TEXT java c c++ pl cc h

image/gif












gif GIF

image/ief












ief

image/jpeg












jpeg jpg jpe JPG

image/tiff












tiff tif

当然我们可以直接告诉类型。

DataSource接口:




String



getContentType


()











This method returns the MIME type of the data in the form of a string.



InputStream



getInputStream


()











This method returns an InputStream representing the data and throws the appropriate exception if it can not do so.



String



getName


()











Return the

name

of this object where the name of the object is dependant on the nature of the underlying objects.



OutputStream



getOutputStream


()

2.2 资源对应的处理程序 DataHandler(类)

其实资源对应的处理程序本质上的意思就是:只有该处理程序能够理解和处理资源数据的(首选处理)。但在JAF中,一个设计理念就是如何让JAF向JavaBean靠拢(JavaBean相关内容,请参考

http://java.sun.com/javase/technologies/desktop/javabeans/

,这也是为什么叫JavaBean Activation Framewor的缘故),所以在设计中会发现很多资源<->对象之间的转化的内容,不过大家要分清楚JAF主要是干什么的–一个数据处理的框架。

说这么多大家基本理解没有问题。记住核心的是:

JAF是一个资源<->处理程序关联的框架

3 实现是怎么回事?

谈到规范都是一些接口、抽象类和框架类,但具体实现究竟是什么呢?大家可能糊里糊涂在使用JAF。JAF典型应用代码如下(来自JAF的一个Demo):





FileDataSource fds = new FileDataSource(filename);





DataHandler dh = new DataHandler(fds);





// comment out previous two lines, and uncomment next




// line and pass in a URL on the command line.




// DataHandler dh = new DataHandler(new URL(filename));





CommandInfo bi = dh.getCommand(“view”);

//view是什么意思,为什么通过view能够拿到特定的资源操作JavaBean呢?









if (bi == null) {







System.out.println(“no viewer found, exiting”);







System.exit(1);




}




frame = new Frame(“Viewer”);




frame.add((Component)dh.getBean(bi));




frame.setSize(new Dimension(400,300));




frame.show();

调用如此简单,绿色部分描述的如此强大,能够直接添加到界面进行显示,厉害啊!

其实这里的一个设计模式就是Command模式,为什么View就代表显示组件呢(你说了算,目前没有明确的规范规定,由实现自己确认,奇怪,我就是找不见这块有一个规范)典型的配置如下:

application/x-wombat; ; x-java-View=com.foo.WombatViewBean; \ x-java-edit=com.foo.WombatEditBean; \

x-java-print=com.foo.WombatPrintBean; \

x-java-content-handler=com.foo.WombatDataContentHan

其实想一想,对资源的操作无非就是:view/edit/print/content-handler/save什么的。

Command模式就是通过命名来查找服务类和实例化的一种模式,其实如何查找、如何配置Command命名和实现类之间的映射是JAF实现的关键内容。

javax.activation.CommandMap类就是这个关键查找的类,目前默认的实现是
javax.activation.MailcapCommandMap,而这在Sun的参考实现中已经出现com.sun的信息,并且默认是从配置文件中检索。

我们自己的实现可以通过DataHandler.setCommandMap直接注入自己的CommandMap。


我在我的系列文档中会介绍JavaBean规范,请大家索取

Janins@163.com。



该规范本身就很简单。但迷迷糊糊不是我们Java程序员应该有的问题。