- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
http://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-oth-JSpec/servlet-3_0-final-spec.pdf
这将在第 12 章:将请求映射到 Servlet 下。我查看了 JBoss 的 Maven 存储库,虽然规范接口(interface)可用,但我似乎无法找到 12.1 和 12.2 关于 servlet url 模式匹配的底层实现。我有兴趣查看表达式如何映射到另一个项目的规则。
最佳答案
我正在考虑 Tomcat 7.0.42。以下答案中的链接指向 grepcode.com 中的 7.0.42 源代码。
servlet 映射在应用程序启动期间被解析并作为 Wrapper
添加到 org.apache.tomcat.util.http.mapper.Mapper#addWrapper()
中其源代码已复制粘贴到此处(注意:术语“包装器”在这里基本上代表“映射的 servlet”):
360 protected void addWrapper(ContextVersion context, String path,
361 Object wrapper, boolean jspWildCard, boolean resourceOnly) {
362
363 synchronized (context) {
364 Wrapper newWrapper = new Wrapper();
365 newWrapper.object = wrapper;
366 newWrapper.jspWildCard = jspWildCard;
367 newWrapper.resourceOnly = resourceOnly;
368 if (path.endsWith("/*")) {
369 // Wildcard wrapper
370 newWrapper.name = path.substring(0, path.length() - 2);
371 Wrapper[] oldWrappers = context.wildcardWrappers;
372 Wrapper[] newWrappers =
373 new Wrapper[oldWrappers.length + 1];
374 if (insertMap(oldWrappers, newWrappers, newWrapper)) {
375 context.wildcardWrappers = newWrappers;
376 int slashCount = slashCount(newWrapper.name);
377 if (slashCount > context.nesting) {
378 context.nesting = slashCount;
379 }
380 }
381 } else if (path.startsWith("*.")) {
382 // Extension wrapper
383 newWrapper.name = path.substring(2);
384 Wrapper[] oldWrappers = context.extensionWrappers;
385 Wrapper[] newWrappers =
386 new Wrapper[oldWrappers.length + 1];
387 if (insertMap(oldWrappers, newWrappers, newWrapper)) {
388 context.extensionWrappers = newWrappers;
389 }
390 } else if (path.equals("/")) {
391 // Default wrapper
392 newWrapper.name = "";
393 context.defaultWrapper = newWrapper;
394 } else {
395 // Exact wrapper
396 if (path.length() == 0) {
397 // Special case for the Context Root mapping which is
398 // treated as an exact match
399 newWrapper.name = "/";
400 } else {
401 newWrapper.name = path;
402 }
403 Wrapper[] oldWrappers = context.exactWrappers;
404 Wrapper[] newWrappers =
405 new Wrapper[oldWrappers.length + 1];
406 if (insertMap(oldWrappers, newWrappers, newWrapper)) {
407 context.exactWrappers = newWrappers;
408 }
409 }
410 }
411 }
在处理传入的 HTTP 请求时,通过映射查找 servlet 的所有魔法都始于 org.apache.catalina.connector.CoyoteAdapter#postParseRequest()
。 .
647 connector.getMapper().map(serverName, decodedURI, version,
648 request.getMappingData());
649 request.setContext((Context) request.getMappingData().context);
650 request.setWrapper((Wrapper) request.getMappingData().wrapper);
第 647 行间接调用 org.apache.tomcat.util.http.mapper.Mapper #internalMapWrapper()
这是当前 HTTP 请求的映射数据被 Context
和 Wrapper
(本质上是一个可用的 servlet 实例)填充的地方。只是代码比较多,这里就不复制粘贴了,直接点击grepcode链接即可。
然后,第 649 行和第 650 行基本上设置了当前请求的映射 Context
和 Wrapper
。 Context
包含具体的 ServletContext
实例,Wrapper
包含具体的 Servlet
实例作为属性,org.apache.catalina.core.Wrapper#instance
.
最后,在调用所有过滤器之后,ApplicationFilterChain
将调用 servlet 的 service()
方法。
对于我自己的项目,OmniFaces JSF utility library ,我曾经在 WebXml
实用程序类(以相当简化的形式)中根据 servlet 规范 12.1 实现了匹配检查。这些可能对您也有帮助,source code is here , 相关摘录如下:
private static boolean isExactMatch(String urlPattern, String url) {
return url.equals(urlPattern.endsWith("/*") ? urlPattern.substring(0, urlPattern.length() - 2) : urlPattern);
}
private static boolean isPrefixMatch(String urlPattern, String url) {
return urlPattern.endsWith("/*") ? url.startsWith(urlPattern.substring(0, urlPattern.length() - 2)) : false;
}
private static boolean isSuffixMatch(String urlPattern, String url) {
return urlPattern.startsWith("*.") ? url.endsWith(urlPattern.substring(1)) : false;
}
关于java - 我在哪里可以找到实现 servlet 规范 12.1 和 12.2 的 JBoss 源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18323598/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!