SpringMVC加载流程

这节介绍SpringMVC,SpringMVC是一种基于JAVA的实现MVC设计模式的请求驱动类型的轻量级Web框架 。本章会介绍相关概念,流程,再从源码进行讲解 。
1. MVC MVC(Model View Controller)是一种软件设计的框架模式,它采用模型(Model)-视图(View)-控制器(controller)的方法把业务逻辑、数据与界面显示分离 。MVC框架模式是一种复合模式,MVC的三个核心部件分别是

  • Model(模型):所有的用户数据、状态以及程序逻辑,独立于视图和控制器
  • View(视图):呈现模型,类似于Web程序中的界面,视图会从模型中拿到需要展现的状态以及数据,对于相同的数据可以有多种不同的显示形式(视图)
  • Controller(控制器):负责获取用户的输入信息,进行解析并反馈给模型,通常情况下一个视图具有一个控制器
2. SpringMVC流程 基本上大家都会在网上看到这张图:
SpringMVC加载流程

文章插图
 
这个图描述了SpringMVC处理一个Http请求的基本流程,对应的流程为:
  • 用户发送请求至前端控制器DispatcherServlet 。
  • DispatcherServlet收到请求调用HandlerMApping处理器映射器 。
  • 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet 。
  • DispatcherServlet调用HandlerAdapter处理器适配器 。
  • HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器) 。
  • Controller执行完成返回ModelAndView 。
  • HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 。
  • DispatcherServlet将ModelAndView传给ViewReslover视图解析器 。
  • ViewReslover解析后返回具体View.
  • DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中) 。
  • DispatcherServlet响应用户 。
 还有大家都会接触到的demo:
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/applicationContext.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>在applicationContext.xml,指定包的扫描访问并添加标签
<context:component-scan base-package="xxx" /><mvc:annotation-driven />添加Controller
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {@RequestMapping("/hello")public String excute() {return "hello";}}上面表示的意思为:
  • 开启ContextLoaderListener加载Spring根Context,对应的配置文件为applicationContext.xml
  • 开启DispatcherServlet监听/*下的所有请求,加载WebContext,对应的配置文件为dispatcher-servlet.xml
  • 指定扫描包路径,并开启mvc注解支持
  • 添加对应的Controller,使用@RestController标记为Controller对象并使用@RequestMapping标记处理的请求路径
3. SpringMVC加载流程 SpringMVC的加载是依赖Servlet切入的,主要依赖两个技术点:Listener和Servlet 。
3.1. ContextLoaderListener的加载 从web.xml中可以知道,ContextLoaderListener依赖于Servlet的Listener技术 。Listener是在servlet2.3中加入的,主要用于对session、request、context等进行监控 。使用Listener需要实现相应的接口 。触发Listener事件的时候,Tomcat会自动调用相应的Listener的方法 。常用的监听接口包括:
  • HttpSessionListener:监听session的创建和销毁 。
  • ServletRequestListener:监听request的创建和销毁
  • ServletContextListener:监听context的创建和销毁 。
这里主要使用了ServletContextListener,用于在Servlet初始化前执行自定义动作 。
 ContextLoaderListener的定义如下:
public class ContextLoaderListener extends ContextLoader implements ServletContextListener {public ContextLoaderListener() {}public ContextLoaderListener(WebApplicationContext context) {super(context);}@Overridepublic void contextInitialized(ServletContextEvent event) {initWebApplicationContext(event.getServletContext());}@Overridepublic void contextDestroyed(ServletContextEvent event) {closeWebApplicationContext(event.getServletContext());ContextCleanupListener.cleanupAttributes(event.getServletContext());}}


推荐阅读