(五) Tomcat 源码系列之 URI 映射

在地址栏输入的 URI , Tomcat 是如何找到对应的 Servlet 或 JSP (Jsp 就是一个 Servlet) 呢 ?

其实在启动 Tomcat 组件 MapperListener 的时候, 就将对应的映射关系放入了一个 Mapper 中, 它有这几个作用

  1. 映射关系存储:存储所有的 Host,Context 及 Wrapper 的对应关系;
  2. 映射关系初始化及变更:当新增一个组件或者移除一个组件时,Mapper 如何维护 URI 到 Wrapper 的映射关系;
  3. 映射关系使用 :根据 URI,映射到具体的 Host,Context 和 wrapper

Mapper

public final class Mapper {
   
    
    // 存储所有的 Host 
    volatile MappedHost[] hosts = new MappedHost[0];
    ...
    protected abstract static class MapElement<T> {
   

        public final String name;
        public final T object;

        public MapElement(String name, T object) {
   
            this.name = name;
            this.object = object;
        }
    }
    // 这个里面存储的是 MappedContext 数组
    protected static final class ContextList {
   
        public final MappedContext[] contexts;
        ...
    }
    // 带版本号的 Context , 在 URI 请求参数中可以带版本号
    // 一个 MappedContext 对应一个 ContextVersion (通过 path 对应)
    protected static final class ContextVersion extends MapElement<Context> {
   
        // context 的匹配路径
        public final String path;
        public final int slashCount;
        public final WebResourceRoot resources;
        // context 的欢迎页面
        public String[] welcomeResources;
        // 默认的 wrapper
        public MappedWrapper defaultWrapper = null;
        // 精确匹配路径的 wrapper
        public MappedWrapper[] exactWrappers = new MappedWrapper[0];
        // 通配符结尾的 wrapper
        public MappedWrapper[] wildcardWrappers = new MappedWrapper[0];
        // 扩展名匹配的 wrapper
        public MappedWrapper[] extensionWrappers = new MappedWrapper[0];
        public int nesting = 0;
        // 这个context是否还可用,是否被暂停
        private volatile boolean paused;
    }
    // URI 映射的主机
    // 该 Host 下部署的所有 Web 应用, 存放的是 MappedContext 数组
    protected static final class MappedHost extends MapElement<Host> {
   
       public volatile ContextList contextList;
        ...
    }
    // URI 映射的 Context, 也就是一个 Web 应用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值