/** * Map the specified URI. */ private final void internalMap(CharChunk host, CharChunk uri, MappingData mappingData) throws Exception { uri.setLimit(-1); Context[] contexts = null; Context context = null; int nesting = 0; // Virtual host mapping if (mappingData.host == null) { Host[] hosts = this.hosts; int pos = findIgnoreCase(hosts, host); if ((pos != -1) && (host.equalsIgnoreCase(hosts[pos].name))) { mappingData.host = hosts[pos].object; contexts = hosts[pos].contextList.contexts; nesting = hosts[pos].contextList.nesting; } else { if (defaultHostName == null) { return; } pos = find(hosts, defaultHostName); if ((pos != -1) && (defaultHostName.equals(hosts[pos].name))) { mappingData.host = hosts[pos].object; contexts = hosts[pos].contextList.contexts; nesting = hosts[pos].contextList.nesting; } else { return; } } } // Context mapping if (mappingData.context == null) { int pos = find(contexts, uri);//L1 if (pos == -1) { return; } int lastSlash = -1; int uriEnd = uri.getEnd(); int length = -1; boolean found = false; while (pos >= 0) { if (uri.startsWith(contexts[pos].name)) { length = contexts[pos].name.length(); if (uri.getLength() == length) { found = true; break; } else if (uri.startsWithIgnoreCase("/", length)) { found = true; break; } } if (lastSlash == -1) { lastSlash = nthSlash(uri, nesting + 1); } else { lastSlash = lastSlash(uri); } uri.setEnd(lastSlash); pos = find(contexts, uri); } uri.setEnd(uriEnd); if (!found) {//L4 if (contexts[0].name.equals("")) { context = contexts[0]; } } else { context = contexts[pos]; } if (context != null) { mappingData.context = context.object; mappingData.contextPath.setString(context.name); } } // Wrapper mapping if ((context != null) && (mappingData.wrapper == null)) { internalMapWrapper(context, uri, mappingData); } }
代码位置:org.apache.tomcat.util.http.mapper.Mapper;
先是根据目标host拿到该host下拥有的所有的context(我们比较关心的ServletContext对象则存放在context中),接下来的过程便是根据internalMap参数二uri(本次Http请求的uri,如http://192.168.1.101:8080/test/a.htm,则uri是"/test/a.htm")去匹配到哪个context(context.name为各web项目的根目录名,此时的匹配目标便是context.name);
L1行方法:
/** * Find a map elemnt given its name in a sorted array of map elements. * This will return the index for the closest inferior or equal item in the * given array. */ private static final int find(MapElement[] map, CharChunk name) { return find(map, name, name.getStart(), name.getEnd());//L2 }
其中参数一map为上文L1行的contexts ,参数二name为L2行的uri
L2行代码:
/** * Find a map elemnt given its name in a sorted array of map elements. * This will return the index for the closest inferior or equal item in the * given array. */ private static final int find(MapElement[] map, CharChunk name, int start, int end) { int a = 0; int b = map.length - 1; // Special cases: -1 and 0 if (b == -1) { return -1; } if (compare(name, start, end, map[0].name) < 0 ) { return -1; } if (b == 0) { return 0; } int i = 0; while (true) { i = (b + a) / 2; int result = compare(name, start, end, map[i].name); if (result == 1) { a = i; } else if (result == 0) { return i; } else { b = i; } if ((b - a) == 1) { int result2 = compare(name, start, end, map[b].name); if (result2 < 0) { return a; } else { return b; } } } }
可以看到这里用了二分查找法,意味着contexts是已经排序过的了,方法返回的目标context(切确的说是可能是目标的context)在数组中索引号,当没有找到时,在L4行可以看出使用的是默认的context,也就是"/"。
相关推荐
在上述代码中,我们通过`InitialContext`查找`jdbc/MyDB`对应的`DataSource`,然后调用`getConnection()`方法获取数据库连接。 **注意事项** 1. 确保Tomcat的`conf/server.xml`文件中`GlobalNamingResources`元素内...
本篇文章将详细介绍如何在Tomcat服务器中配置数据源,并结合JSP技术实现对MySQL数据库的操作。 #### 二、配置Tomcat中的数据源 配置Tomcat的数据源主要涉及以下几个步骤: 1. **修改`server.xml`文件** 在`...
这里的`res-ref-name`应与Context.xml中的`name`属性值相匹配,`res-type`表明引用的是数据源类型,`res-auth`表示由容器(即Tomcat)进行认证。 接下来,在Java代码中,可以通过Java Naming and Directory ...
每个Context负责管理一组Servlet,根据URL路径匹配并调用相应的Servlet进行处理。 5. **Servlet生命周期**:Tomcat会加载并实例化Servlet,调用其init()方法初始化,然后处理请求(service()方法),最后在服务器...
- **8.3** 更改文件匹配规则,将`*.jsp`改为`*`,并将`resin-ln`中的`*.*`改为`*`,以适应Tomcat的URL映射规则。 8. **删除特定库文件**:在`ecoloyg/WEB-INF/lib`目录下,删除可能与Tomcat冲突的库文件,如`rt....
标题中的“gwt和tomcat整合”指的是将Google Web Toolkit (GWT) 应用程序部署到Apache Tomcat服务器的过程。GWT是一个开源的Java框架,用于开发在浏览器上运行的富互联网应用程序(RIA),而Tomcat是一款流行的、开源...
在IT行业中,Tomcat是一个广泛使用的开源Java Servlet容器,它实现了Java EE的Web部分,包括Servlet和JSP规范。在本教程中,我们将探讨如何将Tomcat 5.5的admin应用部署到Tomcat 7.0上。这是一个常见的升级过程,...
<Context docBase="D:\Java\apache-tomcat-9\backstage" path="/backstage/" reloadable="true" /> ``` 这里的关键参数解释如下: - `docBase`:指定Web应用的物理路径。 - `path`:设置虚拟路径,即用户通过浏览器...
当Tomcat接收到一个HTTP请求时,会根据请求的URL查找匹配的Servlet。Servlet的生命周期包括初始化(`init()`方法)、服务(`doGet()`或`doPost()`方法)、销毁(`destroy()`方法)。Tomcat会根据需求加载和卸载...
设置项目属性,确保编译器兼容性与Tomcat版本匹配,并配置好构建路径。 4. **学习与调试** - 通过阅读源码,开发者可以理解Tomcat如何处理HTTP请求,解析URL,管理会话,以及容器内部的线程模型等核心概念。 - ...
- Host查找与URL匹配的Context。 - Context根据Servlet映射找到合适的Servlet,并创建一个Wrapper。 - Wrapper创建Servlet实例(如果尚未创建),然后调用Servlet的service方法处理请求。 3. **Catalina关键类**...
当Tomcat服务器返回的响应头中包含`Access-Control-Allow-Origin`字段,且其值与请求的源匹配时,浏览器才会允许跨域访问。 解决Tomcat的跨域问题有几种方法: 1. **修改web.xml配置**:在Tomcat的每个Web应用的...
这些资源可以在任何Context中被应用使用。 9. **Valves**: Valves是处理请求的中间件,可以进行权限验证、日志记录、URL重写等操作。每个容器(Server、Service、Engine、Host、Context)都可以有自己的Valve链。...
Tomcat遵循最长路径匹配原则处理URL请求,确保请求被正确的Context捕获。 配置虚拟主机则是为了在一个Tomcat实例上托管多个域名的应用。这涉及到修改`conf/server.xml`中的`Host`元素,每个`Host`元素代表一个域名...
Struts2和Tomcat是Java Web开发中两个关键的组件,它们共同构成了Web应用程序的基础架构。Struts2是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于构建企业级的Java Web应用,而Tomcat则是一个...
在IT行业中,Tomcat是一个广泛使用的开源应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨“Tomcat6配置JNDI出错”这一主题,这是一个常见的问题,很多开发者在...
1. **路径问题**:确保在`server.xml`文件中指定的物理路径与实际文件系统中的路径完全一致,包括大小写也要匹配。 2. **权限问题**:检查目标目录的读写权限,确保Tomcat进程有足够的权限访问这些文件。 3. **...
- 对于更复杂的配置,如C3P0或HikariCP等第三方连接池,需要在Tomcat的`conf/context.xml`中配置`<Resource>`标签,并在Web应用的`WEB-INF/web.xml`中声明数据源。第三方连接池提供了更多的性能调优选项,如最小...
- 由于Linux系统对文件路径的大小写敏感性,需要在`ArcGISCacheExtent.js`文件中对路径进行相应调整,以避免因路径不匹配而导致的问题。 3. **Tomcat应用部署** - 进入Tomcat的配置目录`apache-tomcat-8.5.39/...
例如,将`< Context>`标签内的管理员凭据设置为"admin/admin",以便在启动Tomcat时能够正确识别和处理CAS的验证请求。 启动Tomcat服务器时,通常会使用`startup.bat`脚本,这个脚本位于`bin`目录下。运行此脚本会...