——–http://blog.sina.com.cn/s/blog_61583c540100dw42.html
JAF(JavaBeans Activation Framework)
(2009-08-02 22:20:09)
标签:
|
分类: 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)
除了一些显示属性定义之外,最重要的两个属性是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程序员应该有的问题。