0

私は2つのWARアプリケーションを持っており、それらの間の通信モードはサーブレットを介しています。

私のアプリケーション(WAR A)は、別のWAR(たとえば、WAR B)のサーブレットのURLを使用して子ウィンドウを開きます。

サーブレット(WAR B内)はデータを処理し、処理されたデータを元のアプリケーションのサーブレット(つまり、WAR Aのサーブレット)に送り返す必要があります。

ただし、このプロセスは無限ループで終了し、WAR-Aから送信されたURLパラメータもnullになります。

コードスニペットは次のとおりです。

次のスクリプトは、WAR-BのサーブレットのURLを含む子ウィンドウを開き、いくつかのURLパラメータも渡します。

function invokePlugin(invokeURL, custValJSON, meaCompPartJSON) {
    window.open(invokeURL + '?custValJSON=' + custValJSON,'');
}

以下は、URLパラメータを抽出してデータを処理し、リクエストをWAR-Aのサーブレットに送り返すWAR-Bのサーブレットコードです...

private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String custValJSON = request.getParameter("custValJSON");
    System.out.println("custValJSON : " + custValJSON);

    CustomValues custVal = gson.fromJson(custValJSON, CustomValues.class);

    if(custVal != null) {
        System.out.println("Cust val details : " + custVal.getName());
        custVal.setValue("Satya");
    }

    String destination = "/testPlannerPluginResult";

    RequestDispatcher reqDispatch = request.getRequestDispatcher(destination);
    request.setAttribute("custValJSON", gson.toJson(custVal));

    if(reqDispatch != null) {
        reqDispatch.forward(request, response);
    }
}

誰かがこれについて考えを持っていますか?

よろしく、

サティア

4

1 に答える 1

2

これは、サーブレットが基本的に毎回自分自身を呼び出していることを意味します。これまでに提供された情報に原因がすぐにはわかりませんが、渡しgetRequestDispatcher()た URL がサーブレット自体の URL と一致しているようです。

ただし、ここに大きな間違いがあります。

RequestDispatcher reqDispatch = request.getRequestDispatcher(destination);
request.setAttribute("custValJSON", gson.toJson(custVal));

これにより、別のサーブレット コンテキスト (別の WAR と読む) で実行されるサーブレットが呼び出される可能性があります。ServletContext#getContext()最初に他のサーブレット コンテキストを取得してServletContext#getRequestDispatcher()から、そこにリクエストをディスパッチするために使用する必要があります。

ServletContext otherServletContext = getServletContext().getContext("/otherContextPath");
RequestDispatcher dispatcher = otherServletContext.getRequestDispatcher(destination);

これには、両方の WAR が共有用のコンテキストを公開するように構成されていることのみが必要です。たとえば、Tomcat では、これcrossContext="true"<Context>.

于 2011-11-02T13:31:25.630 に答える