SpringMVC原理总结
SpringMVC原理
1.SpringMVC请求(要学好SpringMVC就要理解SpringMVC请求过程)
图1.1 SpringMVC请求过程 从图中可知,DispatcherServlet是核心,这里的DispatcherServlet就是一个Servlet,相当于一个看门员,所有的请求都得经过他转发。
- 请求达到DispatcherServlet
- DispatcherServlet解析Url中的mapping(mapping就是Controller上RequestMapping注解上的值),就交给处理器映射
- 处理器映射帮我们找到合适的Controller(Controller本质是一个注解,Spring容器会有一个类来分析这个注解,然后根据这个注解类构造出真正的Servlet,所以说Controller也可以说是Servlet),这个Controller就来处理我们的url信息了,一般处理相关的业务逻辑Controller肯定是委托给Service了
- 当Service处理完后会产生信息,这些信息就放在model上,然后Controller返回一个视图名(在视图上可以通过model访问这些产生的信息)
- DispatcherServlet收到model和视图名不会自己去处理(简便自己的工作),而是委托给ViewResolver(视图解析器),他会帮我们把视图名匹配成一个视图
- 最终就形成了视图文件
- 把这个视图响应给客户端
2.SpringMVC搭建过程
SpringMVC搭建的关键点就是创建DispatcherServlet和ContextLoaderListener
其实这两个类都是由一个初始化器创建的,这个类是AbstractAnnotationConfigDispatcherServletInitializer,我们来看看这个类
//继承AbstractDispatcherServletInitializer
public abstract class AbstractAnnotationConfigDispatcherServletInitializer extends AbstractDispatcherServletInitializer
//继承AbstractContextLoaderInitializer
public abstract class AbstractDispatcherServletInitializer extends AbstractContextLoaderInitializer
//继承WebApplicationInitializer
public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer
从代码的继承关系可以看出类AbstractAnnotationConfigDispatcherServletInitializer最终要实现WebApplicationInitializer的方法,我们来看看WebApplicationInitializer这个接口:
public interface WebApplicationInitializer {
void onStartup(ServletContext var1) throws ServletException;
}
从代码可知这个接口只有一个方法onStartup,其实这个方法就是用来初始化DispatcherServlet和ContextLoaderListener,AbstractDispatcherServletInitializer 初始化DispatcherServlet,而AbstractContextLoaderInitializer初始化ContextLoaderListener,但在初始化的过程中我们需要把各种bean在容器中初始化吧,所以初始化DispatcherServlet的时,需要把注解为@EnableWebMvc的配置类中的bean初始化(这些bean都是用来处理MVC的),方法如下:
Class<?>[] configClasses = this.getServletConfigClasses();
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(configClasses);
先通过getServletConfigClasses方法把配置类加进来,然后用注解类来解析,最终初始化这些bean
同理ContextLoaderListener也是这样初始化普通的bean
从上面初始化DispatherServlet和ContextLoaderListener可知,这两个类都是注册到SevletContext上下文中了,这其实就是相当于在web.xml注册一个servlet和一个listener,然后通过注解类把所有的bean注册进来。
由上分析可知,AbstractAnnotationConfigDispatcherServletInitializer 其实就干了2件事。第一件就是web.xml注册DispatherServlet和ContextLoaderListener;第二件事就是注册所有的bean。
根据上面所学,我们应该可以自己注册servlet、listener、filter组件了,本质上就是实现WebApplicationInitializer 接口的onStartup这个方法,这个方法就是用来注册组件的。这就相当于在web.xml上添加组件一样。
3.SpringMVC Controller
其实controller注解也没啥好讲的,应该是比较简单的一部分,但是Controller有两种形式需要提一下。第一种自然是数据处理完后产生model和return一个视图名,然后让解析器去匹配一个合适的视图。重点是第二种,因为现在前后端流行分开做,所以Controller的作用不是仅仅返回一个视图名,而是作为一个REST API(简单来讲就是前端给我传数据,controller处理完后,把产生的数据以某种格式返回给前端,而不仅是返回一个视图了,经典的格式有json、xml等)
总结:其实SpringMVC就是对经典的MVC的整合,以前的方式是用web.xml注册各种servlet,然后注册各种需要的bean,而SpringMVC是通过java类来实现罢了
还没有评论,来说两句吧...