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

IT兄弟连 JavaWeb教程 MVC设计模式的更多相关文章

  1. JavaWeb笔记——MVC设计模式和JavaWeb经典三层架

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

  2. javaweb之MVC设计模式

    1.MVC简介 MVC是Model-View-Controller的简称,即模型-视图-控制器.MVC是一种设计模式,它把应用程序分成三个核心模块:模型,视图,控制器,它们各自处理自己的任务. 模型( ...

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

    JSON (JavaScript Object Notation)是JavaScript语言中的一种对象类型.JSON的好处是易于阅读和解析.当客户端和服务器端需要交互大量数据时,使用JSON格式传输 ...

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

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

  5. IT兄弟连 JavaWeb教程 文件上传技术

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参 ...

  6. IT兄弟连 JavaWeb教程 监听器4

    感知Session绑定事件的监听器 保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中:从 ...

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

    监听域对象中属性变更的监听器 域对象中属性的变更的事件监听器就是用来监听ServletContext.HttpSession.HttpServletRequest这三个对象中的属性变更信息事件的监听器 ...

  8. IT兄弟连 JavaWeb教程 监听器2

    4  监听HttpSession域对象的创建和销毁 HttpSessionListener接口用于监听HttpSession对象的创建和销毁. 创建一个Session时,激发sessionCreate ...

  9. IT兄弟连 JavaWeb教程 监听器1

    1  基本概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序 ...

随机推荐

  1. 推荐一个非常好的 IntelliJ IDEA 教程

    教程地址:https://github.com/judasn/IntelliJ-IDEA-Tutorial 作者博客:http://www.youmeek.com/category/software- ...

  2. [自动化平台系列] - 初次使用 Macaca-前端自动化测试(1)

    1. 所先看一下官方地址,了解一下这个是不是你想要的测试工具 https://macacajs.github.io/macaca/environment-setup.html 2. 去掉sudo -- ...

  3. Automating hybrid apps

    Automating hybrid apps One of the core principles of Appium is that you shouldn’t have to change you ...

  4. github for unity

  5. git使用笔记(四)错误报告 Git push rejected error: fatal: refusing to merge unrelated histories

    Reason: The reason is because I created repo in Github with initiated README.md file, and I tried to ...

  6. BZOJ 2002 Bounce 弹飞绵羊 —— 分块算法

    题目链接:https://vjudge.net/problem/HYSBZ-2002 2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Li ...

  7. Struts2 拦截器配置及使用

    在我的项目中有个需求,实现记录用户操作的系统日志,基于这个功能我首先想到的是Struts 的拦截器.配置一个全部Action都会拦截的拦截,写一个公用的服务.每当用户发送请求到Action 就记录相应 ...

  8. {{badmatch, {error, eexist}}

    今天在编译cowboy工程在resolve release build时提示编译错误:{{badmatch, {error, eexist}} 后经调查可能是因为rebar的bug导致的,可是删除_b ...

  9. hdu-5673 Robot(默次金数)

    题目链接: Robot Time Limit: 12000/6000 MS (Java/Others)  Memory Limit: 65536/65536 K (Java/Others) 问题描述 ...

  10. Linux GCC常用命令学习

    1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...