??xml version="1.0" encoding="utf-8" standalone="yes"?> 一. J2EE的概?br />目前QJava 2q_?个版本,它们是适用于小型设备和卡的Java 2q_Micro版(Java 2 Platform Micro EditionQJ2MEQ、适用于桌面系l的Java 2q_标准版(Java 2 Platform Standard EditionQJ2SEQ、适用于创建服务器应用E序和服务的Java2q_企业版(Java 2 Platform Enterprise EditionQJ2EEQ?br />J2EE是一U利用Java 2q_来简化企业解x案的开发、部|和理相关的复杂问题的体系l构。J2EE技术的基础是核心Javaq_或Java 2q_的标准版QJ2EE不仅巩固了标准版中的许多优点Q例?~写一ơ、随处运?的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式{等Q同时还提供了对 EJBQEnterprise JavaBeansQ、Java Servlets API、JSPQJava Server PagesQ以及XML技术的全面支持。其最l目的就是成Z个能够企业开发者大q羃短投攑ָ场时间的体系l构?br />J2EE体系l构提供中间层集成框架用来满x需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供l一的开发^収ͼJ2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持Q完全支持Enterprise JavaBeansQ有良好的向导支持打包和部v应用Q添加目录支持,增强了安全机Ӟ提高了性能?/p>
? J2EE的优?br />J2EE为搭建具有可伸羃性、灵zL、易l护性的商务pȝ提供了良好的机制:
数据库连接池QDatabase Connection PoolingQ模型是一个有价值的资源。获取数据库q接是一耗时的工作,而且q接数非常有限。容器通过理q接池来~和q些问题?br />enterprise bean可从池中q速获取连接。在bean释放q接之可为其他bean使用?br />容器cd EJB(Enterprise JavaBean):
]]>
本文从五个方面对J2EEq行了比较全面的介绍。从J2EE的概念说P到它的优势,到J2EE典型的四层模型,和它的框架结构,最后是J2EE十三U核心技术的一个简介。本文分门别cȝ对J2EE中的服务Q组Ӟ层次Q容器,API都做了比较详l的介绍Q相信看完此文,读者会对J2EE有一个更清晰的认识?/p>
保留现存的IT资: ׃企业必须适应新的商业需求,利用已有的企业信息系l方面的投资Q而不是重新制定全盘方案就变得很重要。这P一个以渐进的(而不是激q的Q全盘否定的Q方式徏立在已有pȝ之上的服务器端^台机制是公司所需求的。J2EE架构可以充分利用用户原有的投资,如一些公怋用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。这之所以成为可能是因ؓJ2EE拥有q泛的业界支持和一些重要的'企业计算'领域供应商的参与。每一个供应商都对现有的客h供了不用废弃已有投资Q进入可UL的J2EE领域的升U途径。由于基于J2EEq_的品几乎能够在M操作pȝ和硬仉|上q行Q现有的操作pȝ和硬件也能被保留使用?br />高效的开?
J2EE允许公司把一些通用的、很J琐的服务端d交给中间件供应商d成。这样开发h员可以集中精力在如何创徏商业逻辑上,相应地羃短了开发时间?br />高中间件供应商提供以下q些复杂的中间g服务:
状态管理服?-- 让开发h员写更少的代码,不用兛_如何理状态,q样能够更快地完成程序开发?br />持箋性服?-- 让开发h员不用对数据讉K逻辑q行~码p~写应用E序Q能生成?br />dyQ与数据库无关的应用E序Q这U应用程序更易于开发与l护?br />分布式共享数据对象CACHE服务 -- 让开发h员编刉性能的系l,极大提高整体部v的~性?br />支持异构环境: J2EE能够开发部|在异构环境中的可移植程序。基于J2EE的应用程序不依赖M特定操作pȝ、中间g、硬件。因此设计合理的ZJ2EE的程序只需开发一ơ就可部|到各种q_。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客戯购与J2EE兼容的第三方的现成的lgQ把他们部v到异构环境中Q节省了p己制订整个方案所需的费用?br />可~? 企业必须要选择一U服务器端^収ͼq种q_应能提供极佳的可伸羃性去满那些在他们系l上q行商业q作的大Ҏ客户。基于J2EEq_的应用程序可被部|到各种操作pȝ上。例如可被部|到高端UNIX与大型机pȝQ这U系l单机可支持64?56个处理器。(q是NT服务器所望尘莫及的)J2EE领域的供应商提供了更为广泛的负蝲q{略。能消除pȝ中的瓉Q允许多台服务器集成部v。这U部|可达数千个处理器,实现可高度~的pȝQ满x来商业应用的需要?br />E_的可用? 一个服务器端^台必能全天候运转以满公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的Q即使在夜间按计划停Z可能造成严重损失。若是意外停机,那会有灾难性后果。J2EE部v到可靠的操作环境中,他们支持长期的可用性。一些J2EE部v在WINDOWS环境中,客户也可选择健壮性能更好的操作系l如Sun Solaris、IBM OS/390。最健壮的操作系l可辑ֈ99.999%的可用性或每年只需5分钟停机旉。这是实时性很强商业系l理想的选择?/p>
? J2EE 的四层模?br />J2EE使用多层的分布式应用模型Q应用逻辑按功能划分ؓlgQ各个应用组件根据他们所在的层分布在不同的机器上。事实上Qsun设计J2EE的初h是ؓ了解决两层模?client/server)的弊端,在传l模式中Q客L担当了过多的角色而显得臃肿,在这U模式中Q第一ơ部|的时候比较容易,但难于升U或改进Q可伸展性也不理惻I而且l常Z某种专有的协议――通常是某U数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业应用模型两层化模型中的不同层面切分成许多层。一个多层化应用能够Z同的每种服务提供一个独立的层,以下?J2EE 典型的四层结?
q行在客L机器上的客户层组?br />q行在J2EE服务器上的Web层组?br />q行在J2EE服务器上的业务逻辑层组?br />q行在EIS服务器上的企业信息系l?Enterprise information system)层Y?br />J2EE应用E序lg
J2EE应用E序是由lg构成?J2EElg是具有独立功能的软g单元Q它们通过相关的类和文件组装成J2EE应用E序Qƈ与其他组件交互。J2EE说明书中定义了以下的J2EElg:
应用客户端程序和applets是客户层lg.
Java Servlet和JavaServer Pages(JSP)是web层组?
Enterprise JavaBeans(EJB)是业务层lg.
客户层组?br />J2EE应用E序可以是基于web方式?也可以是Z传统方式?br />web 层组件J2EE web层组件可以是JSP 面或Servlets.按照J2EE规范Q静态的HTML面和Applets不算是web层组件?br />正如下图所C的客户层那Pweb层可能包含某?JavaBean 对象来处理用戯入,q把输入发送给q行在业务层上的enterprise bean 来进行处理?br />业务层组?br />业务层代码的逻辑用来满银行Q零售,金融{特D商务领域的需?p行在业务层上的enterprise bean q行处理. 下图表明了一个enterprise bean 是如何从客户端程序接收数据,q行处理(如果必要的话), q发送到EIS 层储存的Q这个过E也可以逆向q行?br />有三U企业的bean: 会话(session) beans, 实体(entity) beans, ?消息驱动(message-driven) beans. 会话bean 表示与客LE序的时交? 当客LE序执行完后, 会话bean 和相x据就会消? 相反, 实体bean 表示数据库的表中一行永久的记录.
当客LE序中止或服务器关闭? ׃有潜在的服务保证实体bean 的数据得以保?
消息驱动 bean l合了会话bean ?JMS的消息监听器的特? 允许一个业务层lg异步接收JMS 消息.
企业信息pȝ?br />企业信息pȝ层处理企业信息系lY件包括企业基pȝ例如企业资源计划 (ERP), 大型Z务处? 数据库系l?和其它的遗留信息pȝ. 例如QJ2EE 应用lg可能Z数据库连接需要访问企业信息系l?br />? J2EE 的结?br />q种ZlgQ具有^台无x的J2EE l构使得J2EE E序的编写十分简单,因ؓ业务逻辑被封装成可复用的lgQƈ且J2EE 服务器以容器的Ş式ؓ所有的lgcd提供后台服务. 因ؓ你不用自己开发这U服? 所以你可以集中_֊解决手头的业务问?
容器和服?br />容器讄定制了J2EE服务器所提供得内在支持,包括安全Q事务管理,JNDI(Java Naming and Directory Interface)d,q程q接{服务,以下列出最重要的几U服务:
J2EE安全(Security)模型可以让你配置 web lg或enterprise bean ,q样只有被授权的用户才能讉Kpȝ资源. 每一客户属于一个特别的角色Q而每个角色只允许Ȁzȝ定的Ҏ。你应在enterprise bean的布|描qC声明角色和可被激zȝҎ。由于这U声明性的ҎQ你不必~写加强安全性的规则?br />J2EE 事务理QTransaction ManagementQ模型让你指定组成一个事务中所有方法间的关p,q样一个事务中的所有方法被当成一个单一的单? 当客LȀzM个enterprise bean中的ҎQ容器介入一理事务。因有容器管理事务,在enterprise bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布|描q文件中声明enterprise bean的事务属性,而不用编写ƈ调试复杂的代码。容器将L文gqؓ你处理此enterprise bean的事务?br />JNDI d(JNDI Lookup)服务向企业内的多重名字和目录服务提供了一个统一的接?q样应用E序lg可以讉K名字和目录服?
J2EEq程q接QRemote Client ConnectivityQ模型管理客L和enterprise bean间的低层交互. 当一个enterprise bean创徏? 一个客L可以调用它的Ҏp它和客户端位于同一虚拟Z一?
生存周期理QLife Cycle ManagementQ模型管理enterprise bean的创建和U除,一个enterprise bean在其生存周期中将会历l几U状态。容器创建enterprise beanQƈ在可用实例池与活动状态中Ud他,而最l将其从容器中移除。即使可以调用enterprisebean的create及removeҎQ容器也会在后台执行这些Q务?/p>
J2EE应用lg可以安装部vC下几U容器中?
EJB 容器理所有J2EE 应用E序中企业bean 的执? enterprise bean 和它们的容器q行在J2EE 服务器上.
Web 容器理所有J2EE 应用E序中JSP面和Servletlg的执? Web lg和它们的容器q行在J2EE 服务器上.
应用E序客户端容器管理所有J2EE应用E序中应用程序客Llg的执? 应用E序客户端和它们的容器运行在J2EE 服务器上.
Applet 容器是运行在客户端机器上的web览器和 Java 插g的结?
? J2EE的核心API与组?br />J2EEq_׃整套服务QServicesQ、应用程序接口(APIsQ和协议构成Q它对开发基于Web的多层应用提供了功能支持Q下面对J2EE中的13U技术规范进行简单的描述(限于幅Q这里只能进行简单的描述):
JDBC(Java Database Connectivity):
JDBC API问不同的数据库提供了一U统一的途径Q象ODBC一PJDBC对开发者屏蔽了一些细节问题,另外QJDCBҎ据库的访问也hq_无关性?br />JNDI(Java Name and Directory Interface):
JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业U的资源如DNS和LDAPQ本地文件系l,或应用服务器中的对象?/p>
J2EE技术之所以赢得某体广泛重视的原因之一是EJB。它们提供了一个框架来开发和实施分布式商务逻辑Q由此很显著地简化了h可~性和高度复杂的企业应用的开发。EJB规范定义了EJBlg在何时如何与它们的容器进行交互作用。容器负责提供公用的服务Q例如目录服务、事务管理、安全性、资源缓冲池以及定w性。但q里值得注意的是QEJBq不是实现J2EE的唯一途径。正是由于J2EE的开放性,使得有的厂商能够以一U和EJBq的方式来辑ֈ同样的目的?br />RMI(Remote Method Invoke):
正如其名字所表示的那PRMI协议调用q程对象上方法。它使用了序列化方式在客L和服务器端传递数据。RMI是一U被EJB使用的更底层的协议?br />Java IDL/CORBA:
在Java IDL的支持下Q开发h员可以将Java和CORBA集成在一赗?他们可以创徏Java对象q之可在CORBA ORB中展开, 或者他们还可以创徏Javacdƈ作ؓ和其它ORB一起展开的CORBA对象的客戗后一U方法提供了另外一U途径Q通过它Java可以被用于将你的新的应用和旧的系l相集成?br />JSP(Java Server Pages):
JSP面由HTML代码和嵌入其中的Java代码所l成。服务器在页面被客户端所h以后对这些Java代码q行处理Q然后将生成的HTML面q回l客L的浏览器?br />Java Servlet:
Servlet是一U小型的JavaE序Q它扩展了Web服务器的功能。作ZU服务器端的应用Q当被请求时开始执行,q和CGI Perl脚本很相伹{Servlet提供的功能大多与JSPcMQ不q实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码Q而servlets全部由Java写成q且生成HTML?br />XML(Extensible Markup Language):
XML是一U可以用来定义其它标记语a的语a。它被用来在不同的商务过E中׃n数据?br />XML的发展和Java是相互独立的Q但是,它和Javah的相同目标正是^台独立性。通过Java和XML的组合,您可以得C个完的hq_独立性的解决Ҏ?br />JMS(Java Message Service):
MS是用于和面向消息的中间g怺通信的应用程序接?API)。它既支持点对点的域Q有支持发布/订阅(publish/subscribe)cd的域Qƈ且提供对下列cd的支持:l认可的消息传?事务型消息的传递,一致性消息和h持久性的订阅者支持。JMSq提供了另一U方式来Ҏ的应用与旧的后台pȝ盔R成?br />JTA(Java Transaction Architecture):
JTA定义了一U标准的APIQ应用系l由此可以访问各U事务监控?br />JTS(Java Transaction Service):
JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务理器是在高层支持Java Transaction API (JTA)规范Qƈ且在较底层实现OMG OTS specification的Java映像。JTS事务理器ؓ应用服务器、资源管理器、独立的应用以及通信资源理器提供了事务服务?br />JavaMail:
JavaMail是用于存取邮件服务器的APIQ它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器,也支持IMAP服务器?br />JTA(JavaBeans Activation Framework):
JavaMail利用JAF来处理MIME~码的邮仉件?
]]>
MVC如何工作
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。用MVC应用E序被分成三个核心部Ӟ模型、视图、控制器。它们各自处理自qd?/p>
视图
视图是用L到ƈ与之交互的界面。对老式的Web应用E序来说Q视囑ְ是由HTML元素l成的界面,在新式的Web应用E序中,HTML依旧在视图中扮演着重要的角Ԍ但一些新的技术已层出不穷Q它们包括Macromedia Flash和象XHTMLQXML/XSLQWML{一些标识语a和Web services.
如何处理应用E序的界面变得越来越有挑战性。MVC一个大的好处是它能Z的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生Q不这些数据是联机存储的还是一个雇员列表,作ؓ视图来讲Q它只是作ؓ一U输出数据ƈ允许用户操纵的方式?/p>
模型
模型表示企业数据和业务规则。在MVC的三个部件中Q模型拥有最多的处理d。例如它可能用象EJBs和ColdFusion Componentsq样的构件对象来处理数据库。被模型q回的数据是中立的,是说模型与数据格式无关Q这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一ơ就可以被多个视N用,所以减了代码的重复性?/p>
控制?br />控制器接受用L输入q调用模型和视图d成用L需求。所以当单击Web面中的链接和发送HTML表单Ӟ控制器本w不输出M东西和做M处理。它只是接收hq决定调用哪个模型构件去处理hQ然后用定用哪个视图来昄模型处理q回的数据?/p>
现在我们ȝQVC的处理过E,首先控制器接收用LhQƈ军_应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用Lhq返回数据,最后控制器用相应的视图格式化模型返回的数据Qƈ通过表示层呈现给用户?/p>
Z么要使用 MVC
大部分Web应用E序都是用像ASPQPHPQ或者CFMLq样的过E化语言来创建的。它们将像数据库查询语句q样的数据层代码和像HTMLq样的表C层代码混在一赗经验比较丰富的开发者会数据从表示层分d来,但这通常不是很容易做到的Q它需要精心的计划和不断的试。MVC从根本上强制性的它们分开。尽构造MVC应用E序需要一些额外的工作Q但是它l我们带来的好处是无庸质疑的?/p>
首先Q最重要的一Ҏ多个视图能共享一个模型,正如我所提及的,现在需要用来多的方式来讉K你的应用E序。对此,其中一个解决之道是使用MVCQ无Z的用h要Flash界面或是 WAP 界面Q用一个模型就能处理它们。由于你已经数据和业务规则从表C层分开Q所以你可以最大化的重用你的代码了?/p>
׃模型q回的数据没有进行格式化Q所以同L构g能被不同界面使用。例如,很多数据可能用HTML来表C,但是它们也有可能要用Macromedia Flash和WAP来表C。模型也有状态管理和数据持久性处理的功能Q例如,Z会话的购物R和电子商务过E也能被Flash|站或者无U联|的应用E序所重用?/p>
因ؓ模型是自包含的,q且与控制器和视囄分离Q所以很Ҏ改变你的应用E序的数据层和业务规则。如果你x你的数据库从MySQLUL到OracleQ或者改变你的基于RDBMS数据源到LDAPQ只需改变你的模型卛_。一旦你正确的实C模型Q不你的数据来自数据库或是LDAP服务器,视图会正确的显C它们。由于运用MVC的应用程序的三个部g是相互对立,改变其中一个不会媄响其它两个,所以依据这U设计思想你能构造良好的村ց合的构g?/p>
Ҏ来说Q控制器的也提供了一个好处,是可以使用控制器来联接不同的模型和视图d成用L需求,q样控制器可以ؓ构造应用程序提供强有力的手Dc给定一些可重用的模型和视图Q控制器可以Ҏ用户的需求选择模型q行处理Q然后选择视图处理结果显C给用户?/p>
MVC的缺?br />MVC的缺Ҏ׃它没有明的定义Q所以完全理解MVCq不是很Ҏ。用MVC需要精心的计划Q由于它的内部原理比较复杂,所以需要花费一些时间去思考?/p>
你将不得不花费相当可观的旉去考虑如何MVCq用C的应用程序,同时׃模型和视图要严格的分,q样也给调试应用E序到来了一定的困难。每个构件在使用之前都需要经q彻底的试。一旦你的构件经q了试Q你可以毫无顾忌的重用它们了?/p>
Ҏ我个人经验,׃我们一个应用程序分成了三个部gQ所以用MVC同时也意味着你将要管理比以前更多的文Ӟq一Ҏ显而易见的。这样好像我们的工作量增加了Q但是请Cq比起它所能带l我们的好处是不g提?/p>
MVCq不适合型甚至中等规模的应用程序,p大量旉MVC应用到规模ƈ不是很大的应用程序通常会得不偿失?/p>
MVC是一条创Y件的好途径
MVC设计模式是一个很好创Y件的途径Q它所提倡的一些原则,像内容和昄互相分离可能比较好理解。但是如果你要隔L型、视囑֒控制器的构gQ你可能需要重新思考你的应用程序,其是应用程序的构架斚w。如果你肯接受MVCQƈ且有能力应付它所带来的额外的工作和复杂性,MVC会使你的Y件在健壮性,代码重用和结构方面上一个新的台阶?br />