JAF框架及在JavaMail中的应用

来源:互联网 发布:淘宝解冻的金额在哪 编辑:程序博客网 时间:2024/06/06 15:53

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进行深入探讨。

 

 

1 0
原创粉丝点击