老杨叔叔 2013-03-07
MVC设计模式
本章将详细介绍什么是MVC设计模式。还将介绍MVC设计模式中的几个重要部分,并介绍MVC在JavaWeb开发中的使用。
通过本章的学习,读者应该能够完成如下几个目标。
了解什么是MVC设计模式
了解Model1和Model2的区别以及优缺点
熟练掌握如何定义视图部分
熟练掌握如何定义模型部分
熟练掌握如何定义控制器部分
1MVC简介
MVC设计模式最先是由TrygveReenskaug提出的,并最先成功的应用在SmallTalk-80环境中,使许多交互和界面系统的构成基础。Microsoft的MFC基础类也遵循了MVC的思想。
MVC把交互系统的组成分解成模型、视图、控制器三种部件。
(1)模型部分,它是软件所处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象,封装了问题的核心数据、逻辑和功能的计算关系,它独立于具体的界面表达和I/O操作。
(2)视图部分,它是表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。
(3)控制器部分,它是用来处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。通常一个视图具有一个控制器。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。
MVC设计模式被广泛的用到了许多的程序设计中,本章主要来介绍JavaWeb开发中使用到的MVC设计模式。
2Model1和Model2
首先来看什么是Model1模式。以前面编写的那个登录项目为例,那就是典型的使用Model1模式开发的,整个Web项目都是由JSP页面构成。其中登录判断页LoginConf.jsp既要接受客户端的请求,还必须对其用户信息判断进行跳转。JSP页面既要负责显示还要负责控制,将控制逻辑和表现逻辑混在一起了。
使用Model1模式开发代码重用性非常低,对于功能相似的代码只能选择拷贝的方式,而不是直接调用。这样使得整个JSP页面充斥着功能类似的代码。
使用Model1模式开发程序扩展性也非常差,如果以后想要给程序扩展功能那是非常困难的。假如在一个JSP页面添加了某一功能,那么可能其他的很多页面都需要变动,甚至于整个Web应用都要修改。这种牵一发而动全身的应用,会使得后期异常的困难和繁琐。
JSP页面中大量充斥着Java脚本,这使得后期的维护非常困难。有时候一个地方出现错误就要到处去找。还有代码重用性,经常就是在使用拷贝、粘贴,都成了一种习惯了。不过使用Model1模式来开发比较简单和方便。
使用Model1模式来开发确实简单,所以如果是小型的Web站点,后期的更新和维护工作不是很大,就可以采用Model1模式来开发。
Model2是基于MVC架构的设计模式。MVC包含三个基本部分,分别是Model(模型)、View(视图)、Controller(控制器)。JSP只用负责显示,而控制器则由Servlet充当,模型由JavaBean充当。
Model1的程序流程比较容易理解。用户提交信息给JSP页面,JSP接受用户提交的值并通过JavaBean连接数据库并操作数据库,然后将结果返回给用户。
Model2中就是将JSP的功能简化了,在Model1中JSP负责的东西过多了。Model2中使用Servlet来充当控制器,而JSP只是充当显示。至于为什么会这样设计是因为在JSP里面进行接受参数和判断还有跳转等功能会用到大量的Java脚本代码。过多的Java脚本代码使得页面维护起来非常困难,而Servlet本来就是一个Java文件,这样使用Servlet来接受参数和判断还有跳转等功能是非常合适的。可以把Servlet看成是一个大管家,它负责所有的业务逻辑并通过JavaBean来操作数据库以及决定显示页面。
3使用MVC模式改进用户登录案例
如果要使用MVC设计模式,那么控制器要使用Servlet。具体的逻辑判断则交给业务逻辑组件来判断,而将业务逻辑组件判断的结果返回交给Servlet来判断并实现跳转。
用户登录页面
用户登录成功和失败页面
业务逻辑组件
Servlet控制器