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设计模式的好处就越多。

转载于:https://blog.51cto.com/14311187/2389787

IT兄弟连 JavaWeb教程 MVC设计模式相关推荐

  1. java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术

    原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术 Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报 ...

  2. JavaWeb:MVC设计模式

    1. MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controll ...

  3. IT兄弟连 JavaWeb教程 监听器3

    2019独角兽企业重金招聘Python工程师标准>>> 监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession. ...

  4. IT兄弟连 JavaWeb教程 JSON和JSON字符串

    2019独角兽企业重金招聘Python工程师标准>>> JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是 ...

  5. IT兄弟连 JavaWeb教程 文件下载技术

    ●  列出提供下载的文件资源 我们要将Web应用系统中的文件资源提供给用户进行下载,首先我们要有一个页面列出上传文件目录下的所有文件,当用户点击文件下载超链接时就进行下载操作,编写一个ListFile ...

  6. IT兄弟连 JavaWeb教程 Servlet转发

    2019独角兽企业重金招聘Python工程师标准>>> Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象 ...

  7. IT兄弟连 JavaWeb教程 jQuery中其他AJAX支持的函数

    ● $.get()函数 $.get(url,data,function,dataType);参数说明如下: url:请求地址 data:请求参数 dataType:服务器返回的数据类型 functio ...

  8. IT兄弟连 JavaWeb教程 EL表达式获取对象的属性以及数组的元素

    使用${对象名.属性名} EL表达式语言可以使用点号运算符"."来访问对象的属性,例如表达式${customer.name}表示customer对象的name属性. 使用${对象名 ...

  9. IT兄弟连 JavaWeb教程 jQuery对AJAX的支持经典案例

    案例需求:编写用户登陆页面的验证码模块,在用户进行登陆时,输入验证码后不需要点击提交按钮,使用AJAX异步地向服务器发送验证验证码的请求.如果验证码正确,可以点击提交按钮,如果验证码输入错误,提示用户 ...

最新文章

  1. AMD Zen 2新架构2018年初发布 再提升15%性能
  2. dubbo集群和负载均衡
  3. 一个方法搞定安卓路由跳转
  4. CEO 赠书 | 讲述创新背后不为人知的故事,改变世界的 Ta 们做对了什么?
  5. Marketing Cloud的语音输入功能
  6. C/C++头文件一览表
  7. MySQL基础篇(07):用户和权限管理,日志体系简介
  8. SNMP 模拟器 vxsnmpsimulator 使用方法
  9. .NET Remoting 配置文件方式
  10. 码神之路博客项目部署
  11. 需求文档:自营电商后台管理系统
  12. 获取当前时间前3天的零点时间
  13. 普渡大学计算机科学本科,普渡大学计算机科学专业怎么样 排名申请条件介绍...
  14. Excel中输入身份证号后三位变成0的情况处理如下
  15. MySQL远程连接失败(错误码:2003)
  16. 大神详细的ACM训练计划
  17. 极限中0除以常数_0的美好
  18. 双系统后适合装matlab吗,安装双系统对电脑有什么影响|电脑装双系统有什么好处和坏处...
  19. 【SAP GUI Scripting】 入门系列(1)_基本设置
  20. python中fabs什么意思_Python中abs()和fabs()方法之间的区别

热门文章

  1. python代码格式-pyhon代码设计格式指南
  2. python进阶免费-【Python进阶,一学就会】系列1(文末免费送10本书)
  3. python有趣的小项目-有趣的十个Python实战项目,让你瞬间爱上Python!
  4. 在Jetson Xavier NX上安装torchvision编译报错:fatal error: libavcodec/avcodec.h: No such file or directory
  5. JSR315(JavaTM Servlet 3.0 Specification)
  6. 网络编程学习笔记(readv和writev函数)
  7. HDU2094 产生冠军
  8. vue-cli3打包注意路径的问题
  9. C++标准库类模板(stack)和 队列(queue)
  10. go语言之进阶篇http客户端编程