0

我的应用程序包含两个 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 包的部署过程中发生变化。

提前致谢。

4

1 回答 1

1

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

您可以做的是向每个标记为 的应用程序添加一个简单的 servlet,该 servletload-on-startup在其 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()然后依赖于display-name在 web.xml 中设置?使用初始化参数?理想情况下,您将拥有一个可以在所有 Web 应用程序中使用的类,只是配置不同。

于 2012-06-10T14:27:04.410 回答