每当我学习一个新技术时,我总是会问自己这个技术有哪些功能,能帮我解决哪些问题。

但是当我在网上进行搜索时,答案并不让我满意。

在使用springmvc很久以后,我将在这篇文章里对springmvc功能进行总结,并以浅白的语言描述springmvc是如何实现这些功能的。

springmvc说起来是一个框架,但是其实翻看源码,功能挺少的。

功能1:发起请求, 找到匹配的方法

在没有springmvc之前,web容器是通过以下这种格式的配置找到请求对应的执行方法。只需要该类实现了HttpServlet接口

<servlet>
<servlet-name>ServletDemo</servlet-name>
<servlet-class>class的全限定名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo</servlet-name>
<url-pattern>/ServletDemo</url-pattern>
</servlet-mapping>

有了springmvc之后,我们所有的请求都进入DispatcherServlet,我们只需要在web.xml中对所有访问路径拦截,让其进入org.springframework.web.servlet.DispatcherServlet类

 <servlet>
<!-- 配置DispatcherServlet -->
  <servlet-name>springMvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指定spring mvc配置文件位置 不指定使用默认情况 -->
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:spring/spring-mvc.xml</param-value>
   </init-param>
  <!-- 设置启动顺序 -->
  <load-on-startup>1</load-on-startup>
  </servlet>
  <!-- ServLet 匹配映射 -->
  <servlet-mapping>
  <servlet-name>springMvc</servlet-name>
   <url-pattern>/*</url-pattern>
  </servlet-mapping>

容器启动时,spring通过扫描包文件的方式,获取所有标志了@controller的类,并对这些类里的方法进行扫描,如果该方法上又有@RequestingMapping,将类上的

@RequestMapping值与@RequestMapping的值拼接起来,形成一个路径作为value值。方法名作为key值,存入map对象。

前台发起请求的时候,就是通过遍历该map,找到请求路径对应的方法。

功能2:方法参数绑定以及类型转换

方法的参数类型有这么几种,基本类型,自定义对象,集合,数组,date。

如果参数类型是基本类型,比如int.double,String,根据前台传来的参数key值和方法参数名进行匹配,就能成功绑定参数。

功能3:实现拦截器

功能4:方法返回的数据解析成xml或者json

功能5:解析视图

springmvc功能以及源码实现分析的更多相关文章

  1. Spring Boot核心技术之Rest映射以及源码的分析

    Spring Boot核心技术之Rest映射以及源码的分析 该博客主要是Rest映射以及源码的分析,主要是思路的学习.SpringBoot版本:2.4.9 环境的搭建 主要分两部分: Index.ht ...

  2. MapReduce的ReduceTask任务的运行源码级分析

    MapReduce的MapTask任务的运行源码级分析 这篇文章好不容易恢复了...谢天谢地...这篇文章讲了MapTask的执行流程.咱们这一节讲解ReduceTask的执行流程.ReduceTas ...

  3. FFmpeg的HEVC解码器源码简单分析:解析器(Parser)部分

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  4. FFmpeg源码简单分析:libswscale的sws_scale()

    ===================================================== FFmpeg的库函数源码分析文章列表: [架构图] FFmpeg源码结构图 - 解码 FFm ...

  5. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  6. DispatcherServlet源码注解分析

    DispatcherServlet的介绍与工作流程 DispatcherServlet是SpringMVC的前端分发控制器,用于处理客户端请求,然后交给对应的handler进行处理,返回对应的模型和视 ...

  7. 【Orleans开胃菜系列2】连接Connect源码简易分析

    [Orleans开胃菜系列2]连接Connect源码简易分析 /** * prism.js Github theme based on GitHub's theme. * @author Sam Cl ...

  8. RxJava && Agera 从源码简要分析基本调用流程(2)

    版权声明:本文由晋中望原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/124 来源:腾云阁 https://www.qclo ...

  9. JUC同步器框架AbstractQueuedSynchronizer源码图文分析

    JUC同步器框架AbstractQueuedSynchronizer源码图文分析 前提 Doug Lea大神在编写JUC(java.util.concurrent)包的时候引入了java.util.c ...

随机推荐

  1. amaze ui 滚动监听

    引入   此框架的css  js    前提还要有jquery http://amazeui.org/javascript/scrollspy 然后看这个链接里的各种动画 运用方法就是  在你想要有动 ...

  2. CentOS 7 下使用yum安装MySQL5.7.20 最简单图文详解

    CentOS7默认数据库是mariadb, 但是 好多用的都是mysql ,但是CentOS7的yum源中默认好像是没有mysql的. 上一篇安装的是5.6的但是我想安装5.7的  yum安装是最简单 ...

  3. Flutter 开发小技巧

    1.命令行运行flutter run之后iOS报错:Could not install build/ios/iphones/Runner.app on XXXXX. try lunching Xcod ...

  4. c++ complie link error 2019/2001

    1:没有将需要的文件添加到项目中,只是考到项目所在的目录了 2:没有添加 类导出 宏

  5. man vxfenadm

    man vxfenadmReformatting page. Please Wait... done VCS 6.0.1 VXFENADM(1M) NAME vxfenadm - Manage SCS ...

  6. react native onEndReached频繁多次调用问题

    今天被这个问题搞得头疼,写一个分页加载,但是listview的onEndReached方法老是被频繁调用,知道加载完所有的分页数据才停止. <ListView automaticallyAdju ...

  7. 什么是C/S模式与B/S模式,两者区别与优缺点

    转自https://wenwen.sogou.com/z/q1709598292.htm C/S (Client/Server,客户机/服务器)模式又称C/S结构,是软件系统体系结构的一种.C/S模式 ...

  8. c# 获取某进程占用的内存(任务管理器显示的内存一致)

    最近写了看门狗的winform程序,需求要求显示监测的进程所占的内存大小 找了好几个方法,都和任务管理器显示的内存不一致 最后找到了一个解决方法 PerformanceCounter pf1 = ne ...

  9. 20155208徐子涵 《网络对抗技术》Web基础

    20155208徐子涵 <网络对抗技术>Web基础 实验要求 Web前端HTML Web前端javascipt Web后端:MySQL基础:正常安装.启动MySQL,建库.创建用户.修改密 ...

  10. day11.2lambda函数表达式 及其返回值注意事项

    lambda表达式 用于表示简单的函数 func1=lambda 参数:一句话函数体(默认返回函数体内执行的内容) 1.1结构 func=lambda a1,a2 : a1+100 val=func( ...