Web 应用程序模型及其Java实现
developerWorks 李山
关于作者
李山,高级系统分析员,1996年获上海交大硕士学位,多年来一直从事Java组件和Web应用程序的开发工作,对程序架构、编程模型等有着极大兴趣,并做过较深入的研究。您可以通过 [email protected] 与他联系。
内容:
引言
几种典型的编程模型
单层应用模型
两层客户/服务器应用模型
多层客户服务器应用模型
分布式系统
基于Web的多层应用模型
下一种编程模型是什么?
关于作者
应用程序是什么,简单的来说,它是人类客观世界的问题领域在计算机世界的解决方案。我们生活的客观世界复杂多样,计算机世界也是博大精深,怎样从普遍的意义上来表述应用程序是一个非常有用的课题。应用程序的编程模型,也就是应用程序的拓扑结构,是一门关于应用程序的科学。从事软件设计、软件开发的人员,如果能够就应用程序的编程模型有足够的重视,将受益匪浅。
引言
简单介绍应用程序编程模型的发展过程,以及我们常用的几种应用程序编程模型。通过对多个模型的表述加深人们对编程模型的概念,为下面进一步描述Web应用模型打下基础,
1、应用程序的基本功能单元
组成应用程序的功能代码及其资源,按照其在应用程序中的功能,可以简单分解成为三个部分:用户界面(User Interface),事务逻辑(Business Logic)和数据存取(Data Access)。应用程序的基本功能单元如图1所示。
图1、应用程序功能分解
2、几种典型的编程模型
随着计算机技术的发展和应用的深入,应用程序的编程模型在不断的演化,先后出现了:单层应用模型(monolithic);两层客户/服务器应用模型(two-tier client/server);多层应用模型(multitier client/server); 分布式系统;基于Web的多层应用模型(web-based multitier client/server)。
单层应用模型
早期为大型机编写的应用程序,没有将应用程序三个组成部分分开,即没有将用户界面、事务逻辑和数据存取分开。这种体系结构跟当时的计算机水平和应用状况有一定的联系,当时的用户通过哑终端来共享大型机资源,哑终端没有任何处理能力,所有的用户界面、事务逻辑和数据存取功能都是在大型机上实现,这样当时使用单层体系结构而没有出现多层体系结构是合理的。单层的应用程序结构见图2所示。
图2、单层的应用程序模型
两层客户/服务器应用模型
PC机的出现对应用程序模型的发展带来了巨大的推动力,这时出现了客户服务器模式的应用程序,即应用程序的代码和资源被明确的划分为客户端和服务器端。因为PC机有了一定的处理能力,传统在大型机上实现的的用户界面和部分事务逻辑被移到PC机上运行(我们将这种PC机端的代码称为应用程序客户端),而大型机则提供部分事务逻辑处理和数据存取的功能(我们将这种大型机端的代码称为应用程序服务器端)。随着PC机处理能力在逐渐加大,客户端执行的任务逐渐增多,这时对服务器端的硬件要求也在逐渐的降低。
根据事务逻辑在客户端和服务器端分配的不同,该种模型有图3所示几种形式。
图3、两层客户/服务器应用模型的三种形式
需要值得注意的是,客户/服务器应用程序常常体现为客户端和服务器端运行在不同的计算机上,但这并不是必然的要求,在同一台计算机上同样可以实现客户/服务器应用程序。
多层客户服务器应用模型
两层应用程序模型的出现极大的增加了应用程序的灵活性,同时也带来应用程序可维护性的提高。但是,在两层应用程序中仍然存在着不便维护的缺点,客户端的逻辑或是客户端的嵌入SQL极有可能随着数据库的改变或是事务逻辑的变化而变化,不得不重新实现并发布一个新的客户端,也就是说,这样的应用程序模型仍然是比较脆弱的。三层或是更多层应用模型的出现,解决了这样的问题。
在三层的应用程序模型中,事务逻辑与用户界面和数据存取明显的分离出来,将客户端的用户界面与服务器端数据存取隔离开来,极大的改善了应用程序的可维护性。
注意,虽然最常用的多层客户/服务器模型是三层模型,但是,现在已经出现了将事务逻辑层和数据存取层增加的趋势。这种更多更细的分层不但提高了系统的维护性能,同时也增加了系统的重用性和与分布式系统概念融合的可能性。
图4所示为一个典型的三层模型:
图4、三层客户/服务器应用模型
分布式系统
在分层的客户/服务器应用模型中,下一层为上一层提供服务,上一层调用下一层提供的服务,这不利于功能的重用。为了最大限度的发挥系统的功能,分布式系统打破分层系统中对于客户和服务器的定义,将应用程序的代码实现分解为遵循某个标准规范的对象,这些对象中提供的功能被封装到接口中。在某个具体的服务逻辑中,一个对象可能充当客户端的功能,它需要调用另一个对象提供服务;但是,在另一个服务逻辑中,同一个对象可能为另一个对象提供服务,充当服务器的功能。
常见的分布式对象规范有COM/DCOM、CORBA、Java RMI等。
分布式系统模型如图5所示。
图5、分布式系统模型
基于Web的多层应用模型
WWW的发展,使得Internet的应用不再局限于提供一些静态的内容、甚至也不满足于提供一些简单的动态内容。传统以独立的软件包形式发布的一些应用程序,正逐渐被搬上Internet,以出租服务的方式提供给用户,这就是ASP(Application Service Provider)。由于Web的特点是Internet 上的HTTP,是一种请求应答式的无连接的服务形式,所以这种基于Web的应用程序在体系结构上有其独特的特点。
图6、基于Web的多层应用模型
3、下一种编程模型是什么?
从SUN的Jini技术、微软的Microsoft.net技术可以看出,应用程序模型正在超越目前的水平。比如,目前的分布式应用系统不得不遵循某个接口规范和实现,如RMI、CORBA、DCOM等等,这在一定程度上限制了系统的扩展性。为了解决这个缺点,微软正在开发一种基于HTTP、XML的构件自解析的网络服务构件标准。
第二部分:认识两个重要的ASP(Application Service Provider)模型
内容:
从“Web内容”到“Web应用”
微软的Web应用开发模型
Java的Web应用开发模型
关于作者
在前一节关于体系结构介绍的基础上,本节进一步介绍Web应用的体系结构,并且详细介绍了两个主流的Web应用体系结构。
1、从“Web内容”到“Web应用”
ASP(Application Service Provider)的出现,或是说Web应用程序的出现是Internet的技术及应用不断发展的结果。早期的Internet是作为一种为用户提供静态的内容的工具,如图7所示。
图7、Web内容的体系结构
基于Web的内容与普通的内容表现方式是不一样的,它需要借助两个特殊的应用程序,Web浏览器和Web服务器。Web浏览器的一个重要功能是与服务器联络、发送内容请求、最后是处理服务器的响应;而Web服务器的功能则是监听并响应Web浏览器的请求。在基于内容的Internet中,大多数被请求和下载的文件是HTML。
静态的Web内容不能满足用户交互性的需要,于是乎出现了客户端脚本(VB Script、Java Script)、基于DOM的动态HTML技术、客户端控件(ActiveX、Applet),这些技术在一定程度上提高了Web的内容的交互性特性,但是这些技术大多是与Web浏览器平台相关的,不能保证站点提供的内容被所有的浏览器都能访问。这些技术仍然被归为Web内容的范畴。
要设计一个被所有的浏览器都能访问的Web,需要将脚本由Web浏览器端移动到服务器端。将Form与客户端的程序技术(CGI、Servlet)和脚本技术(ASP[Active Server Page]、JSP)结合起来,将能够为用户提供非常丰富的内容,这种形式的Web内容被称为Web应用。图8所示为Web应用的基础结构。
从图7、图8可以看出,我们不能孤立的看待HTML、ASP、JSP这些技术,需要将它们与它们运行的环境一起看作是一个整体。从这个视角上看,无论是Web内容还是Web应用都是一个分层的应用体系结构。
图8、Web应用的体系结构
2、微软的Web应用开发模型
微软的Web应用体系结构是对图8所示体系结构的一种具体实现,被称为DNA(Distributed N-tier Architecture)结构。图9所显示为微软DNA结构。
图9、微软DNA体系结构
ASP:这是一个由IIS支撑的服务器脚本技术,作为服务器端的脚本技术,它完成部分商务逻辑功能,同时也是用户界面与事务逻辑之间联系的纽带。
COM组件:COM是一个软件组件标准,在该体系结构中主要起完成主要的事务逻辑的作用。
ADO是一种微软提供的一种方便数据库访问的COM组件。
3、Java的Web应用开发模型
Java的Web应用模型经历了一个不断沿便的过程,从Applet、RMI、JavaBeans、到EJB、Servlet、JSP经历了一个不断完善的过程。图10所示的编程模型融合了大多数主流的Java技术。
图10、Java的Web应用体系结构
JSP是一个用Java实现的服务器脚本技术,它所起得作用与上图所示的ASP类似。
Servlet是较JSP更早出现的一种服务器端编程技术,它所起的作用类似于CGI。
JavaBeans是一种构件标准,在本模型中与上图中的COM类似。
EJB则是一种企业级构件标准。
第三部分:MVCD模型
内容:
两层客户/服务器模型
MVC模型的简介
WCS、MPE模型介绍
对JICPD模型的改进
关于作者
在上一节中,从一般的原则上介绍了两种Web应用模型,但是如何理解和把握这样的模型,将不同的Web技术正确应用到Web程序不同的功能模块中是一个非常实际的话题。下面就在实际编程中如何去掌握Web编程模型做一些分析。
1、两层客户/服务器模型
图11、两层客户/服务器模型
Web应用程序天生是一种客户/服务器应用程序,在ASP(Application Service Provider)逐渐成为Internet应用发展的一个重要方向的时候,使用哪一种编程模型来实现Web应用程序还处于探索之中。上面介绍的微软的DNA结构和Java编程结构就是人们在ASP(Application Service Provider)编程模型上进行探索的结果,但是由于这些技术出现比较新、掌握起来也有一些难度,所以许多编程人员采用了使用ASP或是JSP中嵌入“SQL”来实现数据存取和一些相关逻辑,如图11所示。
这样的编程模型有对一些小型系统比较合适,因为不需要太复杂的技术,技术人员比较好找,实现起来也比较快。但是,这种编程模型缺点还是比较明显的:维护困难、重用困难、大型系统中难以管理。
要解决该模型问题的关键是,将逻辑层抽象出来。但是,在以数据中心编程中,数据库不但提供基本的数据存取功能,而且与SQL丰富的表达能力一起提供强大的逻辑表达能力;再上节介绍的图9、图10所示两种模型掌握起来有一些难度,所以出现了该模型的一个改良版本,如图12所示。
图12、改良的客户/服务器模型
组成在该改良的模型中,为数据库中的主要的表都建立了一个类,JSP/ASP通过该类实现对数据库表的操作。这个模型一个方面实现了SQL语句封装,方便了程序的维护;另一个方面也提高了系统的重用性,即对Table类的重用。
但是,由于大多数数据库操作都是针对多数据表的操作,如果采用单表的方式来完成逻辑,未免有些浪费数据库与SQL的逻辑功能。另外,由于系统没有实现逻辑层的抽象,不能解决上面提高关键问题。
2、MVC模型的介绍
在传统的面向对象编程中,我们曾经接触过MVC模型,如图12所示。
图13、MVC模型
在该模型中,应用程序分为三个组成部分:
View: 这是用户界面部分,与Web应用程序一样,主管应用程序与人之间的接口:一个方面它为用户提供了输入手段,并触发应用逻辑运行;另一个方面,它又将逻辑运行的结果以某种形式显示给用户。
Controller: 该部分是用户界面与Model的接口;一个方面它解释来自于view的输入,将其解释成立系统能够理解的对象,同时它也识别用户动作,并将其解释对Model特定方法的调用;另一个方面,它也处理来自于Model的事件和Model逻辑执行的结果,调用适当View为用户提供反馈。
Model: 这是整个模型的核心,它表示的是解决方案空间的真正的逻辑。它采用面向对象的方法,将问题领域中的对象抽象为应用程序对象。在这些抽象的对象中封装了对象的属性和这些对象所隐含的逻辑。
上面所示的编程模型中,在应用程序执行过程中,数据就保存在Model的实例中,也就是保存在内存中。当用户需要保存执行的结果时,将模型中的数据保存为特定格式的文件。在用Java实现模型时,可以直接使用Java对象的Serializable特性来保存对象。这种模型适合一些工具软件的开发,如Case工具或是CAD工具。这些工具软件所具有一个共同特征是模型本身比较复杂、数据量不大而且是单用户单模型实例操作。
Web应用程序有着与工具类应用程序不同的特点:数据量大、多用户并行操着。如果象上面一样采用面向对象模型,则往往是多模型实例同时存在,上面的模型不再适合于这样的Web应用程序。
虽然MVC模型不适用于Web应用,但是它为Web应用程序的开发提供了一些借鉴意义。再该模型中提供了对模型的抽象,也就是逻辑的抽象。如果改良该模型,在内存中不保留对象的属性值,并且增加一个数据层,将模型与数据库连接起来,可能是一个好办法,如图14所示。
图14、调整后的MVC模型(MVCD:Model_View_Control_Data)
如何用Java实现图14所示的MVCD模型
3、WCS、MPE模型介绍
图15所示的是在WCS和MPE中所采用的编程模型。该编程模型将JSP、Servlet、JavaBean和JDBC技术有机的结合在一起,基本上实现了图14所示的MVCD模型。
图15、JICPD(JSP_IC_COMMAND_PO_DATA)模型
JSP:JSP在本模型中主要起着用户界面的功能,掌管所有的输入和输出。在该部分中所使用的技术包括。
HTML:用户从浏览器上所看见的内容主要是以HTML的形式提供的,只是有一些内容是静态的,而有一些内容是由JSP动态产生的。
Applet:这是一种客户端程序技术,它作为一种可以独立运行的程序模块嵌入到HTML中。
Java Script:这里的Java Script指的是客户端脚本技术,主要在客户端提供一些动态功能和实现输入格式的检查。
JSP:这是一种在服务器端执行的脚本技术,它的主要功能是接受服务器端逻辑运算的结果,动态的生成HTML作为对浏览器端请求的响应。
IC (Interaction Controller):IC是以Servlet技术实现的。IC是介于事务逻辑和用户界面之间的一个层次,该层主要起用户界面和事务逻辑之间的枢纽作用。从JSP上接受的用户输入,因为是以HTTP请求的形式发送到服务器端,该HTTP请求的具体内容是什么、它提供了哪些参数需要在服务器端进行解析,然后才能决定为了响应该请求要执行什么事务逻辑;事务逻辑在执行完成之后,作为对某个用户请求的响应,它需要将执行的结果以HTTP响应的形式发送到客户端。IC正是起着上面所示的两种作用的程序单元,它一个方面响应来自于JSP的请求,并将其解释为制定的Command调用;另一个方面它将Command执行的结果传递给特定的JSP并调用该JSP作为给用户的响应。
Command:Command是以JavaBeans技术实现的。在一个应用程序中,比较稳定且起着核心作用的是事务逻辑,而Command就是用来实现事务逻辑的。在这样的Web应用程序中,将系统的事务逻辑封装成许多独立的Command,这些Command一个方面作为对IC的响应,另一个方面它完成了逻辑与数据库对象PO的结合。
PO:这是一个特殊的Java Class,它在该模型中起着应用与数据库之间的桥梁作用。Web应用程序大多都有丰富的数据,都需要与数据库进行连接。Command对数据库进行调用所需的基本功能都封装在PO中。
DataBean:如图所示,JSP、IC、Command与PO之间是一种功能提供者与调用者之间的关系,那么如何传递参数呢。DataBean便是这样的一个解决方案,它将这些功能模块间传递的参数抽象成对象。
4、对JICPD模型的改进(JIMPD)
在图15所示的模型中,系统抽象出了逻辑层,即Command层。但是,系统并没有将其所有的Command和DataBean有机的整合起来,即开发者看不见一个完整的对象模型,我认为这对面向对象的开发是一个损失。因为,如果一个好的面向对象模型,不但为数据库的设计提供依据,而其也为Command的设计和组织提供了一个依据,并且也将数据库与Command的关系完整的表达出来。所以提高该模型性能的关键就是增加一个模型层,将Command与Databean封装在模型中,如图16所示。
发布人:netbull 来自:LinuxAid