博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
tomcat url-pattern 源码一看即懂系列
阅读量:6158 次
发布时间:2019-06-21

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

hot3.png

目标位于 org.apache.tomcat.util.http.mapper.Mapper

protectedvoid addWrapper(ContextVersion context, String path,

            Object wrapper, booleanjspWildCard, booleanresourceOnly) {

 

        synchronized (context) {

            if (path.endsWith("/*")) {

                // Wildcard wrapper

//粗略匹配

                String name = path.substring(0, path.length() - 2);

                Wrapper newWrapper = new Wrapper(name, wrapper, jspWildCard,

                        resourceOnly);

                Wrapper[] oldWrappers = context.wildcardWrappers;

                Wrapper[] newWrappers =

                    new Wrapper[oldWrappers.length + 1];

                if (insertMap(oldWrappers, newWrappers, newWrapper)) {

                    context.wildcardWrappers = newWrappers;

                    intslashCount = slashCount(newWrapper.name);

                    if (slashCount > context.nesting) {

                        context.nesting = slashCount;

                    }

                }

            } elseif (path.startsWith("*.")) {

                // Extension wrapper

//扩展名匹配

                String name = path.substring(2);

                Wrapper newWrapper = new Wrapper(name, wrapper, jspWildCard,

                        resourceOnly);

                Wrapper[] oldWrappers = context.extensionWrappers;

                Wrapper[] newWrappers =

                    new Wrapper[oldWrappers.length + 1];

                if (insertMap(oldWrappers, newWrappers, newWrapper)) {

                    context.extensionWrappers = newWrappers;

                }

            } elseif (path.equals("/")) {

                // Default wrapper

//如果配置为/表示将替换tomcat的默认servlet.用于处理所有请求,包括静态资源,这也就是为什么springmvc在配置为 /  时会需要额外处置静态资源。

                Wrapper newWrapper = new Wrapper("", wrapper, jspWildCard,

                        resourceOnly);

                context.defaultWrapper = newWrapper;

            } else {

                // Exact wrapper

//以上均不满足,那么将会被认定为精确匹配,

                final String name;

                if (path.length() == 0) {

                    // Special case for the Context Rootmapping which is

                    // treated as an exact match

                    name = "/";

                } else {

                    name = path;

                }

                Wrapper newWrapper = new Wrapper(name, wrapper, jspWildCard,

                        resourceOnly);

                Wrapper[] oldWrappers = context.exactWrappers;

                Wrapper[] newWrappers =

                    new Wrapper[oldWrappers.length + 1];

                if (insertMap(oldWrappers, newWrappers, newWrapper)) {

                    context.exactWrappers = newWrappers;

                }

            }

        }

    }

没有什么比源码更容易让人理解内部细节。

转载于:https://my.oschina.net/hollowj/blog/729228

你可能感兴趣的文章
给PowerShell脚本传递参数
查看>>
实战2——Hadoop的日志分析
查看>>
利用FIFO进行文件拷贝一例
查看>>
Ecshop安装过程中的的问题:cls_image::gd_version()和不支持JPEG
查看>>
resmgr:cpu quantum等待事件
查看>>
一个屌丝程序猿的人生(六十六)
查看>>
Java 编码 UTF-8
查看>>
SpringMVC实战(注解)
查看>>
关于静态属性和静态函数
查看>>
进程的基本属性:进程ID、父进程ID、进程组ID、会话和控制终端
查看>>
spring+jotm+ibatis+mysql实现JTA分布式事务
查看>>
MyBatis启动:MapperStatement创建
查看>>
调查问卷相关
查看>>
eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态
查看>>
1. Git-2.12.0-64-bit .exe下载
查看>>
怎样关闭“粘滞键”?
查看>>
[转]React 教程
查看>>
拓扑排序介绍
查看>>
eclipse打开工作空间(workspace)没有任务反应
查看>>
使用Sybmol模块来构建神经网络
查看>>