Spring MVC 原理 - DispatcherServlet调用完整过程(上)

本篇主要讲解了Spring mvc的调用过程,通过这个过程来了解Spring的原理。

进入web.xml中配置的Spring拦截(调度)器:

 

调用堆栈信息:

开始拦截,这一步主要是根据request获取handler(该handler可以配置):

(接上面方法)这段代码中的if(isGet…主要解决浏览器的缓存问题,如果没有过修改,则返回(浏览器可能会用缓存响应)。

调用方法handler:

进入handler方法:

进入方法invokeHandlerMethod:

440行进入下一个方法invokeHandlerMethod:

进入该方法:

171行进入处理参数的方法:

处理参数的方法,使用参数类型进行for循环:

获取一个参数的注解:

通过下面方法返回注解数组:

其中parameterIndex在创建该对象时赋值,和参数类型的位置是对应的(下图中的i):

获取注解之后,对注解进行遍历,通过判断注解类型来获取paramName或headerName或其他:

在每个if中的defaultValue中,方法parseDefaultValueAttribute用来获取注解的默认值设置:

可以看到系统用了一个不常用的字符串作为默认值,用这个值和传入的value进行比较,使用这个值的目的是尽可能和用户设置的值区分开。

指定类型的注解(if判断里面的),只能存在一个,超过1个会报错:

如果没有注解,则判断类型是否为常用的(request,response,session等):

对于没有注解的参数,可能会执行下面的方法:

进入处理标准类型的方法:

通过上面的方法判断出基本的类型。

回到有注解的情况,针对不同的注解,具体处理过程如下(if顺序没有优先级,因为只有一个注解,一种情况):

到这一步,会根据具体的注解类型执行不同的resolve***()方法。

resolve***的方法最终返回的是类型符合要求(resolve内部有各种类型转换的方法)的参数值。

最后处理完成,返回参数列表:

反射调用方法:

进入用户写的处理方法中:

在用户方法执行完成后,返回:

到这里,主要的方法就执行完了,后面还有对返回结果result的处理,后面的内容不是很多了,由于本篇已经包含了30多张图片,插入图片已经很不方便,所以考虑分成两个部分来说明,并且尽力让这第一部分比较完整。

时间: 2024-10-02 19:27:27

Spring MVC 原理 - DispatcherServlet调用完整过程(上)的相关文章

Spring MVC 原理 - DispatcherServlet调用完整过程(下)

上一篇到440行返回结果result. 返回result之后,使用result去获取ModelAndView,执行方法getModelAndView: 该方法主要通过result返回值来判断: 当前方法是带ResponseBody注解的,所以执行到这里: 进去方法: 这里是根据http类型做出相应的输出: 用户配置的: 接收的类型: 写的方法: 这里配置的json格式,所以会进入JSON方法: 写入ResponseBody后,返回mav: 最后返回之前调用handler的地方,之后会有一些不同种

spring mvc 实现远程服务调用的几种方式

org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter 实现远程服务调用 (1)httpinvoker方式 服务器客户端都是spring时推荐这种方式 服务端 必须要实现 bean实体类  service接口类  serviceImpl服务实现类 客户端只需拷贝 bean 实体类  service接口类(注意 ,客户端 bean,service类要和服务端bean,service类包路径相同,比如都是 com.hlz

一个简单的Spring MVC的例子

一.Spring MVC的优点 1.Spring3 MVC的学习难度小于Struts2,Struts2用不上的多余功能太多.呵呵,当然这不是决定因素. 2.Spring3 MVC很容易就可以写出性能优秀的程序,Struts2要处处小心才可以写出性能优秀的程序(指MVC部分) 3.Spring3 MVC的灵活是你无法想像的,Spring的扩展性有口皆碑,Spring3 MVC当然也不会落后,不会因使用了MVC框架而感到有任何的限制. 二.简单的例子 1.配置web.xml 指除了Control层外

spring mvc

作者:赵磊 博客:http://elf8848.iteye.com   目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.spring mvc 如何访问到静态的文件,如jpg,js,css 八.spring mvc 请求如何映射到具体的Action中的方法 九.spring mvc 

Spring MVC 教程,快速入门,深入分析(转载)

作者:赵磊 博客:http://elf8848.iteye.com 下载: Spring的官方下载网址是:http://www.springsource.org/download    (本文使用是的Spring 3.0.5版本) 目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 六.springMVC-mvc.xml 配置文件片段讲解 七.sp

Spring 2.5:Spring MVC中的新特性

Spring框架从创建伊始就致力于为复杂问题提供强大的.非侵入性的解决方案.Spring 2.0当中为缩减XML配置文件数量引入定制命名空间功能,从此它便深深植根于核心Spring框架(aop.context.jee.jms. lang.tx和util命名空间).Spring Portfolio项目(例如Spring Security)和非Spring项目中(例如CXF). Spring 2.5推出了一整套注解,作为基于XML的配置的替换方案.注解可用于Spring管理对象的自动发现.依赖注入.

Spring MVC中jsessionid所引起的问题 和解决

 转自:http://blog.csdn.net/seakingwy/article/details/1933687 jsessionid所引起的问题 在Spring MVC当使用RedirectView或者"redirect:"前缀来做重定向时,Spring MVC最后会调用:response.sendRedirect(response.encodeRedirectURL(url)); 对于IE来说,打开一个新的浏览器窗口,第一次访问服务器时,encodeRedirectURL(

Spring MVC 基础注解之@RequestMapping、@Controller、(二)

我现在学的是spring4.2 今天主要学习了Spring MVC注解  引入注解可以减少我们的代码量,优化我们的代码. @Controller:用于标识是处理器类: @RequestMapping:请求到处理器功能方法的映射规则: 还是以示例来解释说明   1 创建springAnnotation02项目,导入jar包.    这里的web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app x

Spring系列,第3部分:进入Spring MVC

Spring MVC 框架 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框架.通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术.Velocity.Tiles.iText 和 POI.Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术.Spri