0

私のアプリケーションには、次の 2 つの 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」を取得できるかどうかです。context-root をハードコーディングしたくない理由は、これが EAR パッケージの展開中に変更される可能性があるためです。

前もって感謝します。

4

1 に答える 1

1

私はそれを直接行う方法を知りません。この種のアプリからアプリへの、またはサーブレットからサーブレットへの直接的な通信は、仕様によって慎重に推奨されていません。

できることはload-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);
    }
}

ディスパッチを実行したいサーブレットにも EJB を注入し、その中でルックアップを実行できます。

@ApplicationScopedアプリケーションスコープはその間アクティブではないため、これにはCDIを使用できないことに注意してくださいinit()(私は思う)。

おそらく、サーブレットではなく、何らかのライフサイクル リスナーを使用して登録を行うことができます。

あなたはおそらくマップキーについても少し賢いかもしれません-使用してから、web.xml で設定されていることにgetServletContextName()依存しますか? display-name初期パラメータを使用しますか? 理想的には、構成が異なるだけで、すべての Web アプリで使用できる単一のクラスが必要です。

于 2012-06-10T14:27:04.410 に答える