1.2 Java EE概念
Java EE是一套面向企业应用的体系结构,可以将Java EE理解为Java SE(Java 2平台的标准版)的扩展和延伸,Java EE的基础就是Java SE, Java EE不仅拥有Java SE中的许多优点,同时还提供了对EJB(Enterprise Java Bean——企业级Java Bean), Servlet, JSP(Java Server Pages)和XML等技术的支持。Java EE的核心API与组件有JDBC、JNDI、EJB、RMI、Java IDL/CORBA、JSP、Servlet、XML、JMS、JTS、JTA、JavaMail和JAF,并且将在后面为读者详细介绍Java EE核心技术,让读者能对Java EE技术有清晰的了解。
Java EE是一套全然不同于传统应用开发的技术架构,其包含许多组件,主要可简化且规范应用系统的开发与部署,进而提高可移植性、安全与再用价值。Java EE核心是一组技术规范与指南,其中所包含的各类组件、服务架构及技术层次,均有共同的标准及规格,让各种依循Java EE架构的不同平台之间,存在良好的兼容性,解决过去企业后端使用的信息产品彼此之间无法兼容,导致企业内部或外部难以互通的窘境。
在Java EE架构下,开发人员可依循规范基础,进而开发企业级应用;而不同Java EE供货商,都会支持不同Java EE版本内所拟定的标准,以确保不同Java EE平台与产品之间的兼容性。换言之,基于Java EE架构的应用系统,基本上可部署在不同的应用服务器之上,无需或者只需进行少量的代码修改,即能大幅提高应用系统的可移植性(Portability)。
1.2.1 Java EE多层模型
Java EE使用多层的分布式应用模型,应用逻辑按功能划分为组件,各个应用组件根据它们所在的层分布在不同的机器上。
事实上,SUN设计Java EE的初衷正是为了解决两层模式(Client/Server)的弊端,在传统模式中,客户端担当了过多的角色而显得臃肿,在这种模式中,第一次部署的时候比较容易,但升级或改进比较困难,可伸展性也不理想,而且经常基于某种专有的协议——通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在Java EE的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层,Java EE典型的四层结构分别为客户层、Web层、业务逻辑层和企业信息系统层。现在开发中用的最多的是MVC(Model-View-Controller,模式-视图-控制器)开发模式,这种模式把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层和控制层。图1-1是MVC模型的简单图形。
图1-1 MVC模型
1.2.2 Java EE体系结构
Java EE被设计为一种基于组件,平台无关的结构,这种结构使得Java EE程序的编写十分简单,因为业务逻辑被封装成可复用的组件,并且Java EE服务器以容器的形式为所有的组件类型提供后台服务(无需开发者自己开发或实现这种服务),使得开发者可以集中精力解决复杂的业务问题。
下面分别从容器服务与容器类型这两方面来介绍Java EE的结构。
1.容器服务
容器就是一组提供服务的管理器。当然,不同的容器要符合不同服务的要求和规范。比如HTTP容器(HTTP Container)就提供了解析HTTP的能力,使得HTTP代码可以通过HTTP协议来发布到Internet上。
Java EE容器定制了包括安全、事务管理、JNDI(Java Naming and Directory Interface, Java命名和目录接口)寻址、远程连接服务、生存周期管理、数据库连接池管理等多种支持。下面对各项加以简单解释。
(1)Java EE安全(Security)模型可以让用户配置Web组件或Enterprise Bean,这样只有被授权的用户才能访问系统资源。每一客户属于一个特别的角色,而每个角色只允许激活特定的方法。用户应在Enterprise Bean的部署描述中声明角色和可被激活的方法。由于这种声明性的方法,用户不必编写加强安全性的规则。
(2)Java EE事务管理(Transaction Management)模型让用户指定组成一个事务中所有方法间的关系,这样一个事务中的所有方法被当成一个单一的单元。当客户端激活一个Enterprise Bean中的方法,容器介入管理事务。因有容器管理事务,在Enterprise Bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。用户只需在部署描述文件中声明Enterprise Bean的事务属性,而不用编写并调试复杂的代码。容器将读取此文件并为你处理此Enterprise Bean的事务。
注释
简单事务的概念:例如有一个订单库存管理系统,每一次生成订单的同时都要消减库存。通常来说订单和库存在数据库中是分两张表来保存的:订单表,库存表。每一次追加一个订单实际上需要两步操作:在订单表中插入一条数据,同时修改库存的数据。这样问题就来了,例如需要一个单位为10的订单,库存中有30件,理想的操作是在订单表中插入了一条单位为10的订单,之后将库存表中的数据修改为20。但是有时事情并不总是按照想法发生,例如:在修改库存的时候,数据库突然由于莫名其妙的原因无法连接上了。也就是说库存更新失败了。但是订单已经产生了,那么怎么办呢?没办法,只有手动的修改。所以最好的方式是将订单插入的操作和库存修改的操作绑定在一起,必须同时成功或者什么不做。
(3)JNDI寻址(JNDI Lookup, Java命名和目录接口寻址)服务向企业内的多重名字和目录服务提供了一个统一的接口,这样应用程序组件可以访问名字和目录服务。在后续Java EE技术详解中,将会对JNDI进行详细地描述。
(4)生存周期管理(Life Cycle Management)模型管理Enterprise Bean的创建和移除,一个Enterprise Bean在其生存周期中将会历经几种状态。容器创建Enterprise Bean,并在可用实例池与活动状态中移动它,而最终将其从容器中移除。即使可以调用Enterprise Bean的create及remove方法,容器也将会在后台执行这些任务。
(5)Java EE远程连接(Remote Client Connectivity)模型管理客户端和企业级Bean间的底层交互。在创建一个企业级Bean之后,客户端就可以像调用客户机本地的方法一样调用它的方法。
(6)数据库连接池(Database Connection Pooling)模型通过容器管理连接池可以提高服务器的效率,Bean可以从连接池中快速获得连接,并在Bean释放连接之后,连接还可以为其他Bean所使用。
2.容器类型
(1)EJB容器:运行在Java EE服务器上。它管理Java EE应用程序中所有的Enterprise Bean(企业级Bean)的执行。
(2)Web容器:运行在Java EE服务器上。它管理Java EE应用程序中所有JSP和Servlet组件的执行。
(3)应用程序客户端容器:运行在客户端。它管理Java EE应用程序中所有应用程序客户端组件的执行。
(4)Applet容器:运行在客户端。通常是客户机上的Web浏览器和Java插件的结合。