1.3 Java EE的核心API与组件
1. JDBC(Java Data Base Connectivity)
JDBC是Java的开发者——Sun的Javasoft公司制订的Java数据库连接(Java Data Base Connectivity)技术的简称,是为各种常用数据库提供无缝连接的技术。JDBC在Web和Internet应用程序中的作用和ODBC在Windows系列平台应用程序中的作用类似。ODBC(Open Data Base Connectivity),称为开放式数据库互联技术,是由Microsoft公司倡导并得到业界普遍响应的一门数据库连接技术,如果读者有使用ODBC编程的经验,就会发现JDBC与ODBC很类似。JDBC现在可以连接的数据库包括:xbase、Oracle、Sybase、Access以及Paradox等。
●JDBC的工作机制
SQL(Structure Query Language,结构化查询语言),它是一种标准化的关系型数据库访问语言。在SQL看来,数据库就是表的集合,其中包含了行和列。SQL标准虽然也还处在不断变革之中,但其基本内容相对稳定。JDBC定义了Java语言同SQL数据之间的程序设计接口。
JDBC有一个非常独特的动态连接结构,它使得系统模块化。使用JDBC来完成对数据库的访问包括以下4个主要组件:Java的应用程序、JDBC驱动器管理器、驱动器和数据源。
JavaSoft公司开发了JDBC API, JDBC API是一个标准统一的SQL数据存取接口。它为Java程序提供了一个统一地操作各种数据库的接口,程序员编程时,可以不关心它所要操作的数据库是哪个厂家的产品,从而提高了软件的通用性,而且在Internet上确实无法预料你的用户想访问什么类型的数据库。只要系统上安装了正确的驱动器组,JDBC应用程序就可以访问其相关的数据库。
用JDBC来实现访问数据库采用下面的几个步骤:
(1)通过驱动器管理器获取连接接口。
(2)获得Statement或它的子类。
(3)限制Statement中的参数。
(4)执行Statement。
(5)查看返回的行数是否超出范围。
(6)关闭Statement。
(7)处理其他的Statement
(8)关闭连接接口。
●JDBC API
JDBC API使开发者不必不断重写程序,而可以建立数据库前台。尽管ANSI委员会有个标准组,但每个数据库系统厂家的系统连接和通信方法仍然五花八门。
JavaSoft是Sun公司负责开发Java产品的业务单位,和数据库与数据库工具厂家一起建立独立于DBMS的机制,使开发人员不必考虑所用的特定数据库而编写客户机方应用程序。产生的JDBC API第一版是核心JDK 2的一部分。
JDBC向应用程序开发者提供了独立于数据库的统一的API。这个API提供了编写的标准和考虑所有不同应用程序设计的标准。其奥秘是一组由驱动程序实现的Java接口。驱动程序负责标准JDBC调用向支持的数据库所要的具体调用转变。
应用程序编写一次并移植到各种驱动程序上。应用程序不变,驱动程序则各不相同。驱动程序可以用于开发多层数据库设计的中间层,也称中间件(middleware)。
除了向开发者提供统一的独立于DBMS的框架外,JDBC还提供了让开发者保持数据库厂家提供的特定功能的办法。JDBC驱动程序必须支持ANSI AQL-2项目层,但JDBC允许开发者直接将查询字符串传递到连接的驱动程序。这些字段可能是ANSI SQL也可能不是,或者根本不是AQL。这些字符串的使用是基础驱动程序的事。
JDBC不是Microsoft的ODBC(开放式数据库互联)规范派生的,JDBC完全是用Java编写的,而ODBC是个C接口。但是,JDBC和ODBC都是基于X/开放SQL命令层接口(CLI),相同的概念性基础使API工作进展更快,使API的接受更加容易。JavaSoft提供了将JDBC变成ODBC的JDBC-ODBC桥。这个用本地方法完成的版本很小很有效。
一般来说,JDBC API中有两层接口:应用程序层,开发人员用API通过SQL调用数据库和取得结果,驱动程序层,处理与具体驱动程序版本的所有通信。
每个JDBC应用程序(或小程序)至少要有一个JDBC驱动程序,每个驱动程序是针对一种DBMS的。但驱动程序不必直接连接到数据库。
●JDBC的优点和缺点
JDBC API用于连接Java应用程序与各种关系数据库。这使得人们在建立客户/服务器应用程序时,通常把Java作为编程语言,把任何一种浏览器作为应用程序的友好界面,把Internet或Intranet作为网络主干,把有关的数据库作为数据库后端。以下是使用JDBC的优缺点。
优点如下:
(1)JDBC API与ODBC十分相似,有利于用户理解。
(2)JDBC使得编程人员从复杂的驱动器调用命令和函数中解脱出来,可以致力于应用程序中的关键地方。
(3)JDBC支持不同的关系数据库,使得程序的可移植性大大加强。
(4)用户可以使用JDBC-ODBC桥驱动器将JDBC函数调用转换为ODBC。
(5)JDBC API是面向对象的,可以让用户把常用的方法封装为一个类,以备后用。
缺点如下:
(1)使用JDBC,访问数据记录的速度会受到一定程度的影响。
(2)JDBC结构中包含了不同厂家的产品,这就给更改数据源带来了很大的麻烦。
2. JNDI(The Java Naming and Directory Interface)
JNDI(The Java Naming and Directory Interface, Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。
命名或目录服务使你可以集中存储共有信息,这一点在网络应用中是重要的,因为这使得这样的应用更协调、更容易管理。例如,可以将打印机设置存储在目录服务中,以便被与打印机有关的应用使用。
●JNDI概述
其实我们每天都不知不觉地使用了命名服务。例如,当你在Web浏览器输入URL, Java.sun.com时,DNS(Domain Name System,域名系统)将这个符号URL名转换成通信标识(IP地址)。命名系统中的对象可以是DNS记录中的名称、应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP(Lightweight Directory Access Protocol)中的用户Profile。
目录服务是命名服务的自然扩展。两者之间的关键差别是目录服务中对象可以有属性(例如,用户有E-mail地址),而命名服务中对象没有属性。因此,在目录服务中,用户可以根据属性搜索对象。JNDI允许用户访问文件系统中的文件,定位远程RMI注册的对象,访问像LDAP这样的目录服务,定位网络上的EJB组件。
对于像LDAP客户端、应用launcher、类浏览器、网络管理实用程序,甚至地址簿这样的应用来说,JNDI是一个很好的选择。
注释
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了,并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必需的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAP man RFC网页中找到。现在LDAP技术不仅发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表,等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工在企业内部查询信息的步骤,甚至主要的数据源都可以放在任何地方。
●JNDI API
JNDI API由5个包组成。
(1)Javax.naming:包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。
(2)Javax.naming.directory:对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。
(3)Javax.naming.event:提供了对访问命名和目录服务时的时间通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。
(4)Javax.naming.ldap:这个包提供了对LDAP版本3扩充的操作和控制的支持,通用包Javax.naming.directory没有包含这些操作和控制。
(5)Javax.naming.spi:这个包提供了一个方法,通过Javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。
3. EJB(Enterprise JavaBean)
EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序,类似微软的.com技术。凭借Java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJB(Enterprise JavaBean)是Java EE的一部分,定义了一个用于开发基于组件的企业多层应用程序的标准,包括网络服务支持和核心开发工具(SDK)。
在Java EE里,Enterprise Java Beans(EJB)称为Java企业Bean,定义了三种类型,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
(1)Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
(2)Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
(3)MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间地等待一个方法调用直到返回结果。
EJB实际上是Sun的Java EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品。
●EJB需求
(1)EJB容器完成繁杂的工作:应用开发人员关注于业务逻辑的实现而不是底层的实现机制。
(2)支持事务处理。
(3)多个业务操作同时成功,或全部失败。
(4)可以通过在代码外的描述来定义事务处理级别的可扩展性EJB,根据应用的增长而扩展。
(5)EJB服务器往往还提供了负载均衡和安全性:由EJB服务器提供资源的访问权限控制。
●EJB的调用过程
(1)通过上下文环境Context获得JNDI,一般是在properties文件中配置JNDI驱动,服务器的网络地址等的设置。
(2)获得JNDI后,通过上下文环境Context.lookup()得到JNDI的name。
(3)获得Home接口:PortableRemoteObject.narrow()。
(4)使用工厂来创建EJB对象:Home接口的create()方法得到EJB远程接口的实现。
(5)调用EJB对象的方法,将委派给EJB Bean类实例,一旦接受到响应结果便返回。
4. RMI(Remote Method Invocation)
RMI(Remote Method Invocation,远程方法调用)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI非常容易使用,也非常强大。RMI的基础是接口,RMI构架基于一个重要的原理:定义接口和定义接口的具体实现是分开的。
一个正常工作的RMI系统由下面几个部分组成:
(1)远程服务的接口定义。
(2)远程服务接口的具体实现。
(3)桩(Stub)和框架(Skeleton)文件。
(4)一个运行远程服务的服务器。
(5)一个RMI命名服务,它允许客户端去发现这个远程服务。
(6)类文件的提供者(一个HTTP或者FTP服务器)。
(7)一个需要这个远程服务的客户端程序。
5. Java IDL/CORBA
Java IDL(Interface Definition Language,接口定义语言)为Java 2平台添加了CORBA(Common Object Request Broker Architecture,公用对象请求代理体系结构)功能,从而可提供基于标准的互操作性和连接性。Java IDL使分布式、支持Web的Java应用程序可利用OMG(Object Management Group,对象管理组织)定义的行业标准OMG IDL(Object Management Group Interface Definition Language,对象管理组接口定义语言)及IIOP(Internet Inter-ORB Protocol, Internet对象请求代理间协议)来透明地调用远程网络服务。运行时组件包括一个全兼容Java ORB(Object Request Broker,对象请求代理),用于通过IIOP通信进行分布式计算。
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序的体系规范。或者说CORBA体系结构是对象管理组织为解决分布式处理环境中,硬件和软件系统的互连而提出的一种解决方案。
CORBA定义了一系列API、通信协议和物件/服务信息模型,用于使得异质应用程序能够互相操作,这些应用程序用不同的程序语言编写,运行在不同的平台上。
为了使Java支持CORBA规范说明,需要一条把IDL中的元素映射为Java中元素的标准途径,Sun已经制订了两者之间的映射规则,并提供了编译器IDL to Java,以便从IDL得到相应的桩和骨架。
和Java中的接口一样,IDL接口不包含方法的具体实现,Java开发人员需在Java类中提供对这些方法的具体实现。
6. JSP(Java Server Pages)
JSP(JavaServer Pages)技术能让Web开发员和网页设计员快速地开发容易维护的动态Web网页,并且用JSP开发的Web应用是跨平台的。
在传统的网页HTML文件中加入Java程序片段和JSP标记,就构成了JSP网页,Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、可以重新定向网页、可以发送E-mail、等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端仅是得到的结果,对客户浏览器的要求最低。
在Sun正式发布JSP之后,这种新的Web应用开发技术很快引起了人们的关注。JSP为创建高度动态的Web应用提供了一个独特的开发环境。JSP能够适应市场上包括Apache WebServer、IIS4.0在内的85%的服务器产品。
JSP与Microsoft的ASP技术非常相似。ASP的编程语言是VBScript之类的脚本语言,JSP使用的是Java,这是两者最明显的区别。此外,ASP与JSP还有一个更为本质的区别:两种语言引擎用完全不同的方式处理页面中嵌入的程序代码。在ASP下,VBScript代码被ASP引擎解释执行;在JSP下,代码被编译成Servlet并由Java虚拟机执行,这种编译操作仅在对JSP页面的第一次请求时发生。
事实证明,Java Servlet是一种开发Web应用的理想构架。JSP以Servlet技术为基础,又在许多方面作了改进。利用跨平台运行的JavaBean组件,JSP为分离处理逻辑与显示样式提供了卓越的解决方案。
7. Servlet
Servlet是用Java语言编写的运行在服务器端的小应用程序,能够接收Web客户端的请求,并能对Web客户端进行响应,通常是通过HTTP协议进行工作的。可以认为Servlet是服务器端的Applet。Servlet程序不是Java核心框架的一部分,但可以作为通用的附加产品包被商家购买使用。
实际Servlet是电子商务真正的开始。用Servlet API来编写Servlet已没有像CGI脚本那样诸如关心一个Servlet是怎样被装载,Servlet运行的服务器环境是什么,或者用来传输数据的协议是什么等等,这样Servlet就可以融合在不同的Web服务器中。
Servlet可以有效地替代CGI脚本,它可以方便地产生容易编写而且运行快的动态文本,可以很方便地调试寻找出程序问题。
下面是一些Servlet应用范围。
(1)用于处理HTML表单通过HTTPS产生POST数据,包括买卖订单或信用卡数据。因此Servlet可以成为订单处理系统的一部分,和产品存货数据库一道工作,也许可以用在在线支付系统上。
(2)允许人们之间的合作,一个Servlet能并发处理多个请求;它们可以使用在诸如在线会议这样的同步请求支持系统。
(3)转送请求,Servlet可以转送请求给其他的服务器和Servlet,这就允许在镜像同样内容的几个服务器之间平衡负载,按照任务类型或组织范围,可以允许被用来在几个服务器中划分逻辑上的服务器。
(4)Servlet编写者们可以定义彼此之间共同工作的激活代理,每个代理者是一个Servlet,而且代理者能够在它们之间传送数据。
●Servlet生命周期
Servlet有良好的生存周期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期通过和javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。
Servlet的生命周期包含了下面4个阶段:
(1)Servlet加载。
(2)初始化。
(3)服务。
(4)服务终止。
8. XML(Extensible Markup Language)
XML(Extensible Markup Language,可扩展的标记语言)与HTML相似,XML是一种显示数据的标记语言,它能使数据通过网络无障碍地进行传输,并显示在用户的浏览器上。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
XML用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的,但是,它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合,您可以得到一个完美的具有平台独立性的解决方案。
XML不只是像超文本标记语言(Hypertext Markup Language, HTML)或是格式化的程序。这些语言定义了一套固定的标记,用来描述一定数目的元素。用户可以定义自己需要的标记。这些标记必须根据某些通用的原理来创建,但是在标记的意义上,也具有相当的灵活性。
XML能够自解释,使用DTD(Document Type Definition,文档类型定义)来显示这些数据。
●XML与HTML
(1)XML不是HTML的替代品,用途是不同的,是被设计用来描述数据和定焦与数据是什么。而HTML是被设计用来显示数据和定焦与数据是什么样子的。
(2)XML是关于数据的语言,XML是关于如何描述信息的,而HTML是关于如何显示信息的。
(3)XML是可扩展的,在HTML中所有的标志和文档结构都是预先定义好了的,只能使用那些标准的HTML标志。XML允许我们自定义自己的标志和自己的文档结构。
(4)XML是HTML的一种。
在将来最可能的是网站开发者使用XML来描述网站所需数据和网站的结构,而HTML将用来格式化和显示这些数据。
●XML使用
(1)XML把数据从HTML分离。
(2)XML简化数据共享。
(3)XML简化数据传输。
(4)XML简化平台的变更。
(5)XML使您的数据更有用。
(6)XML用于创建新的Internet语言。
9. JMS(Java Message Service)
JMS(Java Message Service, Java消息服务)是Sun及其伙伴公司提出的,旨在统一各种消息中间件系统接口的规范。它定义了一套通用的接口和相关语义,提供了诸如持久、验证和事务的消息服务,它最主要的目的是允许Java应用程序访问现有的消息中间件。JMS规范没有指定在消息节点间所使用的通信底层协议,来保证应用开发人员不用与其细节打交道,一个特定的JMS实现可能提供基于TCP/IP、HTTP、UDP或者其他的协议。
目前许多厂商采用并实现了JMS API,现在JMS产品能够为企业提供一套完整的消息传递功能,一些比较流行的JMS商业软件和开源产品有IBM MQSeries、WebLogic、SonicMQ、Active MQ和OpenJMS。
JMS支持消息中间件的两种传递模式:点到点模式和发布—订阅模式。
10. JTS(Java Transaction Service)
JTS(Java Transaction Service, Java事务服务)是Java EE架构的关键元素。它与Java Transaction API结合在一起,使我们能够构建对于各种系统和网络故障都非常健壮的分布式应用程序。事务是可靠应用程序的基本构建块——如果没有事务的支持,编写可靠的分布式应用程序将是非常困难的。幸运的是,JTS执行的大部分工作对于程序员都是透明的;Java EE容器使事务划分和资源征用对程序员来说几乎是不可见的。事务允许采用某种控制方式修改应用程序的持久性状态,以便使应用程序对于各种各样的系统故障(包括系统崩溃、网络故障、电源故障甚至自然灾害)更加健壮。事务是构建容错、高可靠性以及高可用性应用程序所需的基本构建块之一。
事务(Transaction)是由一系列操作序列构成的程序执行单元,这些操作要么都做,要么都不做,是一个不可分割的工作单位,具有原子性、一致性、隔离性以及持久性,这些性质统称为ACID特性。
(1)原子性(Atomicity)
意味着要么所有事务操作都应用于应用程序状态,要么都不应用;事务是不可拆分的工作单元。
(2)一致性(Consistency)
意味着事务代表应用程序状态的正确转换——即事务不能违反应用程序中固有的任何完整性限制。实际上,一致性的概念是特定于应用程序的。例如,在记账应用程序中,一致性可能包括所有资产账户的总和始终等于所有负债账户的总和这个不变式。
(3)隔离性(Isolation)
意味着一个事务的效果不影响正在同时执行的其他事务。从事务的角度讲,它意味着事务按顺序执行而不是并行执行。在数据库系统中,通常通过使用锁机制来实现隔离性。为了使应用程序获得最佳性能,有时也会对某些事务放松隔离性的要求。
(4)持久性(Durability)
表示着一旦成功完成某个事务,对应用程序状态所做的更改将“经得起失败”。
典型事务有几个参与者——应用程序、事务监视器(TPM)以及一个或多个资源管理器(RM)。资源管理器存储应用程序状态,常常是数据库,但也可能是消息队列服务器(在Java EE应用程序中,它们将是JMS提供者)或其他事务性资源。TPM协调RM的活动,以确保事务“要么全有,要么全无”属性。
注释
TPM最初的含义是“全员生产保全(Total Productive Maintenance)”,即通过员工素质与设备效率的提高,使企业的体质得到根本改善。随着TPM在企业中的广泛运用,其含义已拓展得更宽广。目前在中国一般称为“全面生产性管理(Total Productive Management)”。有人把TPM称为“综合生产力经营管理(Total Productivity Management)”,因为它与企业经营目标直接关联。日本丰田生产系统(Toyota Production System)实际上也是一种TPM——“全面理想化生产的TPM(Total Perfect Manufacturing )”。虽然关于TPM的解释因不同国家、地区、企业、推进人员而异,但其基本点都是相同的:TPM是一种全员参与的管理活动,是彻底持续的改善活动,是集思广益、众人拾柴火焰高的代名词,是一种帮助企业赚钱为个人谋发展的双赢活动——“全面赢利经营(Total Profitable Management)”。
11. JTA(Java Transaction API)
Java事务AP(I Java Transaction API)和它的同胞Java事务服务(Java Transaction Service),为Java EE平台提供了分布式事务服务。一个分布式事务(Distributed Transaction)包括一个事务管理器(Transaction Manager)和一个或多个资源管理器(Resource Manager)。一个资源管理器(Resource Manager)是任意类型的持久化数据存储。事务管理器(Transaction Manager)承担着所有事务参与单元间的相互通信的责任。
12. JavaMail
JavaMail API是一种可选的、能用于读取、编写和发送电子消息的包(标准扩展),可使用这种包创建邮件用户代理(Mail User Agent , MUA)类型的程序,它类似于Eudora、Pine及Microsoft Outlook这些邮件程序。其主要目的不是像发送邮件或其他邮件传输代理(Mail Transfer Agent, MTA)类型的程序那样用于传输、发送和转发消息。换句话说,用户可以与MUA类型的程序交互,以阅读和撰写电子邮件。MUA依靠MTA处理实际的发送任务。
深入学习需要熟悉以下协议:
●SMTP
SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于传送电子邮件的机制。在JavaMail API环境中,基于JavaMail的程序将与Internet服务提供商(ISP)的SMTP服务器通信。该SMTP服务器将会把消息转发给用作接收消息的SMTP服务器,最后用户可通过POP或IMAP协议获取该消息。由于支持身份验证,所以不需要SMTP服务器是一种开放的转发器,但需要确保SMTP服务器配置正确。JavaMail API中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件账户这一类任务的功能。
●POP
POP(Post Office Protocol,邮局协议)当前的版本为3,也称作POP3。该协议是在RFC 1993中定义的。POP是Internet上的大多数人用来接收邮件的机制。它为每个用户的每个邮箱定义支持,这是它所做的全部工作,也是大多数问题的根源。在使用POP协议时,人们熟悉的很多功能,如查看收到了多少新邮件消息的功能,POP根本不支持。这些功能都内置到诸如Eudora或Microsoft Outlook之类的邮件程序中,能为您记住接收的上一封邮件,以及计算有多少新邮件这类信息。因此,使用JavaMail API时,如果想获取这类信息,将需要由自己进行计算。
●IMAP
IMAP(Internet Message Access Protocol,交互邮件访问协议)是用于接收消息的更加高级的协议,它是在RFC 2060中定义的。IMAP的含义是“Internet消息访问协议”,当前版本是第4版,也称作IMAP4。使用IMAP时,您的邮件服务器必须支持该协议。不能只是简单地把程序转变为支持IMAP,而不是支持POP,就指望能支持IMAP中的一切。假定邮件服务器支持IMAP,那么基于JavaMail的程序就可利用在服务器上拥有多个文件夹的用户,并且这些文件夹可以被多个用户共享的功能。由于IMAP协议具有更高级的功能,也许会想IMAP应该被每一个人使用,但事实不是这样。因为IMAP会加重邮件服务器的负荷,它需要服务器接收新消息,发送消息给请求的用户,并在多个文件夹中为每个用户维护这些消息。而这要集中备份,因而长期下去用户的文件夹会变得越来越大,当磁盘空间用光时,每个人都会遭受损失。而使用POP协议时,已保存消息可以解除服务器的重负。
●MIME
MIME(Multipurpose Internet Mail Exchange,多用途的网际邮件扩充协议)不是一种邮件传输协议,相反,它定义传输的内容:消息的格式、附件等。许多文档都定义了MIME协议,包含:RFC 822、RFC 2045、RFC 2046和RFC 2047。作为JavaMail API的用户,一般不需要担心这些格式。但是,这些格式确实存在,并为您的程序所用。
13. JAF(JavaBeans Activation Framework)
JavaMail利用JAF(JavaBeans Activation Framework, JavaBeans激活框架)来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者转换自Java对象。大多数应用都可以不需要直接使用JAF。