博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC 处理器执行链 (HandlerMapping)的执行过程
阅读量:6461 次
发布时间:2019-06-23

本文共 3098 字,大约阅读时间需要 10 分钟。

第一步:在web.xml中找到DispatcherServlet,然后ctrl+鼠标左键进入这个类中

第二步:ctrl+f找一个叫doDispatch的方法

//入参进来一个requestprotected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {        HttpServletRequest processedRequest = request;       处理器执行链        HandlerExecutionChain mappedHandler = null;       多部分请求 解析器  (文件上传)        boolean multipartRequestParsed = false;        WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);        try {            try {           模型(数据)和视图                ModelAndView err = null;        异常                Exception dispatchException = null;                try {           //指的是 DispatcherServlet 的实例  看看请求是不是多部分请求            
表单有文件域 上传文件了 processedRequest = this.checkMultipart(request); multipartRequestParsed = processedRequest != request;                          mappedHandler = this.getHandler(processedRequest);

第三步:ctrl+鼠标左键进入getHandler方法中

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {        handlerMappings单列集合 。Set   List          Iterator var2 = this.handlerMappings.iterator();        HandlerExecutionChain handler;            if(!var2.hasNext())    return null;           每next()拿到一个HandlerMapping实例            HandlerMapping hm = (HandlerMapping)var2.next();            handler = hm.getHandler(request);           return handler;    }

第四步:接着ctrl+鼠标左键找getHandler方法,我们找到的是一个接口,然后ctrl+h找接口的实现类 AbstractHandlerMapping(抽象类)

public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {        Object handler = this.getHandlerInternal(request);        if(handler == null) {            handler = this.getDefaultHandler();        }        if(handler == null) {            return null;        } else {            if(handler instanceof String) {                String handlerName = (String)handler;  //  /hello                handler = this.getApplicationContext().getBean(handlerName);            }            return this.getHandlerExecutionChain(handler, request);        }    }

第五步:找getHandlerExecutionChain方法

protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {        HandlerExecutionChain chain = handler instanceof HandlerExecutionChain?(HandlerExecutionChain)handler:new HandlerExecutionChain(handler);        String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);        Iterator var5 = this.adaptedInterceptors.iterator();        while(var5.hasNext()) {            HandlerInterceptor interceptor = (HandlerInterceptor)var5.next();            if(interceptor instanceof MappedInterceptor) {                MappedInterceptor mappedInterceptor = (MappedInterceptor)interceptor;                if(mappedInterceptor.matches(lookupPath, this.pathMatcher)) {                    chain.addInterceptor(mappedInterceptor.getInterceptor());                }            } else {                chain.addInterceptor(interceptor);            }        }        return chain;    }

 

转载于:https://www.cnblogs.com/my-123/p/8617391.html

你可能感兴趣的文章
Linux操作系统实时性分析
查看>>
mysql导出导入所有数据库
查看>>
完美解决NC502手工sql的查询引擎排序及合计问题
查看>>
PHP+MySQL代码部署在Linux(Ubuntu)上注意事项
查看>>
Tiny语言执行环境TM机源码
查看>>
PE文件之资源讲解
查看>>
windows 7/mac编译cocos2d-x-3.2*的android工程报错
查看>>
MYSQL导入导出.sql文件(转)
查看>>
使用Elasticsearch、Logstash、Kibana与Redis(作为缓冲区)对Nginx日志进行收集(转)
查看>>
git review报错一例
查看>>
Tomcat在Linux上的安装与配置
查看>>
《信息安全系统设计基础》 课程教学
查看>>
Linux平台下使用rman进行oracle数据库迁移
查看>>
全栈工程师学习Linux技术的忠告
查看>>
iOS自定制tabbar与系统的tabbar冲突,造成第一次点击各个item图片更换选中,第二次选中部分item图片不改变...
查看>>
C# Dictionary用法总结
查看>>
SVN服务器使用(二)
查看>>
反射获取内部类以及调用内部类方法
查看>>
C语言 - pthread
查看>>
谈Linq To Sql的优劣--纯个人观点
查看>>