运行原理图
组件介绍
①DispatcherServlet(前端/核心控制器)
整个流程控制的核心,调用其他组件处理用户的请求,降低了组件之间的耦合性
MVC模式:一个WEB应用中,只有唯一的一个控制器和客户端交互,所有的客户端和服务器单点接触,这个控制器称为核心控制器(前端控制器)。
传统定义中,核心控制器使用Servlet实现。
MVC优势:单点接触,有效的解耦,实现功能的重用。
②HandlerMapping(处理映射器)
复责根据用户请求找到Handler(处理器,如用户自定义的Control),SpringMVC提供了不同的映射器实现不同的映射方式:
配置文件方式、实现接口方式、注解方式
映射器内部封装了一个类似map的数据结构,使用URL作为key,HandleExecutionChain作为value。
必不可少的组件,无论是否配置,SpringMVC默认提供:
由<mvc:annotation-driven>配置时,默认映射器为RequestMappingHandleMapping
若无该标签,且用注解开发,默认映射器为RequestMappingHandleMapping(老版本有其他的,过时了)
③HandlerAdapter(适配器)
通过HandleAdapter对处理器(Handler)进行执行,适配器的应用,通过扩展适配器可以对更多类型的处理器进行执行
最基础的适配器:SimpleControllerHandlerAdapter,处理自定义控制器(继承Control)和SpringMVC控制器顶级接口Controller之间关联的
必不可少的组件,无论是否配置,SpringMVC默认提供:
由<mvc:annotation-driven/>配置,适配器对象为HttpRequestHandlerAdapter
④Handler(后端控制器)
在DispatchServlet的控制下Handler对具体的用户请求进行处理
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务请求开发Handler
对Handler无强制要求,SpringMVC对Handler的引用定义类型为Object
理论不是必要的核心组件,
Ps:Spring是一个线程不安全的,轻量级的框架,一个Handler对象需处理所有请求,需注意线程安全问题。
该组件是DispatchServlet通过HandlerMapping通过getBean获取到,并进行缓存,即只有一个Handler(单例)
一般在Handler所对应的类中只定义只读服务提供属性,或静态final变量,或通过ThreadLocal
⑤ViewResolver(视图解析器)
负责将处理结果(MAV,ModelAndView)生成View视图,
首先根据逻辑视图名解析成物理视图名(即加前/后缀),然后对View进行渲染将处理结果通过页面展示给用户
必要的组件之一,SpringMVC默认提供:
InternalResourceViewResolver,内部资源视图解析器
视图解析器是用于处理动态逻辑视图的,静态视图逻辑不通过SpringMVC流程,直接通过WEB中间件(如Tomcat,静态资源配置)访问
运行流程
发送请求------->DisptcherServlet------->HandlerMapping------->HandlerAdapter-------->Controller-------->ViewResolver-------->响应请求
如果在web.xml中设置DispatcherServlet的<url-pattern>为/
(表拦截器)时,当用户发起请求,请求一个控制器,首先会执行DispatcherServlet,由DispatcherServlet调用HandlerMapping的DefaultAnnotationHandlerMapping解析URL,解析后调用HandlerAdapter组件的AnnotationMethodHandlerAdapter调用Controller中的HandlerMethod,当HandlerMethod执行完成后会返回View,它会被ViewResolver进行视图解析,解析后调用jsp对应的.class文件并运行,最终把运行的.class文件的结果响应给客户端。