标题：mvc
简介
MVC全名是Model View Controller，是模型(model)－视图(view)－控制器(controller)的缩写，一种软件设计典范，用于组织代码用一种业务逻辑和数据显示分离的方法，这个方法的假设前提是如果业务逻辑被聚集到一个部件里面，而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑，MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。[1]　
MVC开始是存在于Desktop程序中的，M是指数据模型，V是指用户界面，C则是控制器，使用MVC的目的是将M和V的实现代码分离，从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步，一旦M改变，V应该同步更新。[2-3]
模型－视图－控制器（MVC）是Xerox PARC在二十世纪八十年代为编程语言Smalltalk－80发明的一种软件设计模式，已被广泛使用。后来被推荐为Oracle旗下Sun公司Java EE平台的设计模式，并且受到越来越多的使用 ColdFusion 和 PHP 的开发者的欢迎。模型－视图－控制器模式是一个有用的工具箱，它有很多好处，但也有一些缺点。[4]
设计模式
MVC是一个设计模式，它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件：模型、视图、控制器。它们各自处理自己的任务。[5]​
视图
视图是用户看到并与之交互的界面。对老式的Web应用程序来说  MVC模式图[6]，视图就是由HTML元素组成的界面，在新式的Web应用程序中，HTML依旧在视图中扮演着重要的角色，但一些新的技术已层出不穷，它们包括Adobe Flash和象XHTML，XML/XSL，WML等一些标识语言和Web services. 
MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生，不管这些数据是联机存储的还是一个雇员列表，作为视图来讲，它只是作为一种输出数据并允许用户操纵的方式。　
模型
模型表示企业数据和业务规则。在MVC的三个部件中，模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库，被模型返回的数据是中立的，就是说模型与数据格式无关，这样一个模型能为多个视图提供数据，由于应用于模型的代码只需写一次就可以被多个视图重用，所以减少了代码的重复性。　
控制器
控制器接受用户的输入并调用模型和视图去完成用户的需求，所以当单击Web页面中的超链接和发送HTML表单时，控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求，然后再确定用哪个视图来显示返回的数据。[7]​
设计模式
表现层（Presentation layer）
包含表示代码、用户交互GUI、数据验证。该层用于向客户端  设计模式图[8]用户提供GUI交互，它允许用户在显示系统中输入和编辑数据，同时系统提供数据验证功能。 
业务逻辑层（Business layer）
包含业务规则处理代码，即程序中与业务 相关专业算法、业务政策等等。该层用于执行业务流程和制订数据的业务规则。业务逻辑层主要面向业务应用，为表示层提供业务服务。 
数据持久层（Persistence layer）
包含数据处理代码和数据存储代码。数据持久层主要包括数据存取服务，负责与数据库管理系统（如数据库）之间的通信。 三个层次的每一层在处理程序上有各自明确的任务，在功能实现上有清晰的区分， 各层与其余层分离，但各层之间存有通信接口。 [9]​
框架类别
Struts在 Struts 中，已经由一个  Struts 体系结构[10]名为 ActionServlet 的 Servlet充当控制器(Controller)的角色，根据描述模型、视图、控制器对应关系的 struts-config.xml 的配置文件，转发视图(View)的请求，组装响应数据模型（Model）。在 MVC 的 模型（Model）部分，经常划分为两个主要子系统（系统的内部数据状态与改变数据状态的逻辑动作），这两个概念子系统分别具体对应 Struts 里的 ActionForm 与 Action 两个需要继承实现超类。在这里，Struts 可以与各种标准的数据访问技术结合在一起，包括Enterprise Java Beans（EJB）,JDBC 与 JNDI。在 Struts 的视图（View） 端，除了使用标准的JavaServer Pages（JSP）以外，还提供了大量的标签库使用，同时也可以与其他表现层组件技术（产品）进行整合，比如 Velocity Templates，XSLT等。通过应用 Struts 的框架，最终用户可以把大部分的关注点放在自己的业务逻辑（Action）与 映射关系的配置文件（struts-config.xml）中。[11]　WebWorkWebWork是建立在称为XWork的  Webwork模式图[12]Command模式框架之上的强大的基于Web的MVC框架。
WebWork的特性包括：
1. 灵活的Validation框架：允许在XML文件中定义验证内容，在运行时通过Interceptor自动应用，因此完全脱离Action类。新版支持客户端验证。
2. Type conversion：允许在类之间很容易转换对象。
3. OGNL(Object Graphical Navigation Language)表达式语言：允许动态对象图表遍历和方法执行，使用ValueStack透明访问多Beans的属性。WW2也具有使用JSTL的能力。
4.IoC(Inversion of Control)容器：管理组件的生命周期，使客户获得组件实例不需要创建注册类（与容器环境无关）。
5. FreeMarker Templates：使UI组件可重用，从而允许开发者容易定制Web页面的look & feel。
6. Interceptors：在Actions处理的前后动态拦截，以简单化Action代码，增加减少代码的机会。
7. 支持I18N。
8. 容易和第三方软件集成，包括Hibernate, Spring, Pico, Sitemesh等。
9. 支持多种视图技术，如JSP，Velocity，FreeMarker，JasperReports，XML等。
10. 支持Packages和Namespaces，来管理Actions。　[13-14]​SpringSpring框架提供了一个全面的规划和配置现代化的基  Spring高层架构图[15]于Java的企业应用模型 - 对任何种类的部署平台。spring的一个关键因素是在应用程序级的基建支持重点企业应用的“管道”，使团队能够专注于应用程序级的业务逻辑，没有特定的部署环境中的不必要的关系。
spring包括：
XML和基于注解的配置风格灵活的依赖注入
先进的面向方面编程的支持与基于代理和基于AspectJ的变种
支持声明性事务，缓存的声明，声明确认，声明格式
与常见的Java EE规范，如JDBC，JPA JTA和JMS工作的强大抽象
一流的支持，共同开源框架如Hibernate和石英
一个灵活的网络框架构建RESTful MVC应用程序和服务端点
单元测试，集成测试以及丰富的测试设施。[16]​JSF这个是一个规范，Sun的和Apache的都有各自的实现。用户量很大，被众多IDE支持，JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。它提供了一种以组件为中心来开发 Java Web 用户界面的方法，从而简化了开发。JavaServer Faces 还引起了广大 Java/Web 开发人员的兴趣。“企业开发人员”和 Web 设计人员将发现 JSF 开发可以简单到只需将用户界面 (UI) 组件拖放到页面上，而“系统开发人员”将发现丰富而强健的JSF API为他们提供了无与伦比的功能和编程灵活性。JSF 还通过将良好构建的模型-视图-控制器 (MVC) 设计模式集成到它的体系结构中，确保了应用程序具有更高的可维护性。最后，由于 JSF 是通过 Java Community Process (JCP) 开发的一种 Java 标准，因此开发工具供应商完全能够为 JavaServer Faces 提供易于使用的、高效的可视化开发环境。[17-18]​Tapestry最彻底的MVC开发框架，丰富的组件资源，重用性很高。组件扮演着控制器Controller的角色，是模式层（Model） 中pure-domain objects和包含有组件的HTML模板之间的媒介。大多数情况下，这种方式应用于页面（页面也 是 Tapestry组件），但是在某些情况中，一个组件拥有自己的模板，包含着更多的组件，并且支持与使用者的互交。页面通过配置一系列属性表达式（Property expressions）连接模式层和表现层。属性表达式使用另外一种开源框架OGNL（Object Graph Navigation Language）。OGNL的开源工程（project）独立于Tapestry，但是在Tapestry中起很重要的作用。OGNL主要的目的在于读取和更新对象的Java Bean属性。[19]​ASP.NETASPNETMVC在现有的ASP.NET 3.5运行时的基础上提供了一个新的MVC框架。开发人员可以用MVC设计模式来构建Web应用，做到清晰的概念分离（UI或者视图与业务应用逻辑分离， 应用逻辑和后端数据分离），同时还可以使用测试驱动开发。ASP.NET MVC框架为Web应用的目录结构定义了一个专用的模式，还提供了一个controller基类，用来处理发动到“action”的请求。开发人员还可以 用上这个版本中所特有的Visual Studio 2008MVC模板，利用模板所提供的单元测试结构来辅助Web应用开发。
要让一个懂 ASP.NET 的人主动学习 ASP.NET MVC还真的不是一件容易的事，毕竟这两者之间还是有一些鸿沟的，而且还要放弃掉一些曾经拥有(可能还是引以为豪)的知识，例如：服务端控件 (Server Control)开发。但是让一个懂 Java 或 PHP/Ruby的人进入 ASP.NET MVC 的世界应该是比进入Webform的世界容易多了 。[20]​
优缺点
优点耦合性低
视图层和业务层分离，这样就允许更改视图层代码而不用重新编译模型和控制器代码，同样，一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离，所以很容易改变应用程序的数据层和业务规则。
模型是自包含的，并且与控制器和视图相分离，所以很容易改变应用程序的数据层和业务规则。如果把数据库从MySQL移植到Oracle，或者改变基于RDBMS数据源到LDAP，只需改变模型即可。一旦正确的实现了模型，不管数据来自数据库或是LDAP服务器，视图将会正确的显示它们。由于运用MVC的应用程序的三个部件是相互独立，改变其中一个不会影响其它两个，所以依据这种设计思想能构造良好的松耦合的构件。
重用性高
随着技术的不断进步，现在需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码，因为多个视图能共享一个模型，它包括任何WEB（HTTP）浏览器或者无线浏览器（wap），比如，用户可以通过电脑也可通过手机来订购某样产品，虽然订购的方式不一样，但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化，所以同样的构件能被不同的界面使用。例如，很多数据可能用HTML来表示，但是也有可能用WAP来表示，而这些表示所需要的命令是改变视图层的实现方式，而控制层和模型层无需做任何改变。由于已经将数据和业务规则从表示层分开，所以可以最大化的重用代码了。模型也有状态管理和数据持久性处理的功能，例如，基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。　
生命周期成本低
MVC使开发和维护用户接口的技术含量降低。　
部署快
使用MVC模式使开发时间得到相当大的缩减，它使程序员（Java开发人员）集中精力于业务逻辑，界面程序员（HTML和JSP开发人员）集中精力于表现形式上。　
可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。　
有利软件工程化管理
由于不同的层各司其职，每一层不同的应用具有某些相同的特征，有利于通过工程化、工具化管理程序代码。控制器也提供了一个好处，就是可以使用控制器来联接不同的模型和视图去完成用户的需求，这样控制器可以为构造应用程序提供强有力的手段。给定一些可重用的模型和视图，控制器可以根据用户的需求选择模型进行处理，然后选择视图将处理结果显示给用户。[21-22]​缺点没有明确的定义
完全理解MVC并不是很容易。使用MVC需要精心的计划，由于它的内部原理比较复杂，所以需要花费一些时间去思考。同时由于模型和视图要严格的分离，这样也给调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
不适合小型，中等规模的应用程序
花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。
增加系统结构和实现的复杂性
对于简单的界面，严格遵循MVC，使模型、视图与控制器分离，会增加结构的复杂性，并可能产生过多的更新操作，降低运行效率。 
视图与控制器间的过于紧密的连接
视图与控制器是相互分离，但却是联系紧密的部件，视图没有控制器的存在，其应用是很有限的，反之亦然，这样就妨碍了他们的独立重用。 
视图对模型数据的低效率访问
依据模型操作接口的不同，视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问，也将损害操作性能。 
一般高级的界面工具或构造器不支持模式
改造这些工具以适应MVC需要和建立分离的部件的代价是很高的，会造成MVC使用的困难。 [21-22]​