唐 勇 汪丹平
(安徽理工大学计算机科学与工程学院,安徽 淮南 232001)
MVC是一种目前广泛流行的软件设计模式,随着 J2EE(Java2 Enterprise Edition)的成熟,它正在成为在J2EE平台上推荐的一种设计模型,其目的就是实现Web系统的职能分工.MVC是把一个应用的输入、处理、输出流程按照 Model、View、Controller的方式进行分离,其优势在于层与层之间各司其职,互不干涉。模型、视图、控制器三者之间的关系和各自的主要功能,如图1所示:
图1 MVC组件类型的关系和功能
在该模型中,应用程序分为三个组成部分:
(1)View:用户视图模块,这是用户界面部分。主管应用程序与人之间的接口,一方面,它为用户提供了输入手段,并触发应用逻辑运行,另一方面,它又将逻辑运行的结果以某种形式显示给用户。
(2)Contr0ller:流程控制模块,该部分是用户界面与Model的接口。一方面它解释来自于view的输入,将其解释成系统能够理解的对象,同时它也识别用户动作,并将其解释为对Model特定方法的调用;另一方面,它也处理来自于Model的事件和Model逻辑执行的结果,调用适当的View为用户提供反馈。
(3)Model:事务逻辑模块,是整个模型的核心。它表示解决方案真正的逻辑。它采用面向对象的方法,将问题领域中的对象抽象为应用程序对象。在这些抽象的对象中封装了对象的属性和这些对象所隐含的逻辑。
J2EE是一整套技术的总称,包括建立企业应用系统的各个方面,使用J2EE技术能使我们快速建立企业应用系统。J2EE的目标是提供一个基于Java语言的服务器端应用结构,支持平台独立、可移植、多用户、安全和标准的企业级应用。使用J2EE来开发n层的应用,要将原来的2层体系细分为多个不同的层。一个n层的应用能够为以下的每个服务提供独立的层:
(1)表现:在一个典型的Web应用中,运行在客户机器上的浏览器负责处理表现。
(2)动态产生表现:虽然浏览器可以处理一些动态产生的表现,不过为了支持多种不同的浏览器,大部分的动态产生都应该在Web服务器进行,通过使用JSP,servlet或者XML(Extensible Markup Language,扩展标记语言)和XSL(Extensible Stylesheet Language,扩展样式表语言)。
(3)商业逻辑:实现商业逻辑的最佳方法是通过Session EJB。
(4)数据访问:实现数据访问的最佳方法是在Entity EJB,以及使用JDBC。
(5)Backend系统集成:可使用各种不同的技术来与backend系统集成。最佳的选择在于backend系统的确切种类。
J2EE是一个标准的体系结构,它特别面向使用Java程序设计语言进行基于Web的企业应用的开发与部署,图2展示了基于Web应用的J2EE应用编程模型。
图2 基于Web应用的J2EE应用编程模型
将MVC模式应用于web应用程序中时,控制模块(Controller)主要提供以下功能:首先接收用户端发送的与网络协议相关的请求,然后解析请求并转换为事务逻辑模块(Model)的输入参数,调用相应的事务逻辑模块(Model)进行处理,最后根据事务逻辑模块的处理结果调用相应的用户视图模块(View)生成结果页面,返回至浏览器。
JSP和Servlet都具备实现控制模块的条件,但通常情况下,我们选用Servlet。因为控制模块主要的功能是接收输入参数,控制程序流程,程序代码一般是连贯的Java代码,并且无需向客户端输出信息,而JSP更适合在编写动态页面时使用,同时JSP的解释执行过程比Servlet更为复杂。
用户视图模块的主要功能是根据事务逻辑模块处理的结果生成返回至客户端的页面。与控制模块相反的是,由于用户视图模块的重心在于页面设计,因此,JSP是开发页面模块的最好选择。目前已有很多可视化的网页设计软件能够识别JSP标记,方便了网页设计人员的开发过程。
事务逻辑模块(Model)是Web应用程序中最终负责处理客户请求的模块。因此,事务逻辑模块必须能够满足大多数客户的需求,包括保证应用程序各组件的事务整合,维护并快速的获取应用数据,支持事务工作流的协调以及在已有应用程序中集成新的应用组件等。为了满足这些需求,编写事务逻辑模块需要使用到以下 技 术 :Servlet、JavaBean、EJB、JDBC、CORBA、LDAP以及其它企业级的应用服务。
由于己经把事务逻辑模块与控制模块进行了分离,这样该模块的开发就无需特殊的网络编程能力,程序的开发主要就集币在事务处理、逻辑判断等方面了,因此在中小型网站的应用中通常把事务逻辑模块封装为JavaBean,提高了事务逻辑模块在网络应用和非网络应用中的可重用性,并为将来向分布式网络计算过渡打好基础。
图3 MVC在Web应用中的体系结构
在MVC模型中,后端系统是我们的Model,用来创建用户响应界面的模板是view,而把这两者联系起来的纽带是Controller。JSP完美的对应于MVC模式中的View,Servlet包含了管理如何处理请求的逻辑,实际上就成为了Controller,而系统已有的业务规则就是Model,并用JavaBean进行封装。MVC在Web应用中的体系结构,如图3所示,其中,Servlet充当控制者的角色,负责管理对请求的处理,创建JSP页需要使用的bean和对象,同时根据用户的动作决定把那个JSP页传给请求者。特别要注意,在JSP页内没有处理逻辑,它仅负责检索原先由Servlet创建的对象或bean,从Servlet中提取动态内容插入静态模板。这是一种有代表性的方法,它清晰地分离了表达和内容,明确了角色的定义以及开发者与网页设计者的分工。事实上,项目越复杂,使用MVC体系结构的好处就越大。
模块间数据交换是通过把事务逻辑模块的处理结果存储在一个JavaBean中,并将该JavaBean存放在session中。当控制模块需要获取事务逻辑模块的处理结果时,只要从当前会话中取出JavaBean,即可得到所需数据。Data Beans有效地解决了控制模块与事务逻辑模块之间的数据传递问题,并且借助于会话管理使得不同用户的数据得以区分。
该系统属于浏览器/服务器模型(Browser/Server)。一般的,客户通过浏览器发送HTTP请求给服务器端Web服务器,Web服务器接收该请求并且进行相应处理,然后将处理后的结果返回到客户的浏览器中。在客户端,浏览器中呈现的正是该系统的视图部分,视图的作用就是提供给客户一个可视化的界面,并且允许客户输入一些数据来与服务器端程序交互。对客户来说,他只能看到视图,而模型和控制器对他则是透明的。在这里Web服务器仅起到提供HTTP服务的作用。Web服务器将客户提交的HTTP请求交给后方的JSP、Servlet引擎,并且进一步交给其中的控制器来处理。控制器按照从请求映射表将该请求映射到相应的对象或bean;处理器对模型进行更新、修改等操作,处理完后返回结果给控制器;控制器根据结果通知视图做相应变化,并且选择相应视图返回给客户。
J2EE技术和MVC设计模式的结合,大大降低了Web应用系统结构的复杂程度、代码之间的祸合度,增加了代码的易维护性、应用框架的可重用性、组件的可重用性、易测性和不同技能的开发员的分工。
[1]许幼鸣,徐锦,文耘.基于设计模式的软件重用.1999,3:13~14,计算机工程.
[2]Vlada Matena,Beth Stearus.J2EE 平台上的EJB组件开发.翟裕中,北京:机械工业出版社,2001.
[3]裴龙,何大可.JavaZSwing组件设计模式分析.2001,8:274~276,计算机应用.
[4]Martin Flower.Analysis Patterns:Reusable object Models.Addison Wesley,1997.
[5]GAMMA E,HELM R.设计模式[M].北京:机械工业出版社,2000.
[6]Subrahmanyam Allamaraju.J2EE服务器端高级编程.北京:机械工业出版社,2001.