MVC是一种架构设计模式,是一种设计理念。是为了达到分层设计的目的,从而使代码解耦,便于维护和代码的复用。MVC是3个单词的缩写,全称:Model-View-Controller(模型-视图-控制器)。
Model:
Model在MVC中扮演着功能掌控者的角色,属于底层,它处理业务逻辑和数据模型,例如User selectUser();这个方法和它调用之后返回的Bean都是属于Model的。至于以何种方式把User传递到前台(例如以Bean的方式传递,使用JSP标签进行处理;或者使用Json格式进行传递,在前台使用JS语言进行处理),可以自由选择。
View:
View在MVC中扮演这展示者的角色,属于上层,它展示从底层提取出来的数据(如以表格,图表等方式),在Jsp中是以Jsp标签进行展示,在其它前台框架中是用Json格式进行数据的处理(在Spring中@controller返回的是JavaBean,@RESTcontroller返回的是Json格式的数据)。
Controller:
Controller在MVC中扮演的是路由控制的角色,属于中间层,它处理用户通过前端发送过来的请求(当然其它MV*模式可能不通过Controller直接向Model发送请求),并调用底层中的对应的方法进行数据的请求,然后将数据发送出去。
MVC 主要的框架有 Spring Struts ZF .NET
以SpringMVC为例来解释下MVC在spring的工作流程中如何体现的
springMVC是一个MVC的开源框架,springMVC=struts2+spring,springMVC就相当于是Struts2加上sring的整合,但是这里有一个疑惑就是,springMVC和spring是什么样的关系呢?这个在百度百科上有一个很好的解释:意思是说,springMVC是spring的一个后续产品,其实就是spring在原有基础上,又提供了web应用的MVC模块,可以简单的把springMVC理解为是spring的一个模块(类似AOP,IOC这样的模块),网络上经常会说springMVC和spring无缝集成,其实springMVC就是spring的一个子模块,所以根本不需要同spring进行整合。
这张图中将前端的视图用jsp来代替,Dao是MVC外的另一个层数据持久层,主要进行对数据库的操作。
SpringMVC的工作流程就是
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求处理器映射器(HandlerMappering)去查找处理器(Handle):通过xml配置或者注解进行查找
第三步:找到以后处理器映射器(HandlerMappering)像前端控制器返回执行链(HandlerExecutionChain)
第四步:前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler)
第五步:处理器适配器去执行Handler
第六步:Handler执行完给处理器适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
第八步:前端控制器请求视图解析器(ViewResolver)去进行视图解析
第九步:视图解析器像前端控制器返回View
第十步:前端控制器对视图进行渲染
第十一步:前端控制器向用户响应结果
MVC架构的优缺点
优点:
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。
由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处,就是可以使用控制器来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图,控制器可以根据用户的需求选择模型进行处理,然后选择视图将处理结果显示给用户。
缺点:
改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,会造成MVC使用的困难。