Spring Mvc 源代码之我见 一
spring mvc 是一个web框架,包括controller、model、view 三大块。其中,核心在于model这个模块,用于处理请求的request。
和之前的博客一样,关键的代码,我会标注红色。
入口:DispatcherServlet 。这个类是spring mvc 中的类,如果不是spring mvc的框架,需要添加依赖,才能找到这个类。
先看下doc,看下spring mvc能做什么:
用于HTTP请求处理程序/控制器的中央dispatcher,例如用于web UI控制器或基于HTTP的远程服务导出器。向已注册的处理程序分派处理web请求,提供方便的映射和异常处理工具。这个servlet非常灵活:它可以与任何工作流一起使用,并安装适当的适配器类。它提供了以下功能,使其区别于其他请求驱动的web MVC框架:
1、它基于javabean配置机制
2、可以使用任何的HandlerMapping(匹配器)处理web请求,默认使用的是 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping(基于bean的名字) 和 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping(基于注解)
3、可以使用任意的 Adapter(适配器),默认使用的适配器是 org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter 和 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter。对于spring来说,则是 org.springframework.web.HttpRequestHandler 和 org.springframework.web.servlet.mvc.Controller。默认的注解适配器是:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter。这个会在IOC初始化的时候被注册。
4、dispatcher的异常解析策略可以通过{@link HandlerExceptionResolver}指定,例如将某些异常映射到错误页面。默认的异常处理器是:org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver 、org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver、org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver。可以通过 application context来覆写这个这个异常处理器。
5、视图解析策略可以通过ViewResolver实现指定,将符号视图名称解析为视图对象。默认的视图处理器是:org.springframework.web.servlet.view.InternalResourceViewResolver。ViewResolver(通过类型被测试)可以作为bean添加到application context 中,用来覆盖默认的ViewResolver。如果用户没有提供View或View name,那么配置的 RequestToViewNameTranslator 将把当前请求转换为View name。对应的bean的名称是:viewNameTranslator。处理这个功能的默认的处理器是:org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
6、dispatcher 的解决流文件(文件、视频、音频)的策略是由 org.springframework.web.multipart.MultipartResolver 的实现决定。实现包括了Apache的通用文件上传和Servlet3。典型选择是:org.springframework.web.multipart.commons.CommonsMultipartResolver。这个beanname是:multipartResolver。默认的bean name是none。
7、注意:@RequestMapping 注解只有在dispatcher中存在对应的 HandlerMapping(类型级别的注解) 和 HandlerAdapter 才会生效。如果想使用自定义的@RequestMapping,那么需要确保自定义了对应的HandlderMapping和HandlerAdapter
8、一个Web application 可以自定义人一个DispatcherServlet。每一个servlet 会运行在独立的命名空间中,加载自己的application context、mappings、handlers。只有根application context 被 org.springframework.web.context.ContextLoaderListener 加载,并且被共享(如果有的话)。
9、从spring 3.1.1 开始, DispatcherServle 可以被注入到web application 中
Spring Mvc 源代码之我见 一的更多相关文章
- Spring Mvc 源代码之我见 二
上一篇简单介绍了spring mvc 的一些基本内容 和DispatcherServlet 的doc.这一篇将会继续写我对Spring Mvc 源代码的理解.直接上代码: /** * This imp ...
- springbank 开发日志 阅读spring mvc的源代码真是受益良多
决定模仿spring mvc的dispatcher->handlerMapping(return executorChain)->handler.execute 这样的流程之后,就开始看s ...
- 看透Spring MVC:源代码分析与实践 (Web开发技术丛书)
第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 1 ...
- 【转】Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- Spring MVC中Session的正确用法之我见
Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...
- 深入分析Spring 与 Spring MVC容器
1 Spring MVC WEB配置 Spring Framework本身没有Web功能,Spring MVC使用WebApplicationContext类扩展ApplicationContext, ...
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
做项目时碰到Controller不能使用aop进行拦截,从网上搜索得知:使用spring mvc 启动了两个context:applicationContext 和WebapplicationCont ...
- Spring MVC学习笔记——SiteMesh的使用(转)
转自 SiteMesh的使用 SiteMesh的介绍就不多说了,主要是用来统一页面风格,减少重复编码的. 它定义了一个过滤器,然后把页面都加上统一的头部和底部. 需要先在WEB-INF/lib下引入s ...
- [Java] Maven 建立 Spring MVC 工程
GIT: https://github.com/yangyxd/Maven.SpringMVC.Web 1. 建立 WebApp 工程 下一步: 下一步: 选择 maven-archetype-web ...
随机推荐
- jenkins配置节点服务器
参考博文:https://www.cnblogs.com/derekchen/p/5892286.html 配置的时候,遇到了以下问题,记录一下. 1. 按照教程配置,节点服务器(比如你要部署的测试服 ...
- AHUACM寒假集训VI(网络流)
luoguP2472.蜥蜴 传送门 题目大意: R × C ( 1 ≤ R , C ≤ 20 ) R\times C(1\leq R,C\leq20) R×C(1≤R,C≤20)的网格上,每个格子有一 ...
- 反射、静态代理、动态代理(jdk、cglib)
一.反射 反射在之前的文章中详细的解释过了,简单概括就是:可以动态的获取到一个类内部的所有的信息,动态的去创建对象和使用对象以及可以操作对象的属性和方法. 二.代理 首先解释一下代理:使用一个代理对象 ...
- Python:PIL(二)——相关概念
学习自:PIL官方文档--Concepts 写在最前:PIL只处理栅格(Raster)数据 1.Bands 一幅图像由一个或多个波段的数据组成.PIL允许我们在单幅图像中存储多个波段,前提是它们有相同 ...
- vue项目如何引用jquery
虽然vue不推荐直接操作DOM,而且也提供了操作DOM的方式.但是在某些时候还是要用到jquery,那么如何引入jquery呢? 费了半天劲,记录一下: 一 : 安装jquery npm instal ...
- (八)使用 jmh 压测 Dubbo
1.JMH简介 JMH即Java Microbenchmark Harness,是Java用来做基准测试的一个工具,该工具由OpenJDK提供并维护,测试结果可信度高. 相对于 Jmeter.ab , ...
- C/C++ 大型工程工具链搭建
一.配置环境要求 C/C++ 编译器 此项有系统区别,如果是 Windows 平台,那么可以下载 VS2022 社区版,它自带 MSVC 编译器.如果嫌它太笨重,也可以直接下载 MSVC 再发行组件. ...
- 解决github网站打不开的方法
发现github最近经常抽风,之前发现打不开时就挂个梯子,最近梯子也都被封了,尝试了下改host发现效果挺好,方法如下(Mac电脑): 1.通过站长工具找出DNS地址:进入站长工具网站的域名解析网址: ...
- tensorflow源码解析之common_runtime-executor-上
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- LGP6773题解
阴间状态,出题人是怎么想到的... 为啥lg题解全部都是直接丢状态不说是怎么想的啊.要是以后遇到阴间状态题该怎么想.jpg 首先通过观察,我们可以形象地定义染色:边权为 \(1\) 的边相当于将此边割 ...