在this question的扩展中,是否有一种方法可以从ServletContextListener的范围中获取同一容器中特定页面的有效URL?
我为什么需要这个背景:
在一个相当复杂的系统中,我设置了一个简单的servlet以JSON显示当前信息,因此我可以根据需要轻松显示它。
现在,我想更进一步,并对此进行历史记录,以查看这些测量点随时间的变化。
我已经设置了一个简单的ServletContextListener,它启动了一个线程以设置的时间间隔轮询同一页,并且可以将数据保存到文件中,以便以后再读取。
一切工作正常,除了我必须通过配置手动指定目标页面的URL。如果我可以通过编程方式获得此数据,那么将减少一个配置点,这可能会出错。我认为这应该不太困难,因为所有内容都来自相同的上下文,但事实证明它并不是那么简单。由于所有内容都紧密相连,并且该线程正在服务器上运行,因此可以将主机地址硬编码为localhost。也就是说,我仍然需要获取Webapp的端口和基本路径。因为我知道webapp的结构,所以可以从那里接管。
所以...我如何以编程方式获取该信息,并在以后部署该应用程序的糟糕经历中使生活变得更轻松!
最佳答案
可能,但它并不漂亮,它将把您绑定到特定的容器。简而言之,这有点像YMMV。以下解决方案适用于Jetty。
在contextInitialize中,您可以像这样访问WebAppContext:
public void contextInitialized(ServletContextEvent sce) {
WebAppContext ctx = (WebAppContext) sce.getServletContext();
System.out.println("context Base Path" + ctx.getContextPath());
System.out.println("Getting the port is a bit trickier");
System.out.println("One valid Port = " + ctx.getServer().getConnectors()[0].getPort());
}
为了简明扼要,我删除了一些检查和验证,但这足以满足您的想法……根据需要添加调味料。
在这里,您可能会以不同的执行方式得到不同的答案。由于目标是调用服务,因此,如果我们获得原始声明或别名,那么调用成功就无济于事。
最后,由于已知目标IP地址(本地主机),因为工作线程与目标地址位于同一JVM中,并且一旦进入正确的上下文,就知道了服务的路径,我们所需要的就是知道端口和上下文根路径。
如果您尝试这样做并遇到麻烦,请编辑答案或发表评论,以便我们都能从您的经验中受益。