【写在前面的一点废话】 企业如今生活在一个全球化竞争的世界,他们需要应用系统来满足他们的业务需求,这些需求越来越复杂。 在这个全球化时代,公司分布不同区域,他们通过互联网实现24*7的全天侯模式下跟不同国家进行业务往来。基于多个数据中心以及必须处理不同货币和时区的国际化系统,这样以便降低成本和降低服务的响应时间,并将业务数据存储在可靠和安全的存储上,同时为其客户、员工和供应商提供移动和Web方式的多种交互形式。 大多数公司必须将这些复杂的挑战与其现有的企业信息系统(EIS)相结合,同时开发企业对企业(Business to Business)应用程序,以便基于移动和地理定位模式的应用程序与合作伙伴或企业对客户系统进行通信沟通。 这样,公司不得不协调存储在不同位置的内部数据,由多种编程语言处理,并通过不同的协议进行路由。 当然,在无损失的情况下,企业必须这样做,这意味着分布系统具有防止系统崩溃、高可用性、可扩展性和安全性等特性,同时,企业应用必须面对变化和复杂性,并且应该系统必须是健壮的。 这正是Java企业版(Java EE)创建的原因所在。 于1999年发布的Java EE的第一个版本(最初称为J2EE)侧重于企业面临的问题:分布式组件。 从那时起,软件应用程序不得不适应新的技术解决方案,如SOAP或RESTful Web服务。Java EE平台已经发展到通过提供各种标准规范的方法来满足这些技术需求。 多年来,Java EE已经发生变化,变得更加丰富、更简单、更易于使用、更便携和更加集成化。 那么,在本学习教程中,我将给出一个Java EE的总体概述,介绍其内部架构,组件和服务后等,并介绍Java EE 7中的新功能特性。 1Java EE 简史图1-0总结了14年的Java EE演进。 Java EE以前称为J2EE。 J2EE 1.2是由Sun开发的,并于1999年发布,包含10个JSR的总括规范。 当时人们总在在谈论CORBA,所以J2EE 1.2是在分布式系统的基础上创建的。引入了企业Java Bean(EJB),支持远程状态和无状态服务对象,并支持持久对象(实体bean)。 它们基于使用RMI-IIOP(远程方法调用 - Internet Inter-ORB协议)作为底层协议的事务和分布式组件模型构建。Web层有servlet和JavaServer Pages(JSP)技术,JMS用于发送消息之用。 图1-0 Java EE简史 由J2EE 1.3开始,该规范是由Java社区进程(JCP)根据JSR 58开发的。实体bean的支持是强制性的,EJB引入了XML部署描述符来存储元数据(在EJB 1.0中的一个文件中被序列化)。 该版本解决了使用远程接口通过值传递参数的开销,即通过引用本地接口并通过引用传递参数。 引入了J2EE连接器架构(JCA)来实现Java EE连接到EIS(企业信息系统)。 2003年发布的J2EE 1.4(JSR 151)在包含20个规范,并增加了对Web服务的支持。 EJB 2.1允许通过SOAP / HTTP调用会话bean。 创建定时服务以允许在指定的时间或间隔调用EJB。该版本为应用程序的装配和部署提供了更好的支持。 虽然它的支持者预测了它的伟大未来,但并不是所有的J2EE的承诺都实现了。使用它创建的系统太复杂,开发时间常常与用户需求的复杂性成正比。 J2EE被视为重量级组件模型:难以测试,难以部署,难以运行。 就在那时, Struts,Spring或Hibernate等框架出现并导引出开发企业应用程序的新方法。 幸运的是,2006年第二季度发布了Java EE 5(JSR 244),带来了显着的进步。 通过从开源框架中获得了一些灵感,引入POJO编程模型。可以使用注释定义元数据,并且XML描述符成为可选的。 从开发人员的角度来看,EJB 3和新的JPA比平台的演变更具有飞跃性。JavaServer Faces(JSF)作为标准的表示层框架被引入,JAX-WS 2.0将JAX-RPC替换为 SOAP Web服务API。 在2009年,Java EE 6(JSR 316)遵循开发的方便之路,在整个平台(包括Web层)中拥抱含注解、POJO编程和例外配置机制的概念。 它拥有丰富的创新,如全新的JAX-RS 1.1,Bean Validation 1.0和CDI 1.0; 它简化了成熟的API,如EJB 3.1,并丰富了其他的,如JPA 2.0或EJB定时器服务。 但是Java EE 6的主要主题是可移植性(例如通过标准化全局JNDI命名),某些规范(通过修剪)的弃用,以及通过配置文件创建平台的子集。 今天,Java EE 7带来了许多新的规范(批量处理,websockets,JSON处理)以及改进其他规范。 Java EE 7还通过在大多数规范中采用CDI来提高技术之间的集成。 有机会,将在教程中,我想向您展示这些改进,以及Java Enterprise Edition已经变得更加容易和丰富开发模式。 2 全局理解Java EE 7当想处理对的集合时,无需从开发自己的哈希表开始——集合API(应用程序编程接口)就完全满足需要了。 同样,如果您需要一个简单的Web应用程序或支持事务、安全、可互操作和分布式的应用程序,则不需要开发所有低级API:企业版Java就满足需要。 正如Java标准版(Java SE)提供的处理集合的API一样,Java EE提供了一种标准的事务API方法来处理Java 事务,使用Java消息服务(JMS)进行消息传递,或者使用持久化 API(JPA)进行数据持久化。Java EE是针对企业应用程序的一组规范,它可以被看作是Java SE的扩展,以便于开发分布式、健壮的、强大的和高可用性的应用程序。 Java EE 7是一个重要的里程碑。不仅仅是遵循Java EE 6关注一个更简单的开发模式,而且还增加了新的规范,并为现有特性增加了新的功能。另外,上下文依赖注入(CDI)正在成为所有这些新规范之间的集成点。 Java EE 7的发布与企业平台发布十三周年紧密相连,将Java语言的优势与过去13年所获得的经验结合起来.Java EE从开源社区的活力中获益,同时也得益于严格的 JCP(Java Community Process)标准化进程。 今天,Java EE早已成为经过验证的优秀平台,其拥有经验丰富的开发人员、大型社区以及部署在公司服务器上运行着的诸多应用系统。Java EE是一套规范的APIs,可用于构建基于标准组件的多层应用程序,这些组件部署在提供一系列服务的不同容器中。 接下来,我们从不同层面理解掌握Java EE 7的不同总体构成。 2.1Java EE总体架构 Java EE是由不同容器实现的一组规范。容器是为其所托管的组件提供某些服务的Java EE运行时环境,例如生命周期管理,依赖注入,并发等。这些组件使用定义良好的规约与Java EE基础架构以及其他组件进行通信。在部署之前,需要以标准方式打包(按照定义的目录结构,可压缩到归档文件中)。注意,Java EE是Java SE平台的超集,这意味着Java SE API可以由任何Java EE组件使用。 图1-1显示了容器之间的逻辑关系。箭头表示一个容器访问另一个容器所使用的协议。 例如,Web容器托管可以通过RMI-IIOP访问EJB的servlet。 图1-1 标准Java EE容器架构关系 2.2Java EE构件组成 Java EE运行时环境规范定义了Java EE“实现”(可以看作为中间件)必须支持的四种类型的构件:
2.3Java EE容器 Java EE基础架构被划分为称为容器的逻辑域(见图1-1)。每个容器都有一个特定的角色,支持一组API,并为组件提供服务(如安全性,数据库访问,事务处理,命名目录,资源注入等)。容器隐藏技术复杂性并增强可移植性。根据要构建的应用程序的类型,将须了解每个容器的功能和约束,以便使用一个或多个。例如,如果您需要开发一个Web应用,将开发具有EJB Lite层的JSF层,并将其部署到Web容器中。但是,如果您希望Web应用程序能远程调用业务层并使用消息传递和异步调用,那么您将需要Web和EJB容器。 Java EE标准定义了四种不同的容器:
2.4Java EE服务 容器为其部署的组件提供基础服务。 作为开发人员,容器允许您集中精力实施业务逻辑,而不是解决企业应用程序中面临的技术问题。图1-2显示了每个容器提供的服务。 例如,Web和EJB容器提供连接器来访问EIS,但不提供applet容器或ACC。Java EE提供以下服务:
图1-2 容器提供服务支持及关系图 2.5Java EE网络协议 如图1-2所示,部署在容器中的组件可以通过不同的协议进行调用。 例如,部署在Web容器中的servlet可以使用HTTP以及在EJB容器中部署EJB端点的Web服务来调用。 以下是Java EE支持的协议列表:
2.6Java EE 打包 要部署在容器中,组件首先要封装在标准的格式化存档中。 Java SE定义了Java Archive(jar)文件,用于将多个文件(Java类,部署描述符,资源或外部库)聚合到一个压缩文件(基于ZIP格式)中。 如图1-3所示,Java EE定义了基于通用jar格式的具有自己的打包格式的不同类型的模块。 图1-3 容器中打包归档格式 针对上述归档模式,说明如下: 其一,应用程序客户端模块包含打包在jar文件中的Java类和其他资源文件。 该jar文件可以在Java SE环境或应用程序客户端容器中执行。 像任何其他存档格式一样,jar文件包含一个可选的META-INF目录,用于描述归档的元信息。 META-INF / MANIFEST.MF文件用于定义扩展和包相关数据。 如果部署在ACC中,则部署描述符可以可选地位于META-INF / application-client.xml。 其二,EJB模块包含打包在jar文件(通常称为EJB jar文件)中的一个或多个会话和/或消息驱动的bean(MDB)。 它包含一个可选的META-INF / ejb-jar.xml部署描述符,并且只能部署在EJB容器中。 其三,Web应用程序模块包含servlet,JSP,JSF页面和Web服务,以及任何其他Web相关文件(HTML和XHTML页面,级联样式表(CSS),Java脚本,图像,视频等)。 从Java EE 6以来,Web应用程序模块还可以包含EJB Lite bean(EJB API的一个子集)。所有这些工件都封装在带有.war扩展名(通常称为war文件或Web Archive)的jar文件中。可选Web部署描述符在WEB-INF / web.xml文件中定义。 如果war包含EJB Lite bean,则可以在WEB-INF / ejb-jar.xml中设置可选的部署描述符。 Java.class文件放置在WEB-INF / classes目录和依赖的jar文件的WEB-INF / lib目录下。 其四,企业模块可以包含零个或多个Web应用程序模块,零个或多个EJB模块以及其他常用或外部库。所有这些都被打包成企业归档(具有.ear扩展名的jar文件),以便各种部署模块协同进行并发。 可选的企业模块部署描述符在META-INF / application.xml文件中定义。特殊的lib目录用于在模块之间共享公共库。 2.7注解和部署描述符 在编程范例中,有两种方法:命令式编程和声明式编程。语法编程规定了实现目标的算法(必须做的事情),而声明式编程规定了如何实现这一目标(如何完成)。 在Java EE中,通过使用元数据(即注释或/和部署描述符)完成声明式编程。 如图1-2所示,组件在容器中运行,此容器为组件提供了一组服务.Metadata用于声明和自定义这些服务,并将附加信息与Java类、接口、构造函数、方法、字段或参数相关联 。 自从Java EE 5以来,注释在企业平台上一直在增长。它们使用元数据信息来修饰代码(Java类,接口,字段,方法...)。 清单1-1显示了一个POJO(普通Java对象),它使用类和属性上的注释来声明某些行为。 @Stateless @Remote(ItemRemote.class) @Local(ItemLocal.class) @LocalBean public class ItemEJB implements ItemLocal, ItemRemote { @PersistenceContext(unitName = 'chapter01PU') private EntityManager em; public Book findBookById(Long id) { return em.find(Book.class, id); } } 代码清单1-1:注解式EJB 声明元数据的另一种方式是使用部署描述符。部署描述符(DD)是指与容器中组件一起部署的XML配置文件.Listing 1-2显示了一个EJB部署描述符。 像大多数Java EE 7部署描述符一样,它定义了http://xmlns./xml/ns/javaee命名空间,并包含版本属性 规范。 xmlns:xsi='http://www./2001/XMLSchema-instance' ? xsi:schemaLocation='http://xmlns./xml/ns/javaee ? http://xmlns./xml/ns/javaee/ejb-jar_3_2.xsd' ? version='3.2'> 代码清单1-2:EJB部署描述符 部署描述符需要与特殊的META-INF或WEB-INF目录中的组件打包在一起,以备参考。 表1-1显示了Java EE部署描述符和相关规范的列表 表1-1:JavaEE部署描述列表
由于Java EE 5大多数部署描述符是可选的,应用可以使用注释。或使用两者中对应用程序最好的方式即可。 注释的最大优点是它们显着减少了开发人员编写的代码量,并且通过使用注释可以避免编写部署描述符的需要。 另一方面,部署描述符是可以更改的外部XML文件,而不需要修改源代码和重新编译。 如果您同时使用这两者,当部署应用程序或组件时则元数据将被部署描述符覆盖(即XML优先于注释)。 2.8编程模型 大多数Java EE 7规范使用相同的编程模型。 它通常是一个POJO,它将一些元数据(注释或XML)部署到容器中。 大多数时候,POJO甚至没有实现一个接口或者扩展一个超类。 由于元数据,容器知道应用于此已部署组件的每一个服务。 在Java EE 7中,servlet,JSF支持bean,EJB,实体,SOAP和REST Web服务是带可选XML部署描述符的注释类。 清单1-3显示了一个JSF支持bean,证明是具有单个CDI注释的Java类。 清单1-3:JSF后端Bean @Named public class BookController { @Inject private BookEJB bookEJB; private Book book = new Book(); private List public String doCreateBook() { book = bookEJB.createBook(book); bookList = bookEJB.findBooks(); return 'listBooks.xhtml'; } // Getters, setters } EJB也遵循相同的模式。 如清单1-4所示,如果您需要在本地访问EJB,则没有接口的简单注释类就足够了。 EJB也可以直接部署在war文件中,而不会先前封装在jar文件中。 这使EJB成为可以从简单的Web应用程序到复杂的企业应用程序使用的最简单的事务组件。 代码清单1-4:无状态EJB @Stateless public class BookEJB { @Inject private EntityManager em; public Book findBookById(Long id) { return em.find(Book.class, id); } public Book createBook(Book book) { em.persist(book); return book; } } RESTful Web服务已经进入现代应用程序。 Java EE 7通过改进JAX-RS规范来满足企业的需求。 如清单1-5所示,一个RESTful Web服务是一个响应HTTP操作的带有注释的Java类。 代码清单1-5:RESTFUL web服务 @Path('books') public class BookResource { @Inject private EntityManager em; @GET @Produces({'application/xml', 'application/json'}) public List Query query = em.createNamedQuery('findAllBooks'); List return books; } |
|