SpringMVC(三)SpringMVC的原理分析

一.Web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>

  <web-app  version="2.5"
          xmlns="http://java.sun.com/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name>Archetype Created Web Application</display-name>
  <!-- 扫描resources目录下的文件-->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/application*.xml</param-value>
  </context-param>
  <!-- 在启动Web 容器时,自动装配 application*.xml 的配置信息-->
  <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>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <!-- 设置SpringMVC配置文件的位置,注意该位置默认是src文件夹下 -->
      <param-value>classpath:spring/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

上一篇文章我们了解到Spring Mvc 中的三个context :

 

第一个上下文指的是ServletContext(Tomcate级别的)

第二个上下文指的的WebApplicationContext(IOC容器的上下文)由ContextLoaderListener创建的

第三个是 DispatcherServlet(SprinMVC级别的上下文)当DispatcherServlet启动的时候,它会创建Spring应用上下文,并加载配置文件或配置类中所声明的bean。

DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射,而ContextLoaderListener要加载 应用中的其他bean。这些bean通常是驱动应用后端的中间层和数据层组件。

 

 

SpringMVC的工作流程应该分为两个部分

第一部分为启动的SpringMVC

启动的时候DispatcherServlet加载包含Web组件的bean,如控制器、视图解析器以及处理器映射

第二部分为Spring MVC接受请求

                                                             DispatcherServlet的继承关系图

 

DispatchServlet本质上是一个Servlet,web容器启动的时候,servlet会初始化。下面是DispatchServlet的初始过程时序图。

总结:

SpringMVC启动的时候会加载dispatcher-servlet.xml启动IOC容器接着会加载SpringMVC的九大组件,其中最为重要的是HanderMapping,HandlerAdapter,

ViewResolver。

HanderMapping:用来保存Controller中配置的RequestMapping和Method的一个对应关系

首先从BeanDefinition(spring保存Bean的数据结构)中获取所有的BeanName,之后通过反射机制获取所以含有Controller注解的类,从中获取所有包含RequestMapping注解的类,获取RequestMapping的类注解+取RequestMapping的方法注解组合成URL,和类信息,方法信息一起保存在ArrayList中。

HandlerAdapters 用来动态匹配Method参数,包括类转换,动态赋值

在初始化阶段,将这些参数的名字或者类型按一定的顺序保存下来,首先获得HanderMapping中数组中保存的Method,把带有RequestParam的命名参数个非命名参数保存在按照参数所在位置保存在map<String, Integer>中,在保存到HandlerAdapterMap<HandlerMapping, HandlerAdapter>中。

ViewResolvers:实现动态模板的解析

 

接受请求时

1.DispatcherServlet就是前端控制器接受请求,

2处理器映射(handler mapping) 处理器映射会根据请求所携带的URL信息来进行决策。(从初始化的list获取与URL匹配的handler)

3控制器(controller) 根据handler获取handlerAdapter,根据用户请求的参数信息,跟method中的参数信息进行动态匹配,通过反射invoke()方法进行调用返回ModelAndView,

4. 返回ModelAndView,

5.视图解析器(view resolver):根据返回的ModelAndView通过视图解析器解析成具体的视图返回结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值