为什么 Servlet.getContext(String) 在取消部署后不 return null
Why Servlet.getContext(String) does not return null after undeploy
我正在使用 tomcat-10
(雅加达)。根据 to the doc
getContext(String)
return null
如果上下文不存在或访问受限。但在实践中是不正确的。例如,我有两个 /app1
和 /app2
的 Web 应用程序。在 运行 之后我取消部署 /app2
。我还检查了使用 JMX 注册的 MBeans
,并且没有注册的带有上下文 /app2
的 servlet。但是当我调用 getContext(/app2)
时,它 returns ROOT
servlet
。是错误还是正常工作?
更新
为了进行测试,我只是删除了 tomcat 默认 ROOT
网络应用程序。当我调用 getContext
方法时删除后,如果请求的上下文不存在,我会得到 null
。所以我认为 Servlet
的文档或自定义实现中缺少一些信息
getContext 方法是为不同的 Web 应用程序获取对 servlet 上下文的引用,如果您当前的应用程序确实有权访问由 tomcat 默认值指定的其他上下文,即跨上下文,则该方法不会为 null = 真。
此外,您当前的网络应用程序已经引用了 servlet 上下文,可能在您的应用程序变量中
ServletContext#getContext
的参数不需要指向上下文的确切 URI。因此:
- 所有 以
/app1
开始 的字符串将为您提供 /app1
应用程序的上下文,
- 所有 以
/app2
开始 的字符串将为您提供 /app2
应用程序的上下文,
- 在您停止
/app2
后,对 /app2
的所有请求都将被路由到 ROOT
上下文。因此 getContext("/app2")
将 return ROOT
上下文。
我正在使用 tomcat-10
(雅加达)。根据 to the doc
getContext(String)
return null
如果上下文不存在或访问受限。但在实践中是不正确的。例如,我有两个 /app1
和 /app2
的 Web 应用程序。在 运行 之后我取消部署 /app2
。我还检查了使用 JMX 注册的 MBeans
,并且没有注册的带有上下文 /app2
的 servlet。但是当我调用 getContext(/app2)
时,它 returns ROOT
servlet
。是错误还是正常工作?
更新
为了进行测试,我只是删除了 tomcat 默认 ROOT
网络应用程序。当我调用 getContext
方法时删除后,如果请求的上下文不存在,我会得到 null
。所以我认为 Servlet
getContext 方法是为不同的 Web 应用程序获取对 servlet 上下文的引用,如果您当前的应用程序确实有权访问由 tomcat 默认值指定的其他上下文,即跨上下文,则该方法不会为 null = 真。
此外,您当前的网络应用程序已经引用了 servlet 上下文,可能在您的应用程序变量中
ServletContext#getContext
的参数不需要指向上下文的确切 URI。因此:
- 所有 以
/app1
开始 的字符串将为您提供/app1
应用程序的上下文, - 所有 以
/app2
开始 的字符串将为您提供/app2
应用程序的上下文, - 在您停止
/app2
后,对/app2
的所有请求都将被路由到ROOT
上下文。因此getContext("/app2")
将 returnROOT
上下文。