第三部分:MVCD模型
在上一节中,从一般的原则上介绍了两种Web应用模型,但是如何理解和把握这样的模型,将不同的Web技术正确应用到Web程序不同的功能模块中是一个非常实际的话题。下面就在实际编程中如何去把握Web编程模型做一些分析。
1、两层客户/服务器模型
Web应用程序天生是一种客户/服务器应用程序,在ASP(Application Service Provider)逐渐成为Internet应用发展的一个重要方向的时候,使用哪一种编程模型来实现Web应用程序还处于探索之中。上面介绍的微软的DNA结构和Java编程结构就是人们在ASP(Application Service Provider)编程模型上进行探索的结果,但是由于这些技术出现比较新、把握起来也有一些难度,所以许多编程人员采用了使用ASP或是jsp中嵌入“SQL”来实现数据存取和一些相关逻辑,如图11所示。
这样的编程模型有对一些小型系统比较合适,因为不需要太复杂的技术,技术人员比较好找,实现起来也比较快。但是,这种编程模型缺点还是比较明显的:维护困难、重用困难、大型系统中难以治理。
要解决该模型问题的要害是,将逻辑层抽象出来。但是,在以数据中心编程中,数据库不但提供基本的数据存取功能,而且与SQL丰富的表达能力一起提供强大的逻辑表达能力;再上节介绍的图9、图10所示两种模型把握起来有一些难度,所以出现了该模型的一个改良版本。
组成在该改良的模型中,为数据库中的主要的表都建立了一个类,JSP/ASP通过该类实现对数据库表的操作。这个模型一个方面实现了SQL语句封装,方便了程序的维护;另一个方面也提高了系统的重用性,即对Table类的重用。
但是,由于大多数数据库操作都是针对多数据表的操作,假如采用单表的方式来完成逻辑,未免有些浪费数据库与SQL的逻辑功能。另外,由于系统没有实现逻辑层的抽象,不能解决上面提高要害问题。
2、MVC模型的介绍
在传统的面向对象编程中,我们曾经接触过MVC模型。
在该模型中,应用程序分为三个组成部分:
View: 这是用户界面部分,与Web应用程序一样,主管应用程序与人之间的接口:一个方面它为用户提供了输入手段,并触发应用逻辑运行;另一个方面,它又将逻辑运行的结果以某种形式显示给用户。
Controller: 该部分是用户界面与Model的接口;一个方面它解释来自于view的输入,将其解释成立系统能够理解的对象,同时它也识别用户动作,并将其解释对Model特定方法的调用;另一个方面,它也处理来自于Model的事件和Model逻辑执行的结果,调用适当View为用户提供反馈。
Model: 这是整个模型的核心,它表示的是解决方案空间的真正的逻辑。它采用面向对象的方法,将问题领域中的对象抽象为应用程序对象。在这些抽象的对象中封装了对象的属性和这些对象所隐含的逻辑。
上面所示的编程模型中,在应用程序执行过程中,数据就保存在Model的实例中,也就是保存在内存中。当用户需要保存执行的结果时,将模型中的数据保存为特定格式的文件。在用Java实现模型时,可以直接使用Java对象的Serializable特性来保存对象。这种模型适合一些工具软件的开发,如Case工具或是CAD工具。这些工具软件所具有一个共同特征是模型本身比较复杂、数据量不大而且是单用户单模型实例操作。
Web应用程序有着与工具类应用程序不同的特点:数据量大、多用户并行操着。假如象上面一样采用面向对象模型,则往往是多模型实例同时存在,上面的模型不再适合于这样的Web应用程序。
虽然MVC模型不适用于Web应用,但是它为Web应用程序的开发提供了一些借鉴意义。再该模型中提供了对模型的抽象,也就是逻辑的抽象。假如改良该模型,在内存中不保留对象的属性值,并且增加一个数据层,将模型与数据库连接起来,可能是一个好办法。
如何用Java实现图14所示的MVCD模型
3、WCS、MPE模型介绍
图15所示的是在WCS和MPE中所采用的编程模型。该编程模型将JSP、Servlet、JavaBean和JDBC技术有机的结合在一起,基本上实现了图14所示的MVCD模型。
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封装在模型中。