1. MVC
1.1 什么是MVC
MVC(Model View Controller):模型 - 视图 - 控制器,是一种软件设计规范,说明不是设计模式。
本质:将业务逻辑 , 数据 , 界面显示 分离的方式来编写代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。 前后端分离。
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
- Model(模型)-- 表示应用程序核心,是应用程序中用于处理应用程序数据逻辑的部分。代表一个存取数据的对象或 JAVA POJO。
- View(视图)-- 显示数据,代表模型包含的数据的可视化。
- Controller(控制器)-- 控制器作用于模型和视图上,是应用程序中处理用户交互的部分。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。相当于一个调度员。
MVC 模式同时提供了对 HTML、CSS 和 JavaScript 的完全控制。
MVC 分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC 分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。
最典型的MVC就是:JSP + servlet + javabean 的模式。
JSP(View) + servlet(Controller) + javabean(Model)
1.2 MVC编程模式
Model1
在早期的Web开发中,使用Model1模式。
只有两层:视图层和模型层。
优点:架构简单,适合小型项目开发;
缺点:JSP职责不单一 , 承受它不该承受的压力,不便于维护;
Model2
将项目分为三个模块:M:模型 V:视图 C :控制器
职责分析:
-
controller:
- 取得表单的数据
- 调用业务的逻辑方法
- 转向指定的页面
-
Model:
- Dao:操作数据库
- Service:业务逻辑
- 保存数据的更新状态
- pojo
-
View:
- 显示页面
优点:
Model2优化了Model1时代的缺点,让所有层职责更加分明;降低了维护难度,
常见框架:
-
Struct1、Struct2 :
基于struts构架的web应用程序基本上符合JSP Model2的设计标准。Struts有其自己的控制器(Controller),同时整合了其他的一些技术去实现模型层(Model)和视图层(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB,JDBC和Object Relation Bridge。在视图层,Struts能够与JSP, Velocity Templates,XSL等等这些表示层组件相结合。
但是Struts某些技术特性上已经落后于新兴的MVC框架。面对Spring MVC、Webwork2这些设计更精密,扩展性更强的框架,Struts受到了前所未有的挑战。
-
SpringMVC:
Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。Spring使使用基本的JavaBeans来完成以前只可能由EJB完成的事情变得可能了。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
简单来说,Spring是一个轻量的控制反转和面向切面的容器框架。
2. SpringMVC
2.1 什么是SpringMVC
SpringMVC 是 Spring框架的一个模块,是基于Java实现的MVC的轻量级Web框架。
SpringMVC 是一个基于MVC的web框架,因此也称为 Spring Web MVC。
Spring的MVC框架是围绕一个 DispatcherServlet
来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。处理器是你的应用中注解了 @Controller
和@RequestMapping
的类和方法,Spring为处理器方法提供了极其多样灵活的配置。Spring 3.0以后提供了 @Controller 注解机制、 @PathVariable 注解以及一些其他的特性,你可以使用它们来进行RESTful web站点和应用的开发。
2.2 SpringMVC的特性
-
清晰的角色划分:控制器(controller)、验证器(validator)、 命令对象(command object)、表单对象(form object)、模型对象(model object)、 Servlet分发器(DispatcherServlet)、 处理器映射(handler mapping)、视图解析器(view resolver)等等。 每一个角色都可以由一个专门的对象(类)来实现。< Bean>
-
强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,而且支持跨多个context 的引用。
-
可适配、非侵入:可以根据不同的应用场景,选择合适的控制器子类 (simple型、command型、form型、wizard型、multi-action型或者自定义),而不是从单一控制器 (比如Action/ActionForm)继承。
-
可重用的业务代码:可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
-
可定制的绑定(binding) 和验证(validation):比如将类型不匹配作为应用级的验证错误, 这可以保存错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象, 需要手动解析它并转换到业务对象。
-
可定制的handler mapping和view resolution:Spring提供从最简单的URL映射, 到复杂的、专用的定制策略。与某些web MVC框架强制开发人员使用单一特定技术相比,Spring显得更加灵活。
-
灵活的model转换:在Springweb框架中,使用基于Map的 键/值对来达到轻易地与各种视图技术的集成。
-
可定制的本地化和主题(theme)解析:支持在JSP中可选择地使用Spring标签库、支持JSTL、支持Velocity(不需要额外的中间层)等等。
-
简单而强大的JSP标签库(Spring Tag Library):支持包括诸如数据绑定和主题(theme) 之类的许多功能。它提供在标记方面的最大灵活性。
-
JSP表单标签库:在Spring2.0中引入的表单标签库,使得在JSP中编写 表单更加容易。
-
Spring Bean的生命周期可以被限制在当前的HTTP Request或者HTTP Session。 准确的说,这并非Spring MVC框架本身特性,而应归属于Sping MVC使用的WebApplicationContext容器。
2.3 DispatcherServlet
Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器( DispatcherServlet
)能做的比这更多。它与Spring IoC容器做到了无缝集成,这意味着,Spring提供的任何特性,在Spring MVC中都可以使用。
下图展示了Spring Web MVC的 DispatcherServlet
处理请求的工作流。你会发现, DispatcherServlet
应用的其实就是一个”前端控制器“的设计模式。
2.4 SpringMVC框架
步骤:
-
发起请求到前端控制器(DispatcherServlet)。
-
前端控制器请求HandelMapping查找Handler。
可以根据xml配置、注解进行查找。
-
处理器映射器(HandelMapping)向前端控制器返回Handler。
-
前端处理器调用处理器适配器(HandlerAdaptor)去执行Handler。
-
处理器适配器去执行Handler。
-
Hander处理器执行完给适配器返回model and view
-
处理器适配器向前端返回model and view。
model and view是SpringMVC框架的一个底层对象,包括model和view。
-
前端控制器请求视图解析器去进行视图解析。
根据逻辑视图名解析成真正的视图(jsp)。
-
视图解析器向前端控制器返回view。
-
前端控制器进行视图渲染。
视图渲染将模型数据(在Model and View对象中)填充到request域。
-
前端控制器向用户响应结果。
组件:
-
前端控制器 DispatcherServlet
接收请求、响应结果,相当于转发器。中央处理器
有了DispatcherServlet减少了其他组件之间的耦合度。
-
处理器映射器 HandelMapping
根据请求的url找到对应的处理器。
-
处理器适配器 HandlerAdaptor
按照特定规则(HandlerAdaptor要求的规则)去执行Hanlder。
-
处理器 Handler
又称Controller
【注意】编写 Handler时按照HandlerAdaptor的要求去做,这样适配器才可以去正确执行 Handler。
需要程序员开发。
-
视图解析器 View resolver
进行视图解析,根据逻辑视图名解析成真正的视图(view)。
-
视图 View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
需要程序员开发jsp。