SpringMVC请求流程
请求执行过程(时序图)
- 项目启动,Tomcat启动,加载应用的web.xml文件;
- 实例化并初始化Servlet();
- 加载springMVC.xml配置文件创建spring容器,根据配置初始化容器中的对象;
- 加载完毕之后,浏览器发送请求,比如"/hello";
- 请求到达前端控制器;
- 截取请求的动作名称“hello",并从@RequestMapping中找;
- 找到之后,执行控制器中的方法;
- 方法有返回值,根据返回值通过InternalResourceViewResolver找到响应结果;
- 响应浏览器,展示结果;
SpringMVC执行原理
执行过程如下:
(1) 用户发送request请求,该请求被前端控制器(DispatcherServlet
)处理;
(2) 前端控制器(DispatcherServlet
)请求处理器映射器(HandlerMapping
)查找Handler;
(3) 处理器映射器(HandlerMapping
)根据配置查找相关的Handler,返回给前端控制器(DispatcherServlet
);
(4) 前端控制器(DispatcherServlet
)请求处理器适配器(HandlerAdapter
)执行相应的Handler(或称为Controller);
(5) 处理器适配器(HandlerAdapter
)执行Handler;
(6) Handler执行完毕之后会返回ModelAndView对象给处理器适配器(HandlerAdapter
);
(7) 处理器适配器(HandlerAdapter
)对象接收到Handler返回的ModelAndView对象后,将其返回给前端控制器(DispatcherServlet
);
(8) 前端控制器(DispatcherServlet
)接收到ModelAndView对象后,请求视图解析器(ViewResolver
)对视图进行解析;
(9) 视图解析器(ViewResolver
)根据View信息匹配相应的视图结果后,返回给前端控制器(DispatcherServlet
);
(10)前端控制器(DispatcherServlet
)收到View视图后,对视图进行渲染,将Model中的模型数据填充到View视图中的request域,生成最终的视图;
(11) 前端控制器(DispatcherServlet
)返回请求结果给用户。
名词解析
1、DispatcherServlet表示前端控制器,是整个SpringMVC的控制中心。相当于MVC中的C,由它来调用其他组件处理用户的请求,DispacherServlet的存在降低了组件之间的耦合性;当用户发送请求时,DispatcherServlet接受请求并拦截请求。
假设请求的url为:http://localhost:8080/springmvc/hello
其中hello表示控制器,即请求服务器localhost:8080
上springmvc站点的hello请求;
2、HandlerMapping处理器映射器,DispacherServlet调用HandlerMapping,HandlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等;
3、HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上面url被查找的控制器就是hello;
HandlerExecution将解析后的信息传递给DispacherServlet,如解析控制器映射等;
4、Handler处理器,即自定义的Controller处理单元。它就是我们开发中要编写的具体业务控制器,由DispatcherServlet把用户请求转发到Handler,由Handler对用户的请求进行处理;
5、HandlerAdapter表示处理器适配器,通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,会按照特定的规则取执行Handler;
Handler让具体的Controller执行,Controller会将具体的执行信息返回给HandlerAdapter,例如ModelAndView;
然后HandlerAdapter将试图逻辑名或者模型传递给DispatcherServlet;
6、ViewResolver视图解析器,DispatcherServlet调用ViewResolver(视图解析器)来解析HandlerAdapter传递的逻辑视图名,View Resolver负责将处理结果生成View试图,View Resolver首先根据逻辑视图名接续成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染,将处理结果通过页面展示给用户。
相关知识
中心控制器
Spring的Web框架围绕DispatcherServlet设计。DispatcherServlet的作用是将请求发送到不同的处理器,从Spring2.5开始,使用Java 5 或者以上版本的用户可以基于注解的controller声明方式。SpringMVC框架像许多其他MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其他功能,DispacterServlet是一个实际的Servlet(它继承自HttpServlet基类);
处理器的配置
在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器被称为SpringMVC的三大组件。
- RequestMappingHandlerMapping 处理器映射器
处理@RequestMapping注解,并且将其注册到请求映射表中。 - RequestMappingHandlerAdapter 处理器适配器
处理请求的适配器,确定调用哪个类的哪个方法,并且构造方法参数,返回值。
使用<mvc:annotation-driven/>
自动加载RequestMappingHandlerMapping(处理器映射器)和RequestMappingHandlerAdapter(处理器适配器),可以在springmvc.xml配置文件中使用<mvc:annotation-driven/>
来代替注解映射器和适配器的配置。
<!--配置处理器映射器-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
<!--配置处理器适配器-->
<!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->
<!--一个注解替换上面的两个配置-->
<!--<mvc:annotation-driven>会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean-->
<mvc:annotation-driven/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" ></property>
<property name="suffix" value=".jsp" ></property>
</bean>
持续更新,如果错误,欢迎大家指出,共同学习…