SpringMVC
什么是MVC模式?
在了解SpringMVC的工作原理之前,我们先来复习一下什么是MVC的设计模式。方便后面更能理解工作原理的架构。
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码。
举个例子,我们原本的JSP是将视图和业务写在了一起,后端和前端都要在一个页面上面进行代码的编写,实在是不方便。而使用了MVC的模式之后,我们将视图和业务分割开来了,实现了前后端分离。
MVC主要的是由三部分组成:
- Model(模型)表示应用程序核心(比如数据库记录列表)。是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
- View(视图)显示数据(数据库记录)。是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
- Controller(控制器)是应用程序中处理用户交互的部分。是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
同样的,类似于该模式的还有我们的前端的MVVM模式,用于数据的双向绑定。
MVC模式的优缺点?
在上面了解MVC模式之后,我们继续看看MVC模式有哪些优缺点?
优点(也是MVC解决的问题)
(1)极大程度解耦。在MVC模式中,三个层各司其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
(2)分工明确。MVC模式按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层,对业务熟悉的开发人员可以开发业务层,而其他开发人员可开发控制层。
(3)提高了代码的复用性。分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。
缺点
(1)增加了系统结构和实现的复杂性。对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
(2)视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
(3)视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
(4)目前,一般高级的界面工具或构造器不支持MVC模式。改造这些工具以适应MVC需要和建立分离的部件的代价是很高的,从而造成使用MVC的困难。
SpringMVC的工作原理
重要组件
前端控制器(DispatcherServlet)
由我们框架提供的一个组件,相当于是SpringMVC的入口函数。用于接收前端的HTTP请求,然后经过后台业务处理之后响应结果,相当于转发器,中央处理器。有了这个组件之后可以减少其他组件之间的耦合度,因为用户请求到达前端控制器,它就相当于mvc模式中的c,是整个流程控制的中心,由它调用其他组件处理用户的请求。
处理映射器(HandlerMapping)
根据请求的url查找Handler。HandlerMapping负责根据用户请求找到Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
处理适配器(HandlerAdapter)
按照特定规则(HandlerAdapter要求的规则)去执行Handler 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
处理器Handler(Controller控制器)
编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。 由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
视图解析器(View Resolver)
进行视图解析,根据逻辑视图名解析成真正的视图(view) View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 SpringMVC框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。 一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。
视图View
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
工作流程
具体的工作流程如图:
(1)首先呢我们的客户端发起了一个Request请求,请求到我们的前端控制器DispatcherServlet。
(2)DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler。然后返回给我们的前端控制器。
(3)我们的前端控制器将解析的Handler请求Handler的适配器进行处理。
(4)HandlerAdapter会根据Handler来调用真正的处理器开始处理请求,也就是执行我们的Controller,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个ModelAndView对象给我们的前端控制器,Model是返回的数据对象,View是个逻辑上的View。
(6)前端控制器会将View交给我们的View Resolver,视图解析器根据逻辑View查找实际的View。
(7)前端控制器将返回的Model传给View进行视图渲染,并最后Response响应给请求者(浏览器)。
参考资料
关于优缺点参考自百度,很杂没有具体来源
工作原理参考自《JavaGuide》