- 浏览: 834936 次
文章分类
- 全部博客 (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 18899官方WIKI:https://github.com/Fast ... -
Ehcache 整合Spring 使用页面、对象缓存
2012-11-02 19:56 1021Ehcache在很多项目中都出现过,用法也比较简 ... -
Spring 3.1 M1 中的缓存功能
2012-11-02 19:26 796本文转自:http://www.oschina.net/ ... -
深入剖析Spring Web源码(八) - 处理器映射,处理器适配器以及处理器的实现 - 基于简单控制器流程的实现
2012-10-31 13:37 12101.1.1.1 ... -
spring mvc重复提交拦截器方法
2012-10-31 11:37 8960import javax.servlet.http.HttpS ... -
不重复配置——利用Spring通用化配置
2012-10-17 09:40 944还记得 如下这种配置吗: 1、struts2作用域 ... -
Ehcache 整合Spring 使用页面、对象缓存
2012-10-16 09:44 751Ehcache在很多项目中都出现过,用法也比较简单。一般的 ... -
SpringMVC文件上传 多文件
2012-10-15 17:27 7034必须明确告诉DispatcherServlet如何处理Mult ... -
Spring MVC 3.1新特性 生产者、消费者请求限定
2012-10-12 11:50 11026.6.5、生产者、消费者限定 6.6.5.1、基本概念 ... -
spring + mybatis 多数据源切换
2012-10-10 11:42 1522[代码] DbContextHold ... -
spring MVC 文件上传
2012-10-06 10:03 2020spring支持在网络应用程序处理文件上传,提供拔插的org. ... -
JasperReport与spring集成的三种方式
2012-09-26 17:29 1780最近要用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 947spring 3.1中有cache了,下 ... -
Spring MVC和Struts2的区别
2012-09-08 08:59 10021. 机制:spring mvc的入口是servlet,而st ... -
SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结
2012-06-19 17:34 1344一 开发环境 1、动态web工程 2、部分依赖 ... -
用spring MVC 生成Excel和PDF
2012-06-16 19:16 35891 用spring MVC 生成Excel和PDF http ... -
SpringMVC+FreeMarker实现半自动静态化
2012-06-14 13:53 2464感谢imyourgod的原贴http://to ... -
文件下载(只需要简单的四步),Java中都通用
2012-06-15 08:33 1190Javadownload文件下载Spring ...
相关推荐
org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar
主要介绍了SpringMVC源码解读之HandlerMapping 的相关资料,需要的朋友可以参考下
主要介绍了SpringMVC源码解读之 HandlerMapping - AbstractDetectingUrlHandlerMapping系列初始化的相关资料,需要的朋友可以参考下
NULL 博文链接:https://yihuawuye1.iteye.com/blog/2104547
2、 DispatcherServlet把请求转交给HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器对象、多个HandlerInterceptor拦截器)对象.(后面会学习到拦截器) 3、 ...
8.3 关联spring源代码87 8.4 小结89 第9章 创建Spring MVC之器90 9.1 整体结构介绍90 9.2 HttpServletBean93 9.3 FrameworkServlet95 9.4 DispatcherServlet100 9.5 小结107 第10章 Spring MVC之用108 10.1...
主要介绍了SpringMVC源码解读之HandlerMapping - AbstractUrlHandlerMapping系列request分发 的相关资料,需要的朋友可以参考下
spring 一、配置阶段 1、web.xml DispatcherServlet 由Spring提供的 2、init-param classpath:application.xml contextConfigLoation 3、url-pattern /* 二、初始化、启动阶段 1、init 加载spring的配置文件 2、IOC...
闲来无事,手写Spring的mini版本 1.0, 目前只有几个核心功能, @Controller,@RequestMapping,@RequestParam,HandlerMapping,DispatchServlet等.但是从前端发起URL请求到后台可以处理结果并且返回, 实现了...
Spring MVC 内置了 Requestmapping、HandlerMapping 和 ViewResolver 等组件,可以简化开发流程。MyBatis 作为持久层框架,负责处理数据库操作。 在安全性方面,该网站采用了 SSL 证书进行加密传输,并实现了用户...
Spring SpringMVC 简单整合(初学者参考) demo项目对应地址说明 :https://blog.csdn.net/tianyu00/article/details/89186404 SpringMVC流程 1、 用户发送请求至前端控制器DispatcherServlet。 2、 ...
5)Spring MVC处理流程 a.首先客户端发出spring mvc请求,请求到达DispatcherServlet主控制器处理(前端控制器) b.主控制器调用HandlerMapping组件,根据请求不同调用Controller处理器 c.主控制器调用Controller方法...
第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...
第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 ...
Spring MVC是Spring框架的一个模块,专注于构建Web应用程序。作为架构师和Java开发者,深入理解Spring MVC的原理和实践应用是非常重要的。本文通过分析Spring MVC的核心组件和执行流程,提供了一个全面的学习指南。 ...
org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,handlerMapping,handlerAdapter]; parent: org....
Spring MVC 内置了 Requestmapping、HandlerMapping 和 ViewResolver 等组件,可以简化开发流程。MyBatis 作为持久层框架,负责处理数据库操作。 在安全性方面,该教务管理系统采用了 SSL 证书进行加密传输,并实现...
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3.DispatcherServlet请请求提交到目标Controller 4.Controller进行业务逻辑处理后,会返回一个ModelAndView 5.Dispathcher查询一个...
本文的目的是使用300行代码实现Spring MVC 核心原理,读取配置文件,实现自己的ioc容器,实现依赖注入,再根据注解和对应的方法实例化HandlerMapping,更重要的是为之后的源码的阅读提供一个大概的轮廓.
Spring MVC运行流程,分七个步骤,1.DispatcherServlet 2.HandlerMapping