gpt4 book ai didi

java - 如何动态获取同一 EAR/应用程序中另一个 Web 模块的上下文根

转载 作者:行者123 更新时间:2023-12-01 15:20:50 25 4
gpt4 key购买 nike

我的应用程序包含两个 Web 模块,如下所示:

<module>
<web>
<web-uri>myWeb1.war</web-uri>
<context-root>/web1</context-root>
</web>
</module>
<module>
<web>
<web-uri>myWeb2.war</web-uri>
<context-root>/web2</context-root>
</web>
</module>

,我需要将请求从“web1”模块转发到“web2”,如下所示。

RequestDispatcher rd = getServletContext().getContext("/web2").getRequestDispatcher("/servlets/actReq");
rd.forward(request, response);

问题是,是否可以检索上下文根名称:“web2”,而不是在代码中对其进行编码。我不想对上下文根进行硬编码的原因是因为这可能会在 EAR 包的部署过程中发生变化。

提前致谢。

最佳答案

我不知道有什么方法可以直接做到这一点。规范不鼓励这种直接的应用程序到应用程序,甚至 servlet 到 servlet 的通信。

您可以做的就是向每个标记为 load-on-startup 的应用程序添加一个简单的 servlet,并在其 init 方法中捕获上下文路径并将其存储在某个位置。您也许可以注入(inject)一个收集上下文路径的 EJB。像(非常粗略的草图!):

@Singleton
public class ContextPaths extends HashMap<String, String> {}

public class RegisterContextPath extends HttpServlet {
@EJB
private ContextPaths contextPaths;

public void init() {
String contextPath = getServletContext().getContextPath();
contextPaths.put("myWeb1", contextPath);
}
}

想要进行调度的 servlet 也可以注入(inject) EJB,并在其中进行查找。

请注意,您不能为此使用 CDI @ApplicationScoped,因为应用程序作用域在 init() 期间不处于 Activity 状态(我认为)。

您可能可以使用某种生命周期监听器来进行注册,而不是 servlet。

您可能对 map 键也有点聪明 - 使用 getServletContextName() ,然后依赖在 web.xml 中设置的 display-name ?使用初始化参数?理想情况下,您应该有一个可以在所有网络应用程序中使用的类,只是配置不同。

关于java - 如何动态获取同一 EAR/应用程序中另一个 Web 模块的上下文根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10958798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com