综 述 今天,开发人员越发认识到市场对分布性、事务性和移动性应用的需求,这种应用能发挥服务器端技术在速度、安全和可靠性方面的优势。企业业务运营需要企业应用作为支撑,而这些应用通常是集中管理的,并且经常需要与其他的企业软件进行协作。在信息技术时代,必须本着投资少、见效快、省资源的原则来设计、开发和构建企业应用。 随着Java EE(Java Platform, Enterprise Edition,Java平台企业版)的出现,基于Java的企业应用开发变得前所未有地简单,开发周期也明显缩短。Java EE的目标是为开发人员提供一组强大的API,以缩短开发周期,降低应用的复杂度,并改善应用的性能。 JCP(Java Community Process)负责Java EE的研发工作,管理所有Java相关技术。由相关各方组成的专家组编制JSR(Java Specification Request,Java规范请求),以此定义Java EE相关技术规范。JCP的工作就是确保Java技术标准满足稳定性和跨平台兼容性的要求。 Java EE平台使用简化的编程模型。XML部署描述文件不再是强制性的要求。取而代之的是,开发人员可以以注解的方式,在Java源文件中直接写入这些信息。Java EE服务器会在部署和运行的时候配置相关组件。注解(annotation)通常嵌入在代码中,以替代那些原先需要在部署描述文件中声明的对组件的配置信息。注解使得组件的逻辑和配置信息紧密地结合在一起,从而更加直观和便于阅读。 在Java EE平台中,可以通过依赖注入(dependency injection)提供组件需要的所有资源,因而不必通过应用程序代码创建和查找资源。依赖注入可以应用于EJB容器、Web容器和应用客户端。依赖注入允许Java EE容器以注解的方式自动插入对其他必要组件和资源的引用。 本书通过示例讲解了开发企业应用时可以使用的Java EE平台特性。无论是新手还是经验丰富的企业应用开发人员,本书使用的示例和通俗的讲解都能为你创建自己的解决方案提供帮助。 如果你刚刚开始学习Java EE企业应用开发,本章是一个很好的起点。在这里可以学习基础开发知识,了解Java EE架构和API,熟悉重要的术语和概念,并且学会如何编写、装配和部署Java EE应用。 本章内容 Java EE 6平台新特性 Java EE应用模型 分布式多层应用 Java EE容器 Web 服务支持 Java EE应用程序装配与部署 打包应用程序 开发中的角色分工 Java EE 6 API Java标准版6.0中的Java EE 6 API GlassFish服务器工具 1.1 Java EE 6平台新特性 Java EE 6平台最重要的目标是简化开发过程。Java EE 6以平台的方式,为不同类型的组件提供了一个通用的基础框架。开发人员开发效率的提升得益于更多的注解、更少的XML配置、更多的POJO(Plain Old Java Object,简单Java对象),以及简化的程序打包方式。Java EE 6平台包括如下新特性。 配置文件,它是为特定应用程序类型设定的Java EE平台配置。具体来说,Java EE 6为下一代Web应用程序引入了一种轻量级的Web Profile,为企业应用提供了包括全部Java EE技术、涵盖Java EE 6平台所有功能的Full Profile。 新技术,包括: JAX-RS(构建REST式 Web服务的Java API); 托管Bean; Java EE平台的上下文和依赖注入(JSR 299),又称CDI; Java依赖注入(JSR 330); Bean 验证规范(JSR 303); JASPIC(Java Authentication Service Provider Interface for Containers,Java容器认证服务接口)。 EJB(Enterprise JavaBeans,企业JavaBeans)组件新特性(参见1.9.1节)。 Servlet新特性(参见1.9.2节)。 JavaServer Faces组件新特性(参见1.9.3节)。 1.2 Java EE应用模型 Java EE应用模型以Java编程语言和Java虚拟机为前提,它们提供的应用可移植性强、安全性好、开发效率高,这构成了应用模型的基础。Java EE旨在帮助开发和部署企业级服务应用,以便为对企业有要求或贡献的客户、员工、供应商、合作伙伴以及其他角色提供帮助。这些应用本身复杂度高,涉及的数据源多,服务受众面广。 为了更好地控制和管理这些应用,面向不同用户的业务逻辑位于模型的中间层。中间层是一种受到企业IT部门严格控制的运行环境。中间层通常运行在专用的服务器硬件上,拥有访问企业全部服务的权限。 Java EE应用模型定义了一种架构,可以实现企业级应用系统所需的,具备可扩展性、可操作性以及可管理性的多层式应用。这个模型将一个多层次的服务划分为以下几个部分: 开发人员实现的业务和表现逻辑; Java EE平台提供的标准系统服务。 借助于Java EE平台,开发人员可以为多层服务开发所面临的复杂的系统级问题提供解决方案。 1.3 分布式多层应用 Java EE平台使用分布式多层应用模型构建企业应用。应用逻辑根据功能划分为不同的组件,而应用组件被安装至不同的主机。在主机上部署的原则取决于应用组件在Java EE多层环境中所在的层次。 在图1-1中,两个多层Java EE应用按照下面的方式被划分为多个层次。图1-1中展示的Java EE应用部分将在1.3.2节介绍。 图1-1 多层应用 客户端层组件运行在客户机上。 Web层组件运行在Java EE服务器上。 业务层组件运行在于Java EE服务器上。 EIS(Enterprise Information System,企业信息系统)层软件运行在EIS服务器上。 虽然如图1-1所示,一个Java EE应用可能由3或4层构成,但Java EE多层应用通常被认为是三层结构。其原因是这类应用通常部署在3个物理设备上:客户端主机、Java EE服务器以及数据库服务器(或后端的遗留系统主机)。以这种方式运行的三层应用扩展了标准的两层应用模式(即客户机服务器模式),它在客户端应用与后端存储之间增加了一个支持多线程的应用服务器。 1.3.1 安全 基于其他企业应用模型开发的企业应用,都需要考虑与特定平台相关的安全问题,而Java EE的安全环境使得安全约束可在部署阶段才设定。Java EE平台让开发人员不用考虑安全性带来的复杂实现细节,使得基于Java EE平台的应用移植性更好,能够适应各种不同的安全场合。 Java EE平台提供了标准的声明式访问控制规则。这些规则是由开发人员定义的,仅在将应用部署到服务器上的时候才会被解析。Java EE也提供了标准的登录机制(login mechanism),因此应用开发人员无需在自己的应用中专门实现它。无需修改源代码,同样的应用就可以在不同的安全环境下正常工作。 1.3.2 Java EE组件 Java EE应用由组件构成。Java EE组件是一个可以装配至Java EE应用中,具备完整功能的软件单元。Java EE组件包括与之相关的类和文件,可与其他组件通信。 Java EE规范定义了如下Java EE组件: 应用客户端以及运行于客户端上的小程序(applet); Java Servlet、JavaServer Faces、JavaServer Pages是运行于Java服务器上的Web组件; Enterprise JavaBeans(企业bean)是运行于服务器上的业务逻辑组件。 Java EE组件用Java语言编写而成,以与该语言编写的其他程序一样的方式进行编译。Java EE组件与其他标准Java类的区别在于,Java EE组件将装配至一个Java EE应用中并通过验证,以确保其满足Java EE规范的要求,从而可以部署至生产环境中。生产环境是一个Java EE服务器运行并管理Java EE组件的地方。 1.3.3 Java EE客户端 Java EE客户端通常是Web客户端或应用程序客户端。 1. Web客户端 Web客户端由两部分构成: 包含不同标记语言(HTML、XML等)的动态网页,它们是由运行于Web层的Web组件生成的; Web浏览器,展示来自服务器的页面内容。 Web客户端通常称为瘦客户端。瘦客户端通常无需查询数据库、执行复杂的业务逻辑或连接过时的应用。当使用瘦客户端时,重量级的操作通常转移至Java EE服务器上的企业 bean执行,从而充分利用Java EE服务器端技术在安全、速度、服务性和可靠性上的优势。 2. 应用程序客户端 应用程序客户端运行在客户机上。它为用户提供了一种处理丰富人机交互任务的方式,而这种能力是标记语言无法提供的。应用程序客户端通常有基于Swing或AWT(Abstract Window Toolkit,抽象窗口工具包)API实现的GUI(Graphic User Interface,图形用户界面)。当然,也可能是命令行界面。 应用程序客户端直接访问运行于业务层的企业bean。然而,如果确有需要,应用程序客户端可以打开一个HTTP连接,以连接到运行于Web层的servlet。使用非Java的其他语言编写的应用程序客户端可以与Java EE服务器交互,这使得Java EE平台具备与遗留系统、客户端以及非Java语言交互的能力。 3. applet Web层的网页中可以嵌入applet。用Java语言编写的applet是一种小型客户端程序,它能够运行于客户端浏览器上安装的Java虚拟机中。然而,客户端系统可能需要一个Java插件以及一个安全策略文件,才能使applet能够在Web浏览器中正常运行。 Web组件无需插件和安全策略文件,因而是创建Web客户端程序的首选API。同时,由于Web组件可将应用程序开发与网页设计相隔离,因此它使更加简洁和更加模块化的应用程序设计成为可能。因此,网页设计人员无需理解Java编程语言的语法即可完成其工作。 4. JavaBeans组件架构 服务器端与客户端也同样可包含基于JavaBeans架构的组件,以实现对下面这些元素间数据流的管理: 应用程序客户端或applet与运行于Java EE服务器上的组件; 服务器端组件与数据库。 在Java EE规范中,JavaBeans未被认作是一种Java EE组件。 JavaBeans组件有特定的属性参数,并通过get和set方法进行访问和设置。以这种方式使用的JavaBeans组件通常设计和实现起来比较简单,但应该满足JavaBeans组件架构中定义的命名和设计规范。 5. Java EE服务器通信 图1-2展示了构成客户端层的不同元素。客户端可以直接与运行在Java EE服务器上的业务组件通信,或在客户端运行于浏览器中的前提下,通过网页或运行于Web层的servlet进行通信。 图1-2 服务器通信 1.3.4 Web组件 Java EE Web组件或是servlet,或是由JavaServer Faces和(或)JSP技术创建的网页。servlet是Java语言里的类,能够动态地处理请求并生成响应。JSP页面是基于文本的文档,能够以servlet的方式执行,且能以一种更加自然的方式创建静态内容。JavaServer Faces技术构建于servlet和JSP技术之上,为Web应用程序提供用户界面组件框架。 在应用程序装配时,静态HTML页面及applet将与Web组件打包在一起,但它们不被Java EE规范认定为Web组件。服务器端的工具类也可以与Web组件打包在一起,如同HTML页面一样,也不被认作是Web组件。 如图1-3所示,Web层(如同客户端层)也可包含JavaBeans组件,以管理用户的输入,并将其转发至运行于业务层的企业bean进行处理。 图1-3 Web层与Java EE应用程序 1.3.5 业务组件 业务代码(即业务逻辑)通常解决特定行业(如银行、零售、金融)中的业务问题,是由运行于业务层或Web层的企业bean处理的。图1-4展示了企业bean如何接收来自客户端程序的数据,进而处理(如果需要的话),并将其发送至企业信息系统中进行存储的完整过程。企业bean也从数据存储中获取数据,进而处理(如果需要的话),并将其送回至客户端程序。 图1-4 业务和企业信息系统层 1.3.6 企业信息系统层 企业信息系统层处理企业信息软件(EIS软件),它包括企业基础设施系统,如ERP(Enterprise Resource Planning,企业资源计划)、主机事务处理、数据库系统,以及其他遗留的信息系统。例如,Java EE应用的组件可能需要访问企业信息系统以获取数据库连接。 1.4 Java EE容器 通常情况下,开发人员需要引入复杂的代码解决事务及状态管理问题,处理多线程和资源轮询等复杂的底层细节,因此瘦客户端多层应用程序不易编写。而在Java EE架构下,由于业务逻辑被封装至可重用的组件之中,基于组件和平台独立的架构特性使得上述问题得以缓解。除此之外,Java EE服务器为每一种组件都提供了基于容器的底层服务,因此开发人员无需自行开发这些服务,可以轻松地将注意力集中在解决业务问题上。 1.4.1 容器服务 容器是组件与底层平台功能间的接口。在Web组件、企业bean或应用程序客户端运行之前,必须将其装配至Java EE模块中,并部署至其容器中。 装配的过程涉及为Java EE应用中的每个组件所对应的容器以及应用自身所对应的容器进行设定。容器的设定将明确Java EE服务器的底层支持方式,如安全服务、事务管理、JNDI(Java Naming and Directory Interface,Java命名与目录接口)API查询和远程连接等。以下是其中比较重要的几项。 Java EE安全模型可用于配置Web组件或企业bean,从而使企业资源仅被授权用户访问。 Java EE事务模型可用于指定一个完整事务中的多个过程间的关系,从而使得一次事务中的所有过程能够被认作是同一个处理单元。 JNDI查询服务为企业中的不同命名和目录服务提供了统一的接口,从而使得应用程序组件可以轻松地访问这些服务。 Java EE远程连接模型管理客户端与企业bean之间的底层通信服务。当一个企业bean创建之后,客户端调用bean中的方法,就如同两者在同一个虚拟机中。 由于Java EE架构提供可配置的服务,同一Java EE应用程序中的应用组件可以基于它们被部署的位置有不同的行为表现。例如,企业bean可以通过其安全性设置允许以某种级别的权限访问一个生产环境中的数据库数据,而以另一个级别的权限访问另一个生产环境中的数据库数据。 容器还管理不可配置的服务,如企业bean和servlet生命周期、数据库连接资源池、数据持久性,以及对Java EE平台API的访问(参见1.9节)。 1.4.2 容器类型 如图1-5所示,在部署的过程中,Java EE应用程序组件将会安装到Java EE容器里。 Java EE服务器 Java EE产品的运行环境。Java EE服务器提供EJB和Web容器。 EJB(Enterprise JavaBeans)容器 为Java EE应用程序管理企业bean的运行。企业 bean及其容器运行在Java EE服务器上。 Web容器 为Java EE应用程序管理网页、servlet和一些EJB组件的运行。Web组件及其容器运行在Java EE服务器上。 应用程序客户端容器 管理应用程序客户端组件的运行。应用程序客户端及其容器运行于客户端。 applet容器 管理applet的运行,由运行于客户端的Web浏览器和Java插件组成。 图1-5 Java EE服务器和容器 1.5 Web 服务支持 Web 服务是基于Web的企业应用程序,它使用开放的、基于XML的标准和传输协议与其客户端进行数据交换。我们需要使用Java EE平台提供的XML API及工具,以实现快速设计、开发、测试和部署完全可与其他Web服务及客户端互操作的Web服务及其客户端,而无论后者是否运行在Java平台上。 利用Java EE XML API开发Web 服务和客户端,开发人员只需为调用的方法传递参数并处理返回的数据。对于面向文档的Web服务,仅需要发送和接收包含数据的文档。XML API代为完成了在标准的XML传输协议中,应用数据与XML数据流间的翻译工作,因此无需编写底层代码。基于XML的标准和协议将在随后的章节里介绍。 将数据翻译成标准的、基于XML的数据流,使得用Java EE XML API编写的Web服务和客户端间具有完全的互操作性。这种特性并不意味着传输的数据必须包括XML标签,也就是说,传输的数据可以是普通的文本、XML数据以及任何类型的二进制数据,如音频、视频、地图、程序文件、计算机辅助设计(CAD)文档等。下面的内容将介绍XML,并解释不同的实体间如何通过XML标签和模式(schema),实现包含特定含义的数据交换。 1.5.1 XML XML(Extensible Markup Language,可扩展标记语言)是一种跨平台、可扩展、基于文本的数据表示标准。交换XML数据的双方可以创建自己的标签(tag)以描述数据,设定模式来说明哪些标签可以用于特定类型的XML文档中,并使用XML样式表管理数据的显示和处理方式。 例如,Web服务可以使用XML和一个模式生成价格清单,而收到价格清单和模式的公司可以自己定制XML样式表,以最能满足自己需要的方式处理数据。下面是一些XML的应用场景。 一家公司可以将以XML方式记录的报价信息通过一个程序转化为HTML格式,从而将价格信息公布在内部网络中。 一家合作伙伴公司可以将XML格式的报价信息通过工具转化为一个市场宣传材料。 另一家公司可以将XML格式的报价信息读入一个程序进行处理。 1.5.2 SOAP传输协议 客户端请求和Web 服务响应作为SOAP(Simple Object Access Protocol,简单对象访问协议)的消息,通过HTTP协议进行传输。SOAP协议使得客户端与Web服务间的信息传递过程具备完全的互操作性,而无论消息传递的双方运行于什么样的平台上或位于因特网的哪个地方。HTTP协议是我们熟知的标准,它通过因特网以请求响应模式传送数据。SOAP协议基于XML,参照HTTP的请求响应模型。 传输消息中的SOAP部分包括如下内容: 定义一个基于XML的信封,描述消息的内容并解释如何处理消息; 包括一系列基于XML的编码规则,描述消息内部应用程序定义的数据类型实例; 定义一个基于XML的规范,描述远程服务请求及结果响应的表示方式。 1.5.3 WSDL标准格式 WSDL(Web Services Description Language,Web服务描述语言)是用XML描述网络服务的标准格式。这种描述包括服务的名称、服务的位置以及与服务通信的方式。WSDL服务描述可以发布至网络中。GlassFish服务器提供了一个工具,可以生成Web服务的WSDL描述,并以远程过程调用的方式与客户端通信。 1.6 Java EE应用程序装配与部署 我们可以将Java EE应用程序打包至一个或多个标准的单元中,以便部署至任何与Java EE平台兼容的系统中。每个单元包括: 一个或多个功能组件,如企业bean、网页、servlet或applet; 一个可选的、描述单元内容的部署描述文件。 一旦创建好Java EE单元,便可用于部署。部署时,通常使用平台提供的工具指定与位置有关的特定信息,如可以访问应用程序的本地用户列表及本地数据库名称。一经在本地平台部署,应用程序即可运行。 1.7 打包应用程序 一个Java EE应用程序可以以JAR(Java Archive)文件、WAR(Web Archive)文件或EAR(Enterprise Archive)文件3种形式交付。WAR和EAR文件是以.war或.ear为扩展名的标准JAR文件(.jar)。JAR、WAR和EAR文件及模块的使用,使得多个Java EE应用程序可共享一些组件。无需额外编码,而仅将各种不同的Java EE模块装配(打包)进JAR、WAR或EAR文件即可。 一个EAR文件(参见图1-6)包括Java EE模块以及一个可选的部署描述文件。部署描述文件是一个以.xml为扩展名的XML文档,用以描述应用程序、模块或组件的部署方式。由于部署描述文件是以声明的方式使用,因此无需修改源代码就可更改它的内容。在运行状态下,Java EE服务器读取部署描述文件,并按照其设定的方式执行应用程序、模块或组件。 图1-6 EAR文件结构 部署描述文件有两种类型,分别是Java EE通用部署描述文件和服务器专用部署描述文件。Java EE通用部署描述文件在Java EE规范中定义,可用于在任何Java EE兼容的服务器实现上进行部署设置。服务器专用部署描述文件用于某个特定的Java EE服务器的参数配置。例如,GlassFish服务器专用部署描述文件包括Web应用程序的上下文环境以及GlassFish服务器的特定参数,如缓存指令。GlassFish服务器专用部署描述文件的文件名为sun-moduleType.xml,与Java EE部署描述文件一同位于META-INF目录中。 Java EE模块由一个或多个使用同种容器的Java EE组件,及一个可选的该类组件的部署描述文件构成。例如,企业bean组件模块部署描述文件声明了事务属性及安全认证机制。Java EE模块可以以单机方式部署。 Java EE模块包括如下类型。 EJB模块,包含企业bean的类文件及一个部署描述文件。EJB模块打包至以.jar为扩展名的JAR文件中。 Web模块,包含servlet类文件、Web文件、工具类文件、GIF文件、HTML文件以及一个Web应用程序部署描述文件。Web模块打包至以.war(web archive)为扩展名的JAR文件中。 应用程序客户端模块,包含类文件和应用程序客户端部署描述文件。应用程序客户端模块打包至以.jar为扩展名的JAR文件中。 资源适配模块,包含所有Java接口、类、本地库包,以及其他文档和资源适配部署描述文件。它们在一起,实现了特定企业信息系统的连接器架构(参见1.9.14节)。资源适配模块打包至以.rar(resource adapter archive)为扩展名的JAR文件中。 1.8 开发中的角色分工 模块可重用的特性实现了应用程序开发和部署过程两个阶段的角色划分,使得不同的人或公司能够在这个过程中发挥不同的作用。 前两个角色,即Java EE产品提供商和工具提供商,涉及购买和安装Java EE产品和工具。当软件购买并安装之后,Java EE组件可以由应用程序组件的开发人员、装配人员和部署人员,分别实现应用的开发、配置和部署。在大型的组织内部,每一种角色可能是由不同的个人或团队承担。这种工作划分的原则源于这样一个理念,即前期角色的输出物作为后续角色的输入。例如,在应用组件开发阶段,一名企业bean的软件开发人员将交付EJB JAR文件。作为应用程序装配角色,另一名软件开发人员可以将这些EJB的JAR文件合并至一个Java EE应用程序中,并保存为EAR文件。作为应用程序部署的角色,在客户现场的系统管理员使用EAR文件,将应用程序安装到Java EE服务器中。 不同角色的工作可能由同一个人来承担。例如,如果你为一家小型的公司工作,或者要为示例程序做原型开发,可能需要承担每个阶段的工作。 1.8.1 Java EE产品提供商 Java EE产品提供商设计和实现Java EE平台API及Java EE规范中定义的其他特性。产品提供商通常是根据Java EE 6平台规范,设计并实现应用服务器的开发厂商。 1.8.2 工具提供商 工具提供商是一些组织或个人,为组件提供商、编译人员和部署人员开发面向开发、编译和打包的工具。 1.8.3 应用组件提供商 应用组件提供商是一些组织或个人,为Java EE应用程序开发Web组件、企业bean、applet或应用程序客户端。 1. 企业Bean开发者 企业bean开发者完成如下任务,以交付一个包含一个或多个企业bean的EJB JAR文件: 编写和编译源代码; 指定部署描述文件(可选); 打包.class文件和部署描述文件至EJB JAR文件中。 2. Web组件开发者 Web组件开发者完成如下任务,以交付一个包含一个或多个Web组件的WAR文件: 编写和编译servlet源代码; 编写JavaServer Faces、JSP和HTML文件; 指定部署描述文件(可选); 打包.class文件、.jsp文件、.html文件及部署描述文件至WAR文件中。 3. 应用程序客户端开发者 应用程序客户端开发者完成如下任务,以交付一个包含应用程序客户端的JAR文件: 编写和编译源代码; 指定客户端的部署描述文件(可选); 打包.class文件及部署描述文件文件至JAR文件中。 1.8.4 应用程序装配者 应用程序装配者是一个组织或个人,接收来自组件提供商的应用程序模块,并且会将其装配至Java EE应用程序的EAR文件中。装配人员和部署人员可以直接编辑部署描述文件,或者利用工具以交互的方式正确地增加XML标签。 应用程序装配者完成如下工作,以交付一个包含Java EE应用程序的EAR文件: 装配前一阶段提交的EJB JAR文件和WAR文件至Java EE应用程序文件(EAR)中; 为Java EE应用程序指定部署描述文件(可选); 验证EAR文件的内容是否正确地装配并满足Java EE规范。 1.8.5 应用程序部署者和管理员 应用程序部署者和管理员是一个组织或个人,配置和部署Java EE应用程序,管理Java EE应用程序运行的环境和网络资源并监督运行环境。职责包括设置事务控制和安全属性,以及指定到数据库的连接。 在配置的过程中,部署人员参照应用程序组件提供商提供的指导,解决外部依赖,指定安全设置及事务属性。在安装的过程中,部署人员将应用程序组件复制到服务器上,并生成特定容器的类和接口。 部署人员或系统管理员完成如下工作,以安装和配置Java EE应用程序: 为其所在的运行环境配置Java EE应用程序; 验证EAR文件的内容是否装配正确并满足Java EE规范; 部署(安装)Java EE应用程序的EAR文件至Java EE服务器。