SpringMVC原理总结

忘是亡心i 2024-04-17 05:43 79阅读 0赞

SpringMVC原理

1.SpringMVC请求(要学好SpringMVC就要理解SpringMVC请求过程)

在这里插入图片描述

图1.1 SpringMVC请求过程 从图中可知,DispatcherServlet是核心,这里的DispatcherServlet就是一个Servlet,相当于一个看门员,所有的请求都得经过他转发。

  1. 请求达到DispatcherServlet
  2. DispatcherServlet解析Url中的mapping(mapping就是Controller上RequestMapping注解上的值),就交给处理器映射
  3. 处理器映射帮我们找到合适的Controller(Controller本质是一个注解,Spring容器会有一个类来分析这个注解,然后根据这个注解类构造出真正的Servlet,所以说Controller也可以说是Servlet),这个Controller就来处理我们的url信息了,一般处理相关的业务逻辑Controller肯定是委托给Service了
  4. 当Service处理完后会产生信息,这些信息就放在model上,然后Controller返回一个视图名(在视图上可以通过model访问这些产生的信息)
  5. DispatcherServlet收到model和视图名不会自己去处理(简便自己的工作),而是委托给ViewResolver(视图解析器),他会帮我们把视图名匹配成一个视图
  6. 最终就形成了视图文件
  7. 把这个视图响应给客户端

2.SpringMVC搭建过程

SpringMVC搭建的关键点就是创建DispatcherServlet和ContextLoaderListener
其实这两个类都是由一个初始化器创建的,这个类是AbstractAnnotationConfigDispatcherServletInitializer,我们来看看这个类

  1. //继承AbstractDispatcherServletInitializer
  2. public abstract class AbstractAnnotationConfigDispatcherServletInitializer extends AbstractDispatcherServletInitializer
  3. //继承AbstractContextLoaderInitializer
  4. public abstract class AbstractDispatcherServletInitializer extends AbstractContextLoaderInitializer
  5. //继承WebApplicationInitializer
  6. public abstract class AbstractContextLoaderInitializer implements WebApplicationInitializer

从代码的继承关系可以看出类AbstractAnnotationConfigDispatcherServletInitializer最终要实现WebApplicationInitializer的方法,我们来看看WebApplicationInitializer这个接口:

  1. public interface WebApplicationInitializer {
  2. void onStartup(ServletContext var1) throws ServletException;
  3. }

从代码可知这个接口只有一个方法onStartup,其实这个方法就是用来初始化DispatcherServlet和ContextLoaderListener,AbstractDispatcherServletInitializer 初始化DispatcherServlet,而AbstractContextLoaderInitializer初始化ContextLoaderListener,但在初始化的过程中我们需要把各种bean在容器中初始化吧,所以初始化DispatcherServlet的时,需要把注解为@EnableWebMvc的配置类中的bean初始化(这些bean都是用来处理MVC的),方法如下:

  1. Class<?>[] configClasses = this.getServletConfigClasses();
  2. AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
  3. 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类来实现罢了

发表评论

表情:
评论列表 (有 0 条评论,79人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springmvc原理

    今天面试碰到一个特别恶心的公司面试官。是一个金融公司,过去后告诉我2点上班,带我去见经理。经理找人面试,看起来没有hr,经理直接看简历招人。经理上来就问我是xxx大学的,我说是

    相关 SpringMVC原理

    一、spring有两大核心 1、 第一大核心,ioc(inversion of control)控制反转 让一个对象的产生不用再依靠代码new,而是通过java 反射技术动

    相关 springMVC原理

        springMVC和struts都是非常有名气的web层框架,今天便来说一下springMVC的原理,由于本人能力有限,错误的地方,还请读者不吝指出。    spr

    相关 SpringMvc原理

    原理概述: ![这里写图片描述][70] 1. SpringMvc把所有的请求都提交给DispatchServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工