springmvc源码分析

详解SpringMVC请求的时候是如何找到正确的Controller

吃可爱长大的小学妹 提交于 2020-01-12 04:43:16
我们使用浏览器通过地址 http://ip:port/contextPath/path进行访问,SpringMVC是如何得知用户到底是访问哪个Controller中的方法,这期间到底发生了什么。 本文将分析SpringMVC是如何处理请求与Controller之间的映射关系的,让读者知道这个过程中到底发生了什么事情。 在分析源码之前,我们先了解一下几个东西。 1.这个过程中重要的接口和类。 HandlerMethod类:   Spring3.1版本之后引入的。 是一个封装了方法参数、方法注解,方法返回值等众多元素的类。      它的子类InvocableHandlerMethod有两个重要的属性WebDataBinderFactory和HandlerMethodArgumentResolverComposite, 很明显是对请求进行处理的。   InvocableHandlerMethod的子类ServletInvocableHandlerMethod有个重要的属性HandlerMethodReturnValueHandlerComposite,很明显是对响应进行处理的。   ServletInvocableHandlerMethod这个类在HandlerAdapter对每个请求处理过程中,都会实例化一个出来(上面提到的属性由HandlerAdapter进行设置)

从源码角度了解SpringMVC的执行流程

戏子无情 提交于 2020-01-11 18:53:35
目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMVC的执行流程   SpringMVC的执行流程网上有很多帖子都有讲解,流程图和文字描述都很详细,但是你如果没有通过具体源码自己走一遍流程,其实只是死记硬背。所以想开个帖子从源码角度再梳理一遍SpringMVC的执行流程,加深印象。 SpringMVC介绍   SpringMVC采用的是 前端控制器(Front Controller) + 各个业务处理器(Controller)来处理请求的。前端控制器来响应所有请求,通过一定的调度规则找到具体负责处理的业务处理器,并将请求委派给具体的业务处理器去执行业务逻辑,业务处理器返回给前端控制器模型数据model,最后前端控制器将model交给视图View进行渲染。 源码分析思路   看源码的同学可能往往会陷入一个怪圈,刚开始看可能还能看懂,等到一层一层点进去会越来越晕,让自己陷入了太多的细节中,而这些细节其实对主要流程并没有多大影响,然后就埋头研究。之后不得不又从头开始看,又让自己陷入了另一个细节。其实看源码开始时只是需要看一个大致的框架和思路,了解代码的大致执行流程,千万不要让自己陷入到细节的泥潭中

SpringMVC实例及注解(二)

梦想的初衷 提交于 2020-01-01 22:28:22
@RequestMapping() 除了修饰方法,还可以修饰类 1、类定义处:提供初步的请求映射信息。相对于WEB应用的根目录 2、方法处:提供进一步的细分映射信息。相对于类定义处的URL。若类定义处未标注@RequestMapping,则方法处标记的URL相对于WEB应用的根目录 value:请求的URL method:请求方式(get/post) params:请求参数 也可用params和headers类更加准确的映射请求,params和headers支持简单的表达式 @PacthVariable映射URL绑定的占位符 1、带占位符的URL是spring3.0新增的功能,该功能在springMVC想REST目标挺进发展过程中具有里程碑的意义 2、通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL的{xxx}占位符可以通过@PathVariable{"xxx"}绑定到操作方法的入参中。 @RequesttMapping("/delete/{id}") public String delete(@PathVariable("id") Integer id){ Dao.delete(id); return "delSuccess"; } REST:Representational State Transfer。资源表现层转化

SpringMVC源码(五)- doDispatch - getHandle的准备阶段(@RequestMapping解析注册)

妖精的绣舞 提交于 2019-12-28 02:26:36
目录 一、doDispatch的getHandler 1、RequestMappingHandlerMapping结构 2、setApplicationContext回调函数 3、afterPropertiesSet回调函数 1)、获取可能的类 2)、解析和注册 3)、递归查询所有的方法 4)、将RequestMapping注解修饰的方法以RequestMappingInfo返回 5)、注册调用方法 二、doDispatch的getHandlerAdapter 1、RequestMappingHandlerAdapter 2、HandlerFunctionAdapter 3、HttpRequestHandlerAdapter 4、SimpleControllerHandlerAdapter 5、SimpleServletHandlerAdapter 三、总结 一、doDispatch的getHandler SpringMVC中比较重要的就是doDispatch,而其中第一个比较重要的就是根据HttpServletRequest(当前为RequestFacade类型)获取HandlerExecutionChain(调用的Controller和需要调用的HandlerInterceptor链)。 @Nullable protected HandlerExecutionChain

对Spring 及SpringMVC的理解

自作多情 提交于 2019-12-26 05:46:00
spring 是一个轻型容器(light-weight Container ),其核心是Bean工厂(Bean Factory),用以构造我们所需要的M(Model)。在此基础之上,Spring提供了AOP(Aspect-Oriented Programming, 面向层面的编程)的实现,用它来提供非管理环境下申明方式的事务、安全等服务;对Bean工厂的扩展ApplicationContext更加方便我们实现J2EE的应用;DAO/ORM的实现方便我们进行 数据库 的开发;Web MVC和Spring Web提供了 Java Web应用的框架或与其他流行的Web框架进行集成。 1)开源框架 2)IoC(控制反转),将类的创建和依赖关系写在配置文件里,由配置文件注入,实现了松耦合 3)AOP 将安全,事务等于程序逻辑相对独立的功能抽取出来,利用spring的配置文件将这些功能插进去,实现了按照方面编程,提高了复用性 前言 最近在看Spring MVC的源码,就把自己对MVC模式和对各种框架的实现的认识写出来给大家看看,算是一个总结.所以,恳请大家用怀疑的眼光来看待这篇文章,假如有认识不对的地方,麻烦指出. MVC与WEB应用 MVC是什么就不用我多说了.对于现有较成熟的Model-View-Control(MVC)框架而言,其注意的主要问题无外乎下面这些: Model:

Spring Boot之源码分析篇-SpringMVC视图渲染过程

Deadly 提交于 2019-12-26 02:16:15
Spring Boot之源码分析篇-SpringMVC视图渲染过程 视图渲染过程:从前端到后台 DispatcherServlet入口 DispatcherServlet#Render(ModelAndView,request,response)方法 View#render(model,request,response)方法 ViewResolver视图解析器 AbstractCachingViewResolver#resolveViewName(viewName,locale) ContentNegotiatingViewResolver#resolveViewName(viewName,locale) 从不剑走偏锋,只会贱走源码 spring-boot-version:2.2.0.RELEASE 视图渲染过程:从前端到后台 SpringMVC流程架构图: 按照一般思考的流程,这里直接从DispatcherServlet前端控制器的方法render()开始分析。 DispatcherServlet入口 init():DispatcherServlet 继承FrameworkServlet;而FrameworkServlet继承HttpServletBean,并实现 了ApplicationContextAware接口,HttpServletBean实现init()方法,加载web

SpringMVC源码(二)- DispatcherServlet结构和初始化

喜你入骨 提交于 2019-12-25 13:03:25
目录 1、DispatcherServlet结构 1)、GenericServlet 2)、HttpServlet 3)、HttpServletBean 4)、FrameworkServlet 5)、DispatcherServlet 2、DispatcherServlet初始化(九大件的加载和初始化) 上一篇博客知道,SpringMVC中Spring容器的关系是通过监听方式启动的。那么Spring(或者说SpringMVC)与Servlet的Web容器(如:Tomcat、jetty)的关系则是通过DispatcherServlet进行关联。在Web容器看,DispatcherServlet就是同一普通的Servlet,从Spring看是与Web的关联,会将所有的请求转发到该 控制器 。 1、DispatcherServlet结构 从层级能看出其顶层实现了Servlet和ServletConfig接口,由于Web容器只认识Servlet,而Spring只认识Bean,所以DispatcherServlet既是请求转发和返回视图解析控制中心,更是web与Spring的适配器,从其父子结构层级就能看出,慢慢的从Servlet适配到Bean的过程。 1)、GenericServlet GenericServlet实现了Servlet、ServletConfig接口

SpringMVC框架笔记01_SpringMVC的使用案例和架构组件_SpringMVC和Mybatis整合_接收参数

只谈情不闲聊 提交于 2019-12-22 06:50:09
目录 第1章:SpringMVC简介 1.1 什么是SpringMVC 1.2 SpringMVC的处理流程 第2章:SpringMVC入门程序 2.1 场景描述 2.2 步骤分析 2.3 步骤一:创建Web项目 2.4 步骤二:导入jar包 2.5 步骤三:在 web.xml 中配置DispatcherServlet前端控制器 2.6 步骤四:创建 springmvc.xml 配置文件 2.7 步骤五:新建一个商品POJO 2.8 步骤六:创建一个jsp页面 2.9 步骤七:创建商品的 Controller 2.9.1 传统方式:实现一个 Controller 接口 2.9.2 注解方式:添加一个 @Controller 注解 2.10 把 Controller 配置到 springmvc.xml 中 2.10.1 传统方式:实现一个 Controller 接口的方式的配置 2.10.2 注解方式:添加一个 @Controller 注解 第3章:SpringMVC的完整架构 3.1 框架结构 3.2 架构流程 3.3 组件说明 第4章:SpringMVC和Mybatis整合 4.1 整合的思路 4.2 整合的步骤 4.3 开始整合 4.3.1 创建数据库和表 4.3.2 创建工程 4.3.3 配置文件 4.3.4 持久层 4.3.4 实体类 4.3.5 业务层 4.3.6 表现层

SpringMVC源码分析系列

心不动则不痛 提交于 2019-12-18 15:40:08
说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟悉。 一进Spring的 官网 就发现了这样一排醒目的文字, spring可以让我们构造简单的、便携的、又快又易于扩展的基于jvm的系统和应用程序。 没错,基于Spring的MVC框架SpringMVC同样也可以构造具有这些特性的系统。 楼主从5.1开始写的第一篇《SpringMVC入门》开始,到现在差不多将近2个月的时间,之后陆陆续续写了几篇关于SpringMVC的源码分析文章。 有同学想研究SpringMVC源码或想深入学习一下SpringMVC的话,可以参考本系列文章。 废话不多说,本系列的文章都是基于 Spring4.0.2版本 的,楼主写的时候出到了4.0.2,也是最新的,现在的最新版本是4.0.5。 文章阅读顺序:   1. SpringMVC入门     SpringMVC的入门文章, 对于某些没接触过SpringMVC的同学来说,可以阅读以下,了解这个框架的结构以及使用,以入门的同学可以选择不看~   2. SpringMVC核心分发器DispatcherServlet分析    

SpringMVC源码分析系列

喜你入骨 提交于 2019-12-16 17:16:00
SpringMVC源码分析系列 说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时springmvc基于Spring框架,Spring框架想必搞java的同学都很熟悉。 一进Spring的 官网 就发现了这样一排醒目的文字, spring可以让我们构造简单的、便携的、又快又易于扩展的基于jvm的系统和应用程序。 没错,基于Spring的MVC框架SpringMVC同样也可以构造具有这些特性的系统。 楼主从5.1开始写的第一篇《SpringMVC入门》开始,到现在差不多将近2个月的时间,之后陆陆续续写了几篇关于SpringMVC的源码分析文章。 有同学想研究SpringMVC源码或想深入学习一下SpringMVC的话,可以参考本系列文章。 废话不多说,本系列的文章都是基于Spring4.0.2版本的,楼主写的时候出到了4.0.2,也是最新的,现在的最新版本是4.0.5。 文章阅读顺序:   1. SpringMVC入门     SpringMVC的入门文章, 对于某些没接触过SpringMVC的同学来说,可以阅读以下,了解这个框架的结构以及使用,以入门的同学可以选择不看~   2.