1.JAF框架只要用于封装数据并为应用程序提供访问和操作数据的方法,下面介绍JAF框架的作用,JAF框架的内部工作原理,以及如何使用JAF框架快速创建供JavaMail程序使用的MIME消息。
2.JAF框架概述:
JAF(JavaBeans Activation Framework ,JavaBens激活框架)的主要作用在于让Java应用程序知道如何对一个数据源进行查看,编辑和打印等操作,大家知道,在MS word程序中可以打开一篇word文档中嵌套的Visio图片,JAF就是要让Java程序能够完成类似的技术应用,让应用程序知道数据源支持哪些操作,每个操作分别调用哪个处理模块,对于JAF封装的数据,应用程序通过JAF提供的接口可以完成如下功能:
1.访问数据源中的数据。
2.获知数据源的数据类型
3.获知可对数据源进行的各种操作
4.用户对数据源执行某种操作时,自动创建执行该操作的软件部件的实例对象
SUN公司的网站提供了JAF的下载,JAF 的API封装在activation.jar包中。
3.JAF的体系结构:
JAF为应用程序提供了一个通用的数据处理机制,对于采用JAF框架封装的数据,应用程序通过JAF框架提供的接口就可以获知数据的MIME类型,以及动态嵌入到JAF框架中的可处理该MIME 数据类型的所有可用操作。调用者访问这些操作时,JAF框架将自动构建用于完成当前操作的命令对象,并返回给调用者,调用者通过这个命令对象就可以对数据做特定的处理,下图展示了JAF 框架中的主要API ,以及他们之间的调用关系。
图中各个API类的作用如下所示:
~~DataHandle类是JAF框架的核心API,应用程序通过它来访问数据源(DataSource)中封装的数据以及数据的MIME类型,并通过它来获得JAF框架中为数据的MIME类型定义的操作列表(CommandMap),应用程序访问操作列表中的操作时,DataHandle还负责构建相应的命令对象(CommandObject)供应用程序使用。
~~DataSource接口用于将数据封装成可被JAF框架使用的对象,它定义了对数据源的调用操作,包括得到数据输入输出流的getInputStream和getOutptStream方法,以及得到数据MIME类型的getContentType方法。JAF中提供了DataSource接口的两个实现类:FileDataSource和URLDataSource,fileDataSource用于从文件系统中获取数据,URLDataSource用于从一个URL地址中获取数据。
~~DataContentHandler接口用于把DataSource中封装的数据转化成相应的java对象,或把java对象转化成MIME形式的字节流,并将其写入到输出流中。
~~CommandObject接口定义了一个对特定MIME类型数据执行特定操作的命令对象。
~~CommandMap代表操作特定MIME类型数据的所有命令对象的集合。
JAF框架可以说是一个封装数据的黑匣子,对于采用JAF封装的数据,数据使用者通过DataHandler提供的方法可以直接得到数据的MIME类型,以及操作数据的所有可用操作,无须关心底层实现细节。例如,甲方是数据的供应方,他准备好一个DataHandler对象给乙方使用,乙方只需要得到这个DataHandler对象,就可以知道数据类型的MIME类型,以及数据的可用操作,并且乙方还能调用这些操作对数据进行操作,具体的实现过程乙方完全不用担心。
3.DataSource接口:
DataSource用于封装底层各种存储形式的数据内容,并统一定义了数据源对象应该对外提供的操作方法,通过这些方法可以得到数据的MIME类型,以及对数据进行读写的输入输出流对象,DataSource接口定义的常用接口方法如下:
1.getInputStream方法:
getInputStream方法用于返回对数据进行读取的InputStream对象,getInputStream方法的语法定义如下:
~~public java.io.InputStream getInputStream()
2.getOutputStream方法:
getOutputStream方法用于返回可以向数据源写入数据的OutputStream对象,getOutputStream方法的语法定义如下:
~~public java.io.OutputStream getOutputStream()
3.getContentType方法:
getContentType方法用于返回数据源中封装的MIME类型,getContentType方法的语法定义如下:
~~public java.lang.String.getContentType()
如果DataSource接口的实现类不能确定数据的MIME类型,JAF规范建议实现类返回“application/octet-stream”这种MIME类型。
4.getName方法:
getName方法用于返回DataSource封装的数据的名称,getName方法的语法定义如下:
~~public java.lang.String getName();
如果数据源关联的是一个文件,该方法通常返回该文件的文件名。
JAF中提供了两个实现DataSource接口的API,他们分别是URLDataSource和FileDataSource.
5.URLDataSource类:
URLDataSource通过其构造函数和一个URL对象相关联,并通过这个URL对象获得数据的输入输出流,以及通过URL对象的Content-type属性获得数据的MIME类型。URLDataSource构造函数的语法定义如下:
~~public URLDataSource(java.net.URL url);
6.FileDataSource类:
FileDataSource类实现了DataSource接口,它通过文件获得数据的输入输出流,并通过一个名为FileTypeMap类获得数据的MIME类型
1.构造函数
FileDataSource类有两种重载形式的构造函数,他们的语法定义如下:
~~public FileDataSource(java.io.File file);
~~public FileDataSource(java.lang.String name)
第一个构造函数使用一个File对象实例化FileDataSource对象,第二个构造函数使用一个文件名实例化FileDataSource对象。
2.setFileTypeMap方法:
setFileTypeMap方法用于设置判断数据MIME类型的FileTypeMap对象,该方法的语法定义如下:
~~public void setFileTypeMap(FileTypeMap map)
3.getContentType方法:
getContentType方法用于返回数据的MIME类型,其语法定义如下所示:
~~public String getContentType();
getContentType方法首先检查应用程序是否显示调用FileDataSource对象的setFileTypeMap设置FileTypeMap对象,如果已设置,则调用设置的FileTypeMap的getContentType方法获得数据的MIME类型,否则,FileDataSource将调用FileTypeMap类的静态方法getDefaultFileTypeMap方法得到JAF框架提供的默认的FileTypeMap,然后通过该对象的getContentType方法获得数据的MIME类型,注意:JAF提供的默认的FileTypeMap为MimetypesFileTypeMap.
7.FileTypeMap类:
FileTypeMap是一个抽象类,它用于判断文件数据的MIME类型,FileTypeMap类的实现类将实现抽象方法getContentType,实现类通过该方法可以自定义获知数据MIME类型的方式,例如,根据文件后缀名判断其类型,打开文件根据数据内容判断其类型,查找windows注册变判断其类型等方式。
JAF提供了一个FileTypeMap的实现类MimetypesFileTypeMap,如果应用程序没有显示调用FileDataSource.setFileTypeMap设置任何FileTypeMap,JAF默认将使用此类来判断文件MIME类型。FileTypeMap类常用方法的定义如下所示:
1.getContentType方法:
getContentType方法用于返回文件的MIME类型,该方法有两种重载形式,其语法定义如下所示:
~~public abstract String getContentType(File file);
~~public abstract String getContentType(String filename)
2.setDefaultFileTypeMap方法:
setDefaultFileTypeMap方法用于设置系统默认的FileTypeMap,该方法的语法定义如下所示:
~~public static void setDefaultFileTypeMap(FileTypeMap map)
调用该方法后,设置的FileTypeMap实例将返回给getDefaultFileTypeMap的调用者
3.getDefaultFileTypeMap方法:
getDefaultFileTypeMap方法用于返回系统的默认FileTypeMap,该方法的语法定义如下:
~~public static FileTypeMap getDefaultFileTypeMap()
如果应用程序显示调用了setDefaultFileTypeMap方法,则该方法返回的设置FileTypeMap实例,否则返回MimetypesFileTypeMap的实例对象。
4.JAF获取文件MIME类型的过程:
如果应用程序没有显示调用FileDataSource对象的setFileTypeMap方法设置自定义的FileTypeMap对象,FileDataSource类将调用系统默认的MimetypesFileTypeMap对象来判断文件的MIME类型。MimetypesFileTypeMap对象通过其getContentType方法搜索一个“.mime.types”格式的文件,并根据文件的后缀名从“.mime.types”文件中查找与之对应的MIME类型返回给调用者,“.mime.types”文件专门用于定义文件后缀名和其MIME类型之间的映射关系。
JAF框架允许用户配置自定义的“.mime.types”文件,如果用户没有配置,则JAF框架使用其默认的“.mime.types”文件,activation.jar包中的mimetypes.default是JAF提供的默认映射文件,使用WinRAR打开activation.jar文件的META-INF目录,并双击该目录下的mimetypes.default文件,就可以看到这个文件的源文件如下图所示:
上图列出了JAF默认配置的文件后缀名和MIME类型之间的映射关系,如上图中的html,htm,HTML和HTM为后缀名的文件,其MIME类型都为text/html。MimetypesFileTypeMap的getContentType方法用于执行具体的查找功能,该方法被调用时,它将按照如下顺序进行查找,以获得文件后缀名对应的MIME类型。
1.当前MimetypesFileTypeMap对象中是否保存有文件后缀名与MIME类型的对应关系,也就是看应用程序是否曾调用过MimetypesFileTypeMap.addMimeTypes方法添加文件后缀名与MIME类型的对应关系。
2.从用户主目录下的.mime.types文件中查找文件后缀名与MIME类型之间的映射关系,
3.从<java.home>/lib/mime.types文件中查找文件后缀名与MIME类型之间的映射关系,
4.从用户jar包的META-INF/mime.types文件中查找文件后缀名为MIME类型之间的映射关系
5.从activation.jar包中的META-INF/mimetypes.default文件中查找文件后缀名为MIME类型之间的映射关系
从以上过程可以看到,用户有两种途径在JAF框架中配置自定义的文件后缀名和MIME类型之间的映射关系
1.在java应用程序中进行配置,例如,用户想增加文件后缀名为.java的MIME映射,则在应用程序中调用MimeTypesFileMap.addMimeTypes(“text/java java”)即可,“text/java java”中的text/java为MIME类型,java为文件后缀名,两者用空格进行分隔。
2.在“.mime.types”文件中配置,采用此种配置形式时,只须在2,3,4步骤所描述的路径下编写自己的“.mime.types”文件,“.mime.types”文件的编写需遵守如下两个规则:
~~注释以“#”开头
~~映射关系定义语法:<mime类型><空格><以空格分隔的文件扩展名>,例如,text/plain txt text TXT以上语句将文件后缀名为“.txt” ,".text","TXT"映射到mime类型“text/plain”中。
6.DataHandler类:
DataHandler类是JAF框架的核心API,它为应用程序和JAF框架之间定义了一个通用的数据访问接口,这个类定义的常用方法如下所示:
1.构造函数:
DataHandler类有三中形式的重载构造函数,他们的语法定义如下:
~~public DataHandler(DataSource ds)
~~public DataHandler(java.lang.Object obj,java.lang.String mimeType)
~~~~public DataHandler(java.net.URL url)
第一个方法使用一个DataSource对象实例化DataHandler对象,第二个方法使用一个指定MIME类型的java对象实例化DataHandler对象,第三个方法使用一个URL对象实例化DataHandler对象。
2.getDataSource对象:
getDataSource方法用于返回与此DataHandler实例关联的DataSource,其语法定义如下:
~~public DataSource getDataSource();
对于用DataSource实例化的DataHandler,此方法返回创建该DataHandler对象的DataSource,在其他情况下,DataHandler根据构造函数DataHandler的数据构造DataSource,并将其缓存,以提高性能。
3.getName方法:
getName方法用于返回数据对象的名称,该方法的语法定义如下:
~~public String getName()
如果此DataHandler是用DataSour创建的,则此方法直接调用DataSource.getName方法,否则返回null.
4.getContentType方法:
getContentType方法用于获得数据源中封装的数据MIME类型,其语法定义如下所示:
~~public String getContentType();
5.getInputStream方法:
getInputStream方法用于返回DataHandler对象的InputStream 流,该方法的语法定义如下:
~~public InputStream getInputStream() throws IOExpection;
对于用DataSource 实例化的DataHandler ,该DataHandler调用DataSource.getInputStream 方法,并将结果返回给调用者,对于用Object实例化的DataHandler,该DataHandler首先尝试找到Object 的DataContentHandler,如果DataHandler找不到此MIME类型的DataContentHandler,则抛出UnsupportedDataTypeException异常,如果能够找到,则它将创建一个管道和一个线程,该线程使用DataContentHandler的writeTo方法将数据写入管道的另外一端,管道的另外一端返回给调用者。注意:由于为复制数据创建了一个线程,所以在复制过程中发生的IOException不能传送给调用者,调用者得到的结果可能是一个空流。
6.writeTo方法:
writeTo方法用于将数据写入到一个指定的OutputStream中
~~public void writeTo(OutputStream os) throws IOException
如果DataHandler是用DataSource创建的,那么writeTo获取DataSource的InputStream并将字节从InputStream复制到传入的OutputStream。如果DataHandler是用Object创建的,则writeTo获取对象类型的DataContentHandler。如果找到了DataContentHandler,则它调用DataContentHandler对象的writeTo方法。
7.getOutputStream方法:
getOutputStream方法用于获取DataHandler对象的OutputStream流,以允许重写底层数据,该方法的语法定义如下:
~~public OutputStream getOutputStream() throws IOException;
如果DataHandler使用DataSource创建的,则调用DataSource的getOutputStream方法,否则,返回null.
8.setCommandMap方法:
setCommandMap方法用于设置此DataHandler使用的CommandMap,该方法的语法定义如下:
~~public void setCommandMap(CommandMap commandMap )
注意:构建DataHandler时,如果不调用此方法,或设置为null时DataHandler对象将使用一个缺省的CommandMap对象,DataHandler通过调用CommandMap的静态方法getDefaultCommandMap方法获得该缺省对象。
9.getPreferedCommands方法:
getPreferedCommands方法返回操作此数据类型的首选命令,该方法的语法定义如下:
~~public CommandInfo[] getPreferedCommands()
该方法调用关联到DataHandler对象中的CommandMap.getPreferedCommands方法,返回一个操作此数据类型可用命令的只集,该命令子集保存在一个Command类型的数组中。
10.getAllCommands方法:
getAllCommands方法返回操作此数据类型的所有可用命令,该方法的语法定义如下所示:
~~public CommandInfo[] getAllCommands();
该方法调用关联到DataHandler对象中的CommandMap,getAllCommands方法返回操作此数据类型的所有可操作命令,这些命令保存在一个CommandInfo类型的数组中。
11.getCommand方法:
getCommand方法返回指定名称的命令,该方法的语法定义如下所示:
~~public CommandInfo getCommand(String cmdName);
该方法调用关联到DataHandler对象中的CommandMap.getCommand方法获得操作命令。
12.getContent方法:
getContent方法用于返回代表数据的java对象,该方法的语法定义如下:
~~public Object getContent()throws IOException;
如果DataHandler是用一个对象实例化的,则返回该对象。如果DataHandler是用DataSource实例化的,则此方法使用DataContentHandler方法返回此DataHandler所表示数据的内容对象,如果找不到此数据类型的DataContentHandler,则DataHandler返回数据的InputStream。
13.getBean方法:
getBean方法返回一个JavaBean组件,这个JavaBean组件中关联了DataHandler中封装的数据,以及数据的操作命令,getBean方法的语法定义如下:
~~public Object getBean(CommandInfo cmdInfo )
该方法内部实质调用的是CommandInfo.getCommandObject方法,CommandInfo类将在后面章节介绍。
6.通过JAF框架操作数据:
对于采用JAF框架封装的数据,应用程序不仅可以通过DataHandler.getContentType方法获得数据的MIME类型,还可以调用DataHandler.getAllCommands方法得到该数据的所有可用操作,当调用者执行某一可用操作时,DataHandler.getBean方法将被调用,该方法返回一个用于完成当前操作的JavaBean组件,这个JavaBean组件是一个实现了CommandObject接口的对象也称之为命令对象。例如activation.jar中的\com\sun\activation\viewers目录下的TextViewer.class,TextEditer.class等,他们就是实现了CommandObjet接口的命令的对象,专门用于显示文本,编辑文本。
6.1CommandMap类:
应用程序调用DataHandler.getAllCommands方法来获得数据的所有可以操作时,该方法实质调用的是关联到DataHandler对象中的CommandMap.getAllCommands方法,CommandMap类主要方法的定义如下:
1.setDefaultCommandMap方法:
setDefaultCommandMap方法用于设置CommandMap对象默认的CommandMap,该方法的语法定义如下:
~~public static void setDefaultCommandMap(CommandMap commandMap)
通过用null调用此方法时,CommandMap将重置为默认值。
2.getDefaultCommandMap方法:
getDefaultCommandMap方法是一个静态方法,用于获取默认的CommandMap实例,该方法的语法定义如下:
~~public static CommandMap getDefaultCommandMap()
在CommandMap实例已经被设置为某值(通过setDefaultCommandMap)的情况下,返回该CommandMap。如果没有设置任何CommandMap,CommandMap将创建一个MailcapCommandMap的实例并将其值设置为默认值,并返回它的值。MailcapCommandMap是CommandMap的实现类。
3.getPreferedCommands方法:
getPreferedCommands方法根据指定的MIME类型获取首选的可用命令列表,该方法的语法定义如下:
~~public abstract CommandInfo[] getPreferedCommands(String mimeType)
4.getAllCommands方法:
getAllCommands方法用于返回指定MIME类型的所有可操作命令,该方法的语法定义如下:
~~public abstract CommandInfo[] getAllCommands(String mimeType)
5.getCommand方法:
getCommand方法返回与该MIME类型和命令相应的CommandInfo,该方法的语法定义如下:
~~public abstract CommandInfo getCommand(String mimeType,String cmdName)
参数mimeType指定MIME类型,cmdName指定命令名。
6.getMimeTypes方法:
getMimeTypes方法获得CommandMap映射所有的已知MIME类型,该方法的语法定义如下:
~~public String[] getMimeTypes();
6.2 CommandInfo类
CommandMap的实现类使用CommandInfo类描述命令请求的结果,CommandInfo类为调用者所请求的命令动词,以及命令对象的一个实例,它的常用方法如下所示:
1.构造函数
CommandInfo类的构造函数如下所示:
~~public CommandInfo(String verb,String className)
参数verb表示此CommandInfo描述的命令动词,className表示命令对象的完整类名,
2.getCommandName方法:
getCommandName方法返回CommandInfo描述的命令动词,该方法的语法定义如下:
~~public String getCommandName();
3.getCommandClass方法:
getCommandClass方法返回CommandInfo代表的命令对象的完整类名,该方法的语法定义如下所示:
~~public String getCommandClass();
4.getCommandObject方法:
getCommandObject方法返回已实例化的JavaBeam组件(命令对象),该方法的语法定义如下:
~~public Object getCommandObject(DateHandle dh,ClassLoader loader) throws IOException,ClassNotFoundException;
参数dh指定封装了数据的DateHandle对象,loader指定用于实例化JavaBean组件的ClassLoader。实例化的JavaBean组件通常实现了CommandObjetc接口,getCommandObject方法被调用时,它会调用CommandObject接口的setCommandContext方法把封装了数据的DataHandle和命令动词关联到JavaBean组件中。
6.3 CommandObject接口
JavaBean组件实现此接口,以获取该组件将要操作的数据,以及请求这些组件执行的命令动词,该接口只定义了一个方法,其语法定义如下所示:
~~void setCommandContext(String verb,DataHandle dh) throws IOExeption;
参数verb指定关联到组件上的命令动词,dh指定组件将要操作的数据,数据使用DataHandle对象进行封装。
6.4 JAF框架构建CommandObject对象的过程:
对于采用JAF框架封装的数据,JAF框架通过FileTypeMap获得数据的MIME类型后,可以自动根据数据的MIME类型,为调用者提供操作该数据的所有可用操作,即调用者调用DataHandle.getAllCommands方法时,该方法会根据数据的MIME类型,为调用者返回一个CommandInfo类型的数组,数组中的CommandInfo对象不仅代表对数据的可用操作,它还关联了与这些操作相对应的java对象,这些java对象通常是实现了CommandObject接口JavaBean组件,所以也称之为命令对象。调用者如果想执行某一个CommandInfo,只需要调用DataHandle.getBean(CommandInfo cmdInfo)方法,JAF框架将自动构建CommanfInfo对象中的命令,并把封装了数据的DataHandle对象关联到命令对象中返回给调用者。
调用者调用DataHandle.getAllCommands方法得到数据的所有可用操作时,其底层实际是调用关联到DataHandle对象中的CommandMap对象的getAllCommands方法,当DataHandle.getAllCommands方法被调用时,该方法首先检查DataHandle对象中是否存在已经关联的commandMap对象,即DataHandle.setCommandMap方法是否被显示调用,设置了自定义的CommandMap对象。如设置了则调用该对象的getAllCommands方法,否则,调用CommandMap类的静态方法getDefaultCommandMap得到JAF提供的CommandMap的默认实现类MailcapCommandMap,然后调用MailcapCommandMap对象的getAllCommands方法。
MailcapCommandMap对象的getAllCommands方法搜索一个“mailcap”格式的文件,该方法根据数据的MIME类型从"mailcap"文件中得到操作数据的命令和命令对象,“mailcap”文件专用于定义MIME类型和命令,命令对象之间的映射关系,JAF框架允许用户配置自定义的“mailcap”文件,如果用户没有配置,则JAF框架的MailcapCommandMap类使用默认的“mailcap”文件,activation.jar包中的mailcap.default是JAF提供的默认的映射文件,使用Winrar打开activation.jar文件的META-INF目录,并双击该目录下的mailcap.default文件,就可以看到这个文件的源文件,如下图所示:
如上图所示,列出了JAF默认配置的MIME类型和命令,命令对象之间的映射关系,如上图的image/gif这种MIME类型对于于一个view命令,和一个com.sun.activation.viewers.ImageViewer的命令对象,关于mailcup文件的具体格式稍后介绍:
MailcapCommandMap对象的getAllCommands方法被调用时,它根据数据的MIME类型按照如下顺序进行搜索,以检索出与MME类型相对应操作命令和命令对象
1.以编程方式添加到MailcapCommandMap实例的条目,即应用程序是否显示调用addMapcap方法添加MIME类型与命令对象之间的映射关系
2.用户主目录的.mailcap文件
3.<java.home>/lib/mailcap文件
4.名为META-INF/mailcap的文件或资源
5.activation.jar中的META-INF/mailcap.default
以上搜索顺序可以看到,JAF框架允许用户配置自定义的MIME类型和命令,命令对象之间的映射关系,用户有如下两种途径进行配置,
1.在应用程序中进行配置,用户调用MailcapCommandMap.addMailcap方法添加相应的映射关系到应用程序中
2.在自定义的mailcap文件中配置,采用此种方式配置时,只需要在2.3.4步骤所描述的路径下编写自己的mailcap文件“.mime.types”文件的编写必须遵守mailcap的文件规范
~~注释以“#”号开头
~~定义的参数如下形式出现:纯文本;;x-java-<name>=完整的类名
其中纯文本指定MIME类型,命令以x-java-<name>=形式出现,name用于指定命令名,命令名所对应的命令对象在命令后指定,
6.5 编写和安装自定义的命令处理器
通过以上学习,我们可以通过一句话概括JAF框架在默认情况下对于某个文件的处理流程,它首先按照上节讲解的方式从一个.mime.types文件获得文件的MIME类型,然后根据MIME类型6.4节讲解的方式从一个mailcap文件中获得文件的可以操作。
JAF框架为应用程序提供了一种处理数据的扩展机制,例如,假设软件开发者使用JAF框架已经开发好了一个可以处理“.txt”,“.java”,".html"格式的文件编辑器,将来他在升级文件编辑器的时候,想让文件编辑器能处理“.it315”格式的文件,那么他无须改动以前的代码,只需要完成以下3个步骤,应用程序就拥有处理“.it315”文件的功能。
1.编写处理“.it315”文件的JavaBean组件,并实现CommandObject接口,例如他可以定义三个处理类it315ViewBean,it315EditBean,it315PrintBean,他们分别用来显示,编辑,打印“it315”格式的文件。
2.参照activation.jar文件中的mailcap.default文件,照猫画虎的编写一个自己的mailcap文件,其内容如下:
#
# This is a very simple 'mailcap' file
#
application/x-315;;
x-java-view=org.it315.it315ViewBean
x-java-edit=org.it315.it315EditBean
x-java-print=org.it315.it315PrintBean
然后把mailcap文件保存到7.6.4节中的MailcapCommandMap类的搜索路径中。
3.参照activation.jar文件中的mimetypes.default文件,照猫画虎编写一个自己的mimetypes文件,把文件后缀名和MIME类型相关联,如下所示:
application/x-it315 it315
然后把mimetypes文件保存到7.4节中MimeTypesFileMap类的搜索路径中,完成上面3个步骤,即可在JAF中安装自定义的命令处理器。
注意:
JAF操作数据的功能主要应用在图形应用中,在邮件接收程序中应用JAF框架可以简化在图形窗口中显示MIME消息的过程,由于web应用下的邮件解析程序比客户端形式的邮件解析程序应用更为广泛,并且IE浏览器已经内置了对MIME数据的显示处理,因此不打算对JAF框架中用于对数据处理的API进行深入探讨。