上下文根
JEE永不停止让我惊奇。 即使当我认为自己处于领先地位并且我知道关于webapp的所有知识时,我也感到惊讶。 好消息是,无论您认为对某个主题了解多少,仍然还有一个事实余地。 坏消息是,我对所学的知识深感不安。
事实是:web应用上下文根可以包含/
characte,这意味着一个URL如http://localhost/multipart/context
可以指的根multipart/context
的web应用,以及对context
的的servlet映射http://localhost/multipart
webapp。 当我被告知时,我的第一React是难以置信。 我立即匆忙在JOnAS和JBoss应用服务器上运行了一些测试,并证实这是完全可能的。
实际上,如果查看application.xml XML Schema ,则会发现context-root是扩展字符串(带有id)的类型:
这意味着上下文根可以有效地包含任何内容,包括斜杠,反斜杠以及您所拥有的。
J2EE 1.4规范不强制执行其他约束(第125页):
必须为每个Web模块的上下文根指定一个唯一且不重叠的名称。 […]有关上下文根命名的详细要求,请参见servlet规范。
我没有在Servlet 1.4规范中看到上下文根的其他要求。
当使用单个XML文件创建Context时,Tomcat甚至考虑了此调整。 它称其为“多级上下文路径”:
在
$CATALINA_HOME/conf/[enginename]/[hostname]/
目录中的单个文件中(带有“ .xml”扩展名)。 文件名(减去.xml扩展名)将用作上下文路径。 可以使用#定义多级上下文路径,例如对于/foo/bar
的上下文路径为foo#bar.xml
。
因此,为了将context.war部署在multipart/context
根目录下,您必须将上下文XML文件命名为multipart#context.xml
。
该文件的内容如下:
<?xml version='1.0' encoding='utf-8'?>
<ContextdocBase="${catalina.home}/context.war"/>
<!-- this means the context.war should be available at the root of Tomcat -->
在我进行的测试中,如果多级上下文路径通过servlet映射遮盖了经典上下文根,则前者优先。 我不建议您使用此功能,因为规格中未指定保护套,因此每个产品的处理方式可能不同。
好的,现在我们已经建立了这些事实,除了在JEE极客惯例中将您设置为übergeek之外,了解这一点还有什么意义? 由于http://localhost/multipart/context
和http://localhost/multipart
是明显分开的Web应用程序,因此它们甚至不共享上下文。
就我而言,这是一个简单用例的解决方案。 想象一下监视Web应用程序:您知道必须监视的URL。 现在,内部开发用于诊断目的的产品与每个以webapp形式的webapp并排部署。 如果您无需查看文档即可知道其URL,就可以访问诊断Webapp,那将是非常不错的。 假设这是在/diag
后面附加的业务Web应用程序的URL。
因此,如果主要Web应用程序的URL是http://myserver.com/mywebapp
并且负责监视的人知道这一点,则他知道他必须访问http://myserver.com/mywebapp/diag
并获得了他所得到的信息。要! 在开发方面,这意味着这两个Web应用程序都是不同的产品,由不同的团队开发并且具有不同的生命周期。
上下文根