【问题标题】:how to dynamically get the context-root of another web module within the same EAR/application如何在同一 EAR/应用程序中动态获取另一个 Web 模块的上下文根
【发布时间】:2012-06-09 05:59:35
【问题描述】:

我的应用程序包含两个 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 init-param 中,但只是想知道是否可以在进入根目录之前动态获取该值

标签: java jakarta-ee servlets websphere


【解决方案1】:

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

您可以做的是向每个标记为load-on-startup 的应用程序添加一个简单的servlet,并在其init 方法中捕获上下文路径并将其存储在某处。您也许可以注入一个收集上下文路径的 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 也可以被注入 EJB,并在其中进行查找。

请注意,您不能为此使用 CDI @ApplicationScoped,因为应用程序范围在 init() 期间不活动(我认为)。

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

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

【讨论】:

  • 谢谢汤姆,这当然是一个非常好的建议,如果我看到必要性,我会继续下去。 @两场战争都由两个不同的团队管理的那一刻,:)。所以,就目前而言,如果我能侥幸改变我的战争,我很高兴:但我肯定会保留这个解决方案。
  • 啊,我明白了。另一个想法是写一个ServletContainerInitializer 并将它放在两个 Web 应用程序之外的一个 jar 中(所以是一个 ejb-jar 或其他东西),我认为它会在你的两个 Web 应用程序的启动时收到通知。不过,不确定。
猜你喜欢
  • 2015-12-04
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多