- 浏览: 851566 次
文章分类
- 全部博客 (365)
- java (124)
- spring mvc (21)
- spring (22)
- struts2 (6)
- jquery (27)
- javascript (24)
- mybatis/ibatis (8)
- hibernate (7)
- compass (11)
- lucene (26)
- flex (0)
- actionscript (0)
- webservice (8)
- rabbitMQ/Socket (15)
- jsp/freemaker (5)
- 数据库 (27)
- 应用服务器 (21)
- Hadoop (1)
- PowerDesigner (3)
- EJB (0)
- JPA (0)
- PHP (2)
- C# (0)
- .NET (0)
- html (2)
- xml (5)
- android (7)
- flume (1)
- zookeeper (0)
- 证书加密 (2)
- maven (1)
- redis (2)
- cas (11)
最新评论
-
zuxianghuang:
通过pom上传报错 Artifact upload faile ...
nexus上传了jar包.通过maven引用当前jar,不能取得jar的依赖 -
流年末年:
百度网盘的挂了吧???
SSO单点登录系列3:cas-server端配置认证方式实践(数据源+自定义java类认证) -
953434367:
UfgovDBUtil 是什么类
Java发HTTP POST请求(内容为xml格式) -
smilease:
帮大忙了,非常感谢
freemaker自动生成源代码 -
syd505:
十分感谢作者无私的分享,仔细阅读后很多地方得以解惑。
Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
类图:
AbstractHandlerMapping.java : 支持Handler排序、默认的Handler以及Handler拦截器。
1. Handler排序:继承Ordered接口,每一个HanderMapping都有一个优先值(int order),默认的优先值为最大的优先值。
2. 拦截器:支持两种类型的拦截器(HandlerInterceptor和WebRequestInterceptor:二者的区别在于HandlerInterceptor处理的对象是标准的servlet请求和响应,而WebRequestInterceptor处理的对象是spring的WebRequest),所有的拦截器存放在:private HandlerInterceptor[] adaptedInterceptors;中。对于WebRequestInterceptor类型拦截器,通过WebRequestHandlerInterceptorAdapter适配器加入到数组中。
3. 本类getHandler()方法返回的是包含一系列Interceptor的HandlerExecutionChain,不是raw Handler。HandlerExecutionChain包装了raw Handler以及一系列Interceptor。
4. 本类继承WebApplicationObjectSupport是为了通过Bean name取得从spring上下文中取实际的bean(Object handler = getApplicationContext().getBean(handlerName))
AbstractUrlHandlerMapping.java:包含映射Handler到URLS的基础功能。支持直接映射("/test" "/test")和Ant-style映射("/t*""/test" 和 "/team"),对于每个请求会找到其最佳映射(最长匹配)。
1. private Object rootHandler:对应URL为”/”或null
2. private boolean lazyInitHandlers = false:对于单例类型的Handler,可以通过设置其lazy-init和此属性为true(缺一不可),实现lazily initialization。这是因为即使该bean的lazy-init属性设为true,但是在注册Handler时如果lazyInitHandlers为true,也会对该bean进行初始化:
// Eagerly resolve handler if referencing singleton via name.
if (!this.lazyInitHandlers && handler instanceof String) {
String handlerName = (String) handler;
if (getApplicationContext().isSingleton(handlerName)) {
resolvedHandler = getApplicationContext().getBean(handlerName);
}
}
3. Ant-style匹配:
//urlPath对应为request中的请求路径
//handlerMap中保存了所有注册的匹配路径
String bestPathMatch = null;
for (Iterator it = this.handlerMap.keySet().iterator(); it.hasNext();) {
String registeredPath = (String) it.next();
if (getPathMatcher().match(registeredPath, urlPath) &&
(bestPathMatch == null || bestPathMatch.length() < registeredPath.length())) {
//遍历寻找到最长的匹配路径
bestPathMatch = registeredPath;
}
}
4. PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE:本方法会在raw Handler中增加一个拦截器:
HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler);
chain.addInterceptor(new PathExposingHandlerInterceptor(pathWithinMapping));
该拦截器是本方法的一个内部类:功能是在Handler执行前request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
pathWithinMapping的生成策略示例(三个参数依次对就为:注册的url匹配模式、请求的url路径、pathWithinMapping):
• '/docs/cvs/commit.html' and '/docs/cvs/commit.html -> ''
• '/docs/*' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/cvs/*.html' and '/docs/cvs/commit.html -> 'commit.html'
• '/docs/**' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/**\/*.html' and '/docs/cvs/commit.html -> 'cvs/commit.html'
• '/*.html' and '/docs/cvs/commit.html -> 'docs/cvs/commit.html'
• '*.html' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
• '*' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
5. 内部类的使用:本方法中有一个私有内部类:该类的使用条件:只在本方法中使用。
同时该内部类与其包含类之间存在调用关系。
private class PathExposingHandlerInterceptor extends HandlerInterceptorAdapter {
private final String pathWithinMapping;
public PathExposingHandlerInterceptor(String pathWithinMapping) {
this.pathWithinMapping = pathWithinMapping;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//调用其包含类中的方法
exposePathWithinMapping(this.pathWithinMapping, request);
return true;
}
}
AbstractDetectingUrlHandlerMapping.java:在上下文中寻找所有存在URL映射属性的Handler bean:
1. private boolean detectHandlersInAncestorContexts = false:是否需要在其父应用上下文件中寻找Handler bean。
List urls = new ArrayList();
if (beanName.startsWith("/")) {
//bean的名称以”/”开始才会认为其映射到一个URL
urls.add(beanName);
}
String[] aliases = getApplicationContext().getAliases(beanName);
for (int i = 0; i < aliases.length; i++) {
if (aliases[i].startsWith("/")) {
//bean的别名以”/”开始才会认为其映射到一个URL
urls.add(aliases[i]);
}
}
if (!ObjectUtils.isEmpty(urls)) {
// 只有当urls不为空时,我们才会认为这是一个Handler
registerHandler(urls, beanName);
}
AbstractHandlerMapping.java : 支持Handler排序、默认的Handler以及Handler拦截器。
1. Handler排序:继承Ordered接口,每一个HanderMapping都有一个优先值(int order),默认的优先值为最大的优先值。
2. 拦截器:支持两种类型的拦截器(HandlerInterceptor和WebRequestInterceptor:二者的区别在于HandlerInterceptor处理的对象是标准的servlet请求和响应,而WebRequestInterceptor处理的对象是spring的WebRequest),所有的拦截器存放在:private HandlerInterceptor[] adaptedInterceptors;中。对于WebRequestInterceptor类型拦截器,通过WebRequestHandlerInterceptorAdapter适配器加入到数组中。
3. 本类getHandler()方法返回的是包含一系列Interceptor的HandlerExecutionChain,不是raw Handler。HandlerExecutionChain包装了raw Handler以及一系列Interceptor。
4. 本类继承WebApplicationObjectSupport是为了通过Bean name取得从spring上下文中取实际的bean(Object handler = getApplicationContext().getBean(handlerName))
AbstractUrlHandlerMapping.java:包含映射Handler到URLS的基础功能。支持直接映射("/test" "/test")和Ant-style映射("/t*""/test" 和 "/team"),对于每个请求会找到其最佳映射(最长匹配)。
1. private Object rootHandler:对应URL为”/”或null
2. private boolean lazyInitHandlers = false:对于单例类型的Handler,可以通过设置其lazy-init和此属性为true(缺一不可),实现lazily initialization。这是因为即使该bean的lazy-init属性设为true,但是在注册Handler时如果lazyInitHandlers为true,也会对该bean进行初始化:
// Eagerly resolve handler if referencing singleton via name.
if (!this.lazyInitHandlers && handler instanceof String) {
String handlerName = (String) handler;
if (getApplicationContext().isSingleton(handlerName)) {
resolvedHandler = getApplicationContext().getBean(handlerName);
}
}
3. Ant-style匹配:
//urlPath对应为request中的请求路径
//handlerMap中保存了所有注册的匹配路径
String bestPathMatch = null;
for (Iterator it = this.handlerMap.keySet().iterator(); it.hasNext();) {
String registeredPath = (String) it.next();
if (getPathMatcher().match(registeredPath, urlPath) &&
(bestPathMatch == null || bestPathMatch.length() < registeredPath.length())) {
//遍历寻找到最长的匹配路径
bestPathMatch = registeredPath;
}
}
4. PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE:本方法会在raw Handler中增加一个拦截器:
HandlerExecutionChain chain = new HandlerExecutionChain(rawHandler);
chain.addInterceptor(new PathExposingHandlerInterceptor(pathWithinMapping));
该拦截器是本方法的一个内部类:功能是在Handler执行前request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, pathWithinMapping);
pathWithinMapping的生成策略示例(三个参数依次对就为:注册的url匹配模式、请求的url路径、pathWithinMapping):
• '/docs/cvs/commit.html' and '/docs/cvs/commit.html -> ''
• '/docs/*' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/cvs/*.html' and '/docs/cvs/commit.html -> 'commit.html'
• '/docs/**' and '/docs/cvs/commit -> 'cvs/commit'
• '/docs/**\/*.html' and '/docs/cvs/commit.html -> 'cvs/commit.html'
• '/*.html' and '/docs/cvs/commit.html -> 'docs/cvs/commit.html'
• '*.html' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
• '*' and '/docs/cvs/commit.html -> '/docs/cvs/commit.html'
5. 内部类的使用:本方法中有一个私有内部类:该类的使用条件:只在本方法中使用。
同时该内部类与其包含类之间存在调用关系。
private class PathExposingHandlerInterceptor extends HandlerInterceptorAdapter {
private final String pathWithinMapping;
public PathExposingHandlerInterceptor(String pathWithinMapping) {
this.pathWithinMapping = pathWithinMapping;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//调用其包含类中的方法
exposePathWithinMapping(this.pathWithinMapping, request);
return true;
}
}
AbstractDetectingUrlHandlerMapping.java:在上下文中寻找所有存在URL映射属性的Handler bean:
1. private boolean detectHandlersInAncestorContexts = false:是否需要在其父应用上下文件中寻找Handler bean。
List urls = new ArrayList();
if (beanName.startsWith("/")) {
//bean的名称以”/”开始才会认为其映射到一个URL
urls.add(beanName);
}
String[] aliases = getApplicationContext().getAliases(beanName);
for (int i = 0; i < aliases.length; i++) {
if (aliases[i].startsWith("/")) {
//bean的别名以”/”开始才会认为其映射到一个URL
urls.add(aliases[i]);
}
}
if (!ObjectUtils.isEmpty(urls)) {
// 只有当urls不为空时,我们才会认为这是一个Handler
registerHandler(urls, beanName);
}
发表评论
-
jackson annotations注解详解
2015-01-13 11:34 18992官方WIKI:https://github.com/Fast ... -
Ehcache 整合Spring 使用页面、对象缓存
2012-11-02 19:56 1101Ehcache在很多项目中都出现过,用法也比较简 ... -
Spring 3.1 M1 中的缓存功能
2012-11-02 19:26 826本文转自:http://www.oschina.net/ ... -
深入剖析Spring Web源码(八) - 处理器映射,处理器适配器以及处理器的实现 - 基于简单控制器流程的实现
2012-10-31 13:37 13151.1.1.1 ... -
spring mvc重复提交拦截器方法
2012-10-31 11:37 9011import javax.servlet.http.HttpS ... -
不重复配置——利用Spring通用化配置
2012-10-17 09:40 976还记得 如下这种配置吗: 1、struts2作用域 ... -
Ehcache 整合Spring 使用页面、对象缓存
2012-10-16 09:44 784Ehcache在很多项目中都出现过,用法也比较简单。一般的 ... -
SpringMVC文件上传 多文件
2012-10-15 17:27 7082必须明确告诉DispatcherServlet如何处理Mult ... -
Spring MVC 3.1新特性 生产者、消费者请求限定
2012-10-12 11:50 11456.6.5、生产者、消费者限定 6.6.5.1、基本概念 ... -
spring + mybatis 多数据源切换
2012-10-10 11:42 1558[代码] DbContextHold ... -
spring MVC 文件上传
2012-10-06 10:03 2068spring支持在网络应用程序处理文件上传,提供拔插的org. ... -
JasperReport与spring集成的三种方式
2012-09-26 17:29 1855最近要用JasperReport,试着和sprin ... -
Spring MVC+Jasper Report 及生成PDF的中文问题
2012-09-26 17:10 2先说两句报表框架的选择,JasperRepor ... -
Springmvc与jasperreport结合生成报表的一种方法
2012-09-26 16:42 1<script type="text/ja ... -
spring 3.1中的cache小结
2012-09-22 23:27 1010spring 3.1中有cache了,下 ... -
Spring MVC和Struts2的区别
2012-09-08 08:59 10371. 机制:spring mvc的入口是servlet,而st ... -
SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-06-19 17:34 1419一 开发环境 1、动态web工程 2、部分依赖 ... -
用spring MVC 生成Excel和PDF
2012-06-16 19:16 36311 用spring MVC 生成Excel和PDF http ... -
SpringMVC+FreeMarker实现半自动静态化
2012-06-14 13:53 2533感谢imyourgod的原贴http://to ... -
文件下载(只需要简单的四步),Java中都通用
2012-06-15 08:33 1222Javadownload文件下载Spring ...
相关推荐
在阅读Spring源码笔记时,建议结合实际项目经验,逐步理解并实践源码中的关键概念。"查看密码,打开必看.txt"可能是提供解压文件的密码,确保正确解压并阅读PDF文档,以获得完整的知识体系。 总之,Spring源码学习...
本笔记将深入探讨Spring 5的源码,帮助开发者了解其内部工作原理,提升代码质量和开发效率。 1. **依赖注入(Dependency Injection, DI)** Spring的核心特性之一就是依赖注入,它允许对象之间的依赖关系通过配置...
这个资源包含的"spring学习文档及源码笔记"是深入理解并掌握 Spring MVC 的宝贵资料。下面,我们将详细探讨 Spring MVC 的核心概念、工作原理以及如何利用它来构建 Web 应用。 1. **Spring MVC 架构** - **...
对于深入理解 Spring MVC,阅读源码是很有帮助的。你可以查看 DispatcherServlet、HandlerMapping、HandlerAdapter 等关键类的实现,理解它们如何协同工作。 ### 8. 工具支持 在实际开发中,IDEA、Eclipse 等集成...
**Spring MVC 学习笔记** Spring MVC 是 Spring 框架的一个模块,专门用于构建 Web 应用程序。它提供了一种模型-视图-控制器(Model-View-Controller)架构,帮助开发者处理请求、控制应用程序流程,并实现业务逻辑...
标题中的“spring源码学习”指的是对Spring框架的源代码进行深入研究,这通常是Java开发者为了更好地理解Spring的工作原理、优化应用性能或者进行二次开发所进行的活动。Spring是Java领域最广泛使用的轻量级开源框架...
依赖注入是 Spring 的核心概念之一,它允许开发者在运行时将对象依赖关系传递给其他对象,而不是在代码中硬编码这些依赖。这使得应用程序更易于测试,因为每个组件都可以独立地进行单元测试,同时也提高了代码的可...
深入理解 Spring MVC 源码有助于我们更好地掌握其工作原理,例如,`DispatcherServlet` 如何初始化和调度请求,`HandlerMapping` 如何匹配请求到处理器,以及 `ModelAndView` 和 `ViewResolver` 如何协同工作。...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为构建MVC(Model-View-Controller)架构的Web应用...通过阅读和学习提供的PDF和Excel格式的学习笔记,你可以深入了解其工作原理,从而在实际项目中得心应手地使用。
**SpringMVC 笔记** SpringMVC 是 Spring 框架的一个模块,...通过阅读源码,可以加深对框架的理解,同时也能发现优化代码和性能的方法。配合实际项目练习,将理论知识转化为实践经验,是掌握 SpringMVC 的关键步骤。
2. **依赖注入(DI)**:DI是Spring的关键特性之一,允许开发者声明他们依赖的组件,而无需在代码中创建这些组件的实例。Spring会自动将依赖的对象注入到需要它们的地方,降低了组件之间的耦合度。 3. **注解**:...
本篇文章将围绕“Spring Analysis Master”这一主题,深入探讨Spring框架的相关组件及其源码分析。 一、Spring核心模块 1. IoC(Inversion of Control)容器:Spring的核心特性是控制反转,它通过依赖注入...
在本笔记中,我们将深入探讨 Spring MVC 的核心概念、配置、控制器、模型绑定、视图解析以及如何阅读 Spring MVC 的源码。 一、Spring MVC 核心概念 1. DispatcherServlet:作为 Spring MVC 的前端控制器,负责接收...
Spring框架是Java开发中广泛应用的一个轻量级框架,它的核心特性是依赖注入(Dependency Injection,DI),这使得组件之间的耦合度大大降低,提高了代码的可测试性和可维护性。Spring框架提供了大量的功能模块,包括...
**MVC 模式简介** MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序设计的架构模式,它将应用程序分为三个主要组件...通过阅读"MVC-step-by-step"笔记,我们可以系统地学习和掌握Spring MVC的各个方面。
Spring MVC 提供了一种组织应用程序代码的方式,使得开发者可以更高效地处理请求和响应。以下是对 Spring MVC 的详细讲解: 1. **核心组件:DispatcherServlet** - DispatcherServlet 是 Spring MVC 的核心,它...
本文将深入探讨这一过程,从源码层面解析Spring MVC如何定位到相应的Controller。 首先,我们了解Spring MVC的请求处理流程。当一个HTTP请求到达服务器,Spring MVC会通过一系列的处理器映射(HandlerMapping)来...
SpringMVC的配置通常在`web.xml`中配置DispatcherServlet,以及在Spring的配置文件中配置HandlerMapping、ViewResolver等。使用注解驱动可以让配置更简洁。 ### 五、实战应用 在实际开发中,我们通常会结合Spring ...
2. **处理器映射器(HandlerMapping)** - **作用**:根据URL确定调用哪个具体的处理器(Handler),即控制请求的URL到具体处理器的映射。 - **实现方式**:可以通过XML配置或者注解的方式进行配置。 3. **处理器...