Java 在哪里可以找到实现servlet规范12.1和12.2的JBoss源代码?

Java 在哪里可以找到实现servlet规范12.1和12.2的JBoss源代码?,java,servlets,jboss,servlet-3.0,Java,Servlets,Jboss,Servlet 3.0,这将在第12章:将请求映射到servlet中。我查看了JBoss的Maven存储库,尽管spec接口可用,但我似乎找不到关于servlet url模式匹配的12.1和12.2的底层实现。我感兴趣的是查看表达式如何映射到另一个项目的规则。这取决于模式匹配发生的位置。如果您打算让JBoss(Tomcat真的,Mohammad在这一点上是非常正确的)处理Web.xml中的所有url映射,并且只设置这些映射来处理特定端点上的请求,那么org.apache.naming可能就足够了 虽然,我可能会跳在作为


这将在第12章:将请求映射到servlet中。我查看了JBoss的Maven存储库,尽管spec接口可用,但我似乎找不到关于servlet url模式匹配的12.1和12.2的底层实现。我感兴趣的是查看表达式如何映射到另一个项目的规则。

这取决于模式匹配发生的位置。如果您打算让JBoss(Tomcat真的,Mohammad在这一点上是非常正确的)处理Web.xml中的所有url映射,并且只设置这些映射来处理特定端点上的请求,那么org.apache.naming可能就足够了

虽然,我可能会跳在作为一个好的开始。它不像您想象的那样处理名称关联(绑定)的HashMap和对象关联(上下文环境)的HashTable,但这仍然是绑定和查找的地方

但是,如果您希望通过前端控制器处理自己的路由,或者希望动态重定向或重新映射,那么文档可能更符合您的要求,它也是您在问题中请求的实现信息


希望能有所帮助。

我正在考虑Tomcat 7.0.42。下面答案中的链接指向grepcode.com中的7.0.42源代码

servlet映射在应用程序启动期间被解析并添加为
Wrapper
,其内部的源代码被复制粘贴在此处(注意:术语“Wrapper”基本上代表“映射的servlet”):

在处理传入的HTTP请求时,通过映射找到servlet的所有魔力都始于

第647行间接调用,当前HTTP请求的映射数据被
上下文
包装器
填充(本质上是一个可用的servlet实例)。这只是相当多的代码,我不会复制粘贴在这里,只需单击grepcode链接

然后,第649行和第650行基本上设置了当前请求上映射的
上下文
包装器
Context
保存具体的
ServletContext
实例,
Wrapper
将具体的
Servlet
实例作为属性保存

最后,在调用所有过滤器之后,将调用servlet的
service()
方法


对于我自己的项目,我曾经根据servlet spec 12.1在
WebXml
实用程序类(以相当简化的形式)中实现匹配检查。这些可能对您也有帮助,相关摘录如下:

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;
}
对不起,但这个“答案”纯粹是扯皮。
647        connector.getMapper().map(serverName, decodedURI, version,
648                                  request.getMappingData());
649        request.setContext((Context) request.getMappingData().context);
650        request.setWrapper((Wrapper) request.getMappingData().wrapper);
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;
}