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 ...
随机推荐
- 做PPT必备的大数据分析网站,好看又免费的报表工具
小明以前是学技术,跳槽来到一家大公司,在这个公司里会经常开会,比如有月度报告.季度报告以及年度报告,在开会前小明了解到同事们都会制作精美的PPT来汇报工作计划和目标,看到同事们精美的PPT里各种好看的 ...
- Apache Ranger 编译安装部署
1. 概述 Apache Ranger是大数据领域的一个集中式安全管理框架,目的是通过制定策略(policies)实现对Hadoop组件的集中式安全管理.用户可以通过Ranger实现对集群中数据的安全 ...
- Pycharm:一直connecting to console的解决办法
方法一: 1.打开Anaconda cmd(也就是Anaconda Prompt,在启动栏Anaconda目录里应该有)2.输入echo %PATH% 获得PATH value3.在PyCharm中, ...
- MySQL:输入密码后闪退的解决方法
原因:MySQL服务没有启动 解决方法:在 "服务" 中启动MySQL
- 矩池云上使用nvidia-smi命令教程
简介 nvidia-smi全称是NVIDIA System Management Interface ,它是一个基于NVIDIA Management Library(NVML)构建的命令行实用工具, ...
- 注册接口(数字字典和api接口)
///////////////////////////////////////资源路由 ///////////////////////////////////////资源控制器 <?phpnam ...
- laravel 7 登录
1:路由,展示登录表单 Route::group(['prefix'=>'day','namespace'=>'day18'],function (){ // 登录 Route::get( ...
- QQ聊天记录快速迁移
QQ聊天记录快速迁移 在工作中大家经常会用到QQ来沟通,但是很多时候在其它设备上登录QQ就无法查看到之前的聊天记录和图片,这是因为电脑上的QQ聊天记录一般都是保存在电脑本地硬盘里,所以我们在换设备登录 ...
- 07 Java的方法 何谓方法
Java的方法 1.何谓方法 System.out.println(); 那么它是什么呢? System是系统的类,out是System下的一个输出对象,println()就是一个方法 类.对象.方法 ...
- CF698C题解
为什么 \(n,k \leq 20\)? 我还以为是什么 \(n,k \leq 10^6\) 的厉害题/qd 看到这个队列操作很迷惑,但是仔细看看要操作 \(10^{100}\) 遍,所以我们可以直接 ...