--------http://blog.sina.com.cn/s/blog_61583c540100dw42.html
JAF(JavaBeans Activation Framework)
(2009-08-02 22:20:09) 标签: javajafjsr925 | 分类: Java相关规范解读 |
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)
<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
text/plain
image/gif
image/ief
image/jpeg
image/tiff
当然我们可以直接告诉类型。
DataSource接口:
| getContentType() |
| getInputStream() |
| getName() |
| 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):调用如此简单,绿色部分描述的如此强大,能够直接添加到界面进行显示,厉害啊!
其实这里的一个设计模式就是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程序员应该有的问题。