1.3 MVC设计模式
1.3.1 MVC设计模式
MVC是一种设计模式,它是软件设计中的典型结构之一。MVC是Model View Control的缩写。在这种设计结构下,应用程序分为3个组成部分:Model模型、View视图和Controller控制器,每个部分负责不同的功能,如图1-16所示。
图1-16 MVC设计模式
● V:View
View是指用户界面,也就是用户与应用程序交互的接口。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型。视图还能接收模型发出的数据更新事件,从而对用户界面进行同步更新。
● M:Model
Model提供应用业务逻辑,是指对业务逻辑、业务信息的处理模块,包括对业务数据的存取、加工、综合等。一个模型能为多个视图提供数据,由于同一个模型可以被多个视图重用,所以提高了应用的可重用性。
● C:Controller
Controller则负责View和Model之间的流程控制。一方面,它将用户在界面上的操作抽象成系统能理解的对象,转换成对Model的特定方法的调用,来完成具体的业务逻辑;另一方面,它将Model处理完的业务数据及时反应到用户界面上,以便用户浏览。
显而易见,MVC架构使应用程序的结构更加清晰,通过将代码按照层次划分为业务逻辑/数据层、用户界面和应用流程控制这三个层次,能够增强代码的稳定性。
对于Model、View、Controller这三部分功能来讲,View的实现一般是由界面设计人员和界面程序员来完成,Model则是由业务逻辑程序员来完成,Controller则一般由负责整体控制的程序员来完成。对于项目开发而言,三层的分离有利于在项目小组内按照小组成员各自的擅长进行分工,有利于三个部分并行开发、加快项目进度。
另一方面,通常来讲,Controller部分的代码比较稳定,一般会实现一个通用的架构;而Model则跟随商务流程的变化而变化;View的更改则是随着用户需求的更改而更改。这种模块功能的划分有利于在代码修改过程中进行模块的隔离,避免不同功能的代码混杂在一起造成混乱。
1.3.2 Java EE与MVC
在Java EE体系架构中,其多层应用很好地体现了MVC思想:使用JavaBean或EJB提供应用业务逻辑,实现Model;使用HTML页面、JSP页面等实现面向浏览器的数据表现,使用Application Client实现了面向桌面应用的数据表现,也就是View;控制器Controller则是由Servlet承担,由它来提供业务流程控制。如图1-17所示为Java EE架构与MVC设计思想的结合。
图1-17 Java EE与MVC
1.3.3 Web开发模式
尽管MVC设计模式很早就出现了,但在Web应用的开发中引入MVC步履维艰。主要原因是在早期的Web应用的开发中,程序语言和HTML的分离一直难以实现。例如在JSP网页中执行业务逻辑的程序代码和HTML表示层数据混杂在一起,因而很难分离出单独的业务模型。这使得维护JSP网页非常困难,很难满足用户的变化性需求。
1.JSP Model
在早期的基于Java EE的Web应用中,JSP文件负责业务逻辑、控制网页流程并创建HTML, JSP文件是一个独立的、自主完成所有任务的模块,称为JSP Model开发模式,体系结构如图1-18所示。
图1-18 JSP Model
很显然,JSP Model开发模式会给Web开发带来以下一系列问题。
● HTML代码和Java程序强耦合在一起:JSP文件的编写者必须既是网页设计者,又是Java开发者。实际情况是多数Web开发人员要么只精通网页设计,能够设计出漂亮的网页外观,但是编写的Java代码很糟糕;要么仅熟悉Java编程,能够编写稳固的Java代码,但是设计的网页外观很难看。
● 内嵌的流程逻辑:要理解应用程序的整个流程,必须浏览所有网页。如果有几百个网页呢?
● 测试困难:除了很糟的外观之外,HTML标记、Java代码和JavaScript代码都集中在一个网页上,使测试变得相当困难。
● 强耦合:更改业务逻辑或数据可能牵涉相关的多个网页。
为了解决以上问题,Sun公司先后制定了两种规范:JSP Model1和JSP Model2。
2.JSP Model1
JSP Model1体系结构结合使用JSP页面和JavaBean来开发基于Java EE的Web应用程序。JSP Model1体系结构如图1-19所示。
图1-19 JSP Model1体系结构
Model1使用JSP+JavaBean将页面显示和业务逻辑处理分开,JavaBean对象用来保存数据和实现商业逻辑,它充当模型,而JSP负责响应用户请求并将处理结果返回用户,JSP既要负责业务流程控制,又要负责提供表示层数据,同时充当视图和控制器。
Model1最大的特点就是将一次请求的响应过程完全交给一个JSP页面负责,其典型的应用就是让创建表单的JSP页面同时负责处理该表单提交的请求,也就是JSP页面既要负责输出创建表单的HTML代码,又要处理表单提交的数据。
很显然,Model1体系结构未能完全实现MVC模式中模块之间的独立和分离,尽管它十分适合简单应用的需要,却不适合开发复杂的大型应用程序。不加选择地随意运用JSP Model1模式,会导致JSP页面内嵌入大量的Java代码。尽管这对于Java程序员来说可能不是什么大问题,但如果JSP页面是由网页设计人员开发并维护的,这确实是个问题。从根本上讲,将导致角色定义不清和职责分配不明,给项目管理带来很多麻烦。
3.JSP Model2
JSP Model2体系结构借鉴了MVC设计模式来实现显示内容和业务逻辑的完全分离,它综合采用JSP+Servlet+JavaBean技术来开发基于Java EE的Web应用程序。JSP Model2体系结构如图1-20所示。
图1-20 JSP Model2体系结构
JSP Model2开发模式是一种联合使用JSP与Servlet来提供动态内容的方法。它吸取了JSP和Servlet两种技术各自的突出优点,用JSP生成表示层和内容,让Servlet完成深层次的处理任务。在这里,Servlet充当控制器的角色,负责处理用户请求,创建JSP页面需要使用的JavaBean对象,根据用户请求选择合适的JSP页返回给用户。在JSP页中没有处理逻辑,它仅负责检索原先由Servlet创建的JavaBean对象,从Servlet中提取动态内容插入到静态模板。这是一种有突破性的软件设计方法,它清晰地分离了表达和内容,明确了角色定义及开发者与网页设计者的分工。事实上,项目越复杂,使用JSP Model2开发模式的好处就越大。