IT兄弟连 JavaWeb教程 MVC设计模式

  • 2019 年 10 月 5 日
  • 筆記

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ITXDL123/article/details/90089804

MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是一种设计模式,它强制性地把应用程序的数据展示、数据处理和流程控制分开。MVC把应用程序分成3个核心模块:模型、视图和控制器,它们分别担当不同的任务。图1显示了这几个模块各自的功能及它们的相互关系。

图1 MVC设计模式

1 视图

视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并能接收用户的输入数据,但是它并不进行任何实际的业务处理。视图可以向模型查询业务状态,但不能改变模型。视图还能接收模型发出的数据更新事件,从而对用户界面进行同步更新。

2 模型

模型是应用程序的主体部分。模型表示业务数据和业务逻辑,一个模型能为多个视图提供数据。由于同一个模型可以被多个视图重用,所以提高了模型的可重用性。

3 控制器

控制器负责应用的流程控制。所谓流程控制,这里是指接收用户的输入并调用相应的模型和视图去完成用户的需求。当Web用户单击Web界面中的"提交"按钮来发送HTML表单时,控制器会接收请求并调用相应的模型组件去处理请求,然后在调用相应的视图来显示模型返回的数据。

4 MVC处理过程

我们来总结一下MVC处理过程,首先控制器接收用户的请求,并决定应该调用那个模型来进行处理;然后模型根据客户请求进行相应的业务逻辑处理,并返回数据。最后控制器调用相应的视图来格式化模型返回的数据,并通过视图呈现给用户。

5 MVC的优点

在最初的JSP网页中,像数据库查询语句这样的数据访问代码和像HTML这样的表示层代码是混在一起的。经验比较丰富的开发者会将数据库访问代码从表示层分离开来,但这通常不是很容易做到的,它需要精心的设计和不断地尝试,MVC从根本上强制性地将他们分开。尽管构成MVC应用程序需要一些额外的工作,但是它给开发人员带了的诸多优点是毋庸置疑的。

首先,多个视图能共享一个模型。如今,同一个Web应用程序会提供多种用户界面,例如用户即希望能通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱,这就要求Web网站同时提供Web界面和WAP界面。在MVC设计模式中,模型响应客户请求并返回响应数据,视图负责格式化数据并把他们呈现给用户,业务逻辑和表示层分离。同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。

其次,模型是自包含的,与控制器和视图保持相对独立,所以可以方便地改变应用程序的业务数据和业务规则。如果要把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需更改模型即可。一旦正确地实现了模型,不管数据是来自数据库还是来自LDAP服务器,视图都会正确地显示它们。由于MVC的3个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的松耦合的构件。

此外,控制器提高了应用程序的灵活性和可配置性。控制器可以用来连接不同的模型和视图去完成用户的需求,还可以为构造应用程序提供强有力的组合手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型进行处理,然后选择适当的视图将处理结果显示给用户。

MVC的适用范围

使用MVC需要精心的设计,并且由于它的内部原理比较复杂,所以需要花费一些时间去理解它,将MVC运用到应用程序中,会带来额外的工作量,增加应用的复杂性,所以MVC不适合小型应用程序。

但对于开发存在大量用户界面,并且业务逻辑复杂的大型应用程序,MVC将会使软件在健壮性和代码可重用性方面上一个新的台阶。尽管最初构件MVC框架会花费一定的时间,但从长远角度看,它会大大提高后期软件开发的效率。

JSP Model1 和 JSP Model2

尽管MVC设计模式很早就出现了,但在Web应用的开发中引入MVC却是步履艰难,其主要原因是在早期的Web应用的开发中,程序代码和HTML代码的分离一直难以实现。例如在JSP网页中执行业务逻辑的程序代码和HTML表示层代码混杂在一起,因而很难分离出单独的业务模型,从而使得产品设计的弹性力度很小,很难满足用户的变化性需求。

在早期的JavaWeb应用中,JSP文件负责处理业务逻辑、控制网页流程并创建HTML页面,JSP文件时一个独立的、能自主完成所有任务的模块,这给Web开发带来一系列问题。

HTML代码和Java程序代码强耦合在一起:JSP文件的编写者必须即是网页设计者,又是Java开发者。但实际情况是,多数Web开发人员那么只精通网页设计,能够设计出漂亮的网页外观,但是编写的Java代码很糟糕;要么仅熟悉Java编程,能够编写健壮的Java代码,但是设计的网页外观很难看。这两种才能介备的开发人员并不多见。

内嵌的流程控制逻辑:要理解应用程序的整个流程,必须浏览所有JSP页面,试想一下拥有100多个网页的网站的流程控制逻辑应该多么错综复杂。

调试困难:除了很糟的外观设计,HTML标记、Java代码和JavaScript代码都集中在一个网页中,这使调试变得相当困难。

可维护性差:更改业务逻辑或控制流程往往牵涉相关的多个JSP页面。

可读性差:设想有1000行代码的网页,其编码样式看起来杂乱无章。即使有彩色语法显示,阅读和理解这些代码仍然比较困难。

为了解决以上问题,SUN公司先后制定了两种设计模式,分别为JSP Model1和JSP Model2,虽然JSP Model1在一定程度上实现了MVC中的视图和模型,但是它的运用并不理想,这种状况直到基于JavaEE的JSP Model2问世才得以改观。JSP Model2用JSP技术实现视图的功能,用Servlet技术实现控制器的功能,用JavaBean技术实现模型的功能。

JSP Model1和JSP Model2的本质区别在于负责流程控制的组件不同。在Model1中,JSP页面负责调用模型组件来响应客户请求,并将处理结果返回给用户,JSP既要负责流程控制,还要负责产生用户界面,因此他要同时充当视图和控制器的功能。所以未能实现这两个模块之间的独立和分离。尽管Model1十分适合简单应用的小,但它不适合开发复杂的大型应用程序。不加选择地随意运用Model1,仍然会导致JSP页内嵌入大量的Java代码。尽管这对于Java程序员来说可能不是什么大问题,但如果JSP页面时有网页设计人员开发并维护的(通常这是开发大型项目的规范),这就确实是个问题了。从根本上讲,这将导致角色定不清和职责分配不明,从而给项目管理带来很多麻烦。

JSP Model2体系结构,是一种联合使用JSP与Servlet来提供动态内容服务的方法。它吸取了JSP和Servlet两种技术各自的突出优点,用JSP生成表示层内容,让Servlet完成深层次的处理任务。在这里,Servlet充当控制器的角色,负责处理客户请求,创建JSP页面需要使用的JavaBean对象,并根据客户请求选择合适的JSP页面返回给用户。在JSP页面没有流程控制逻辑,它仅负责检索原先由Servlet创建的JavaBean对象,并把JavaBean对象包含的数据作为动态内容插入到静态模板中。这是一种有突破性的软件设计方法,它清晰地分离了数据展示、数据处理和流程控制,明确了角色定义及软件开发者与网页设计者的分工。事实上,项目越复杂,使用Model2设计模式的好处就越多。