- MVC(Model-View-Controller)模式,即模型-视图-控制器模式
- MVC1和MVC2模式
- JSP+JavaBean+Servlet实现MVC
一:MVC(Model-View-Controller)模式
MVC模式把交互系统的组成分解成模型(Model)、视图(View)、控制器(Controller)三种部件。它强制性地使应用程序的输入、处理和输出分开
模型(Model)部分:是软件所处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象,封装了问题的核心数据、逻辑和功能的计算关系,它独立于具体的界面表达和I/O操作。
视图(View)部分:是表示模型数据及逻辑关系和状态的信息及特定形式展示给用户。它从模型获得显示信息,对于相同的信息可以有多个不同的显示形式或视图。
控制器(Controller)部分:是用来处理用户与软件的交互操作的,其职责是控制提供模型中任何变化的传播,确保用户界面于模型间的对应联系;它接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。通常一个视图具有一个控制器
二:MVC1和MVC2模式
MVC模式在具体的应用中,又分为MVC1和MVC2模式
(1)MVC1模式
- View接受用户输入,并传递到Controller;
- Controller统一进行处理命令,交由Model处理具体的业务;
- 经过处理Model更新后,通知View进行更新
这种模式主要用于桌面程序,使用观察者模式实现,具体来说就是让View观察Model,而用户交互控制的地方用匿名类的方式统一放在Controller中。像MFC的frame-document-view架构,如果document改变了,它会主动通知View进行update
但是在WEB应用程序中,Model(在Java中通常是JavaBean)的数据更新后,无法通知View进行更新(View在Java中通常是非常多JSP页面,需要选择一个),因此,在WEB应用程序中应该使用下面这种模式:MVC2模式
(2)MVC2模式
View接受用户输入,并传递到Controller。 Controller统一进行处理命令,交由model处理具体的业务。 经过处理的Model更新后,Controller会选一个View并把Model内容传递(request、session)给它(forward)。然后View进行显示。 分析上述两个图,知MVC1和MVC2模式的主要差别就是Model是否能主动通知View。
桌面程序可以实现,所以选择MVC1模式;Web程序由于Http协议的限制无法实现;所以选择MVC2模式。 模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制
三:JSP+JavaBean+Servlet实现MVC
所有的操作都会调用service这个接口,然后调用javaBean操作数据库。要想实现MVC,最重要的是Web资源包装器RequestDispatcher,由它解决输出和跳转的问题,它将javaBean的处理结果交给JSP(java Server Page),JSP将根据javaBean的指示将内容输出。Servlet负责将所有的一次性显示的内容交给JSP完成,那么最合适的属性作用域就是request作用域,因为选择属性作用域优先级从大到小分别是:page(pageContext)、request、session、application
用户通过提交Requests与Controller组件(通常表现为Servlets)交互。接着Controller组件实例化Model组件(通常 表现为JavaBeans或者类似技术),并且根据应用的逻辑操纵它们。一旦Model被创建,Controller决定下一个为用户显示的View(常常表现为JSP),同时View从Controller获得Model并为用户显示相关数据
MVC模式中各组件具体职责如下:
1.JavaBean(Model)的职责
- 封装数据——值JavaBean
- 封装业务——工具JavaBean
2.Servlet(Controller)的职责
- 控制流程,接受请求参数,调用JavaBean,获取结果数据,并将数据存储在某个作用域范围之中,最后选择页面显示
3.JSP(View)的职责
- 获取Servlet存储在某个作用域之中的数据,进行显示
四:开发步骤(不是绝对的,只是作一个参考)
MVC模式开发主要步骤:
步骤一:开发JavaBean来表示数据和业务;
步骤二:通过Servlet处理请求,读取请求参数;
步骤三:Servlet调用JavaBean,实现业务逻辑,获取结果数据;
步骤四:Servlet调用请求、会话等对象的setAttribute方法,将结果数据存储在某个作用域范围之中;
步骤五:Servlet选择合适的JSP页面,通过RequestDispatcher的forward方法跳转至该页面;
步骤六:JSP页面获取Servlet存储的结果数据,进行展示。
以上步骤没有包含JSP页面开发,步骤中的操作并非绝对化。比如:【步骤5】中的跳转方法,Servlet跳转至JSP的最常用方法是RequestDispatcher.forward,有时也用到response.sendRedirect,两种方法有所区别