RequestDispatcherは複数のWebアプリで機能しますか?
エラーメッセージとフィードバックメッセージを表示するときに状態が失われないように、リダイレクトではなくRequestDispatcherを使用する単一のWebアプリが正常に機能していたため、質問しています。
ただし、一部の機能を2つのWebアプリケーションに分割する必要があるため、最初の呼び出しはwebapp1でホストされているWebページから行われ、webapp2を呼び出して、最終的にユーザーをwebapp1でホストされているページに戻します。
明らかに、Webappsとwebapp2がRequestDispatcherを使用して異なるWebサイトにある場合は不可能ですが、両方のWebアプリケーションがサーブレットコンテナの同じインスタンス内にデプロイされている場合はそうです(tomcat 7)
アップデート
回答で説明されているようにリクエストディスパッチャ部分が機能するようになりましたが、webapp2に配置されたデータを取得できません。そのため、Imはそれを使用しています。
すなわち
と呼ばれるwebapp2は、いくつかの処理を実行してから、webapp1のjspにディスパッチします。
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
HttpSession userSession = request.getSession(true);
String emailAddress = ......
String nextPage = /finish.jsp
userSession.setAttribute("DATA", emailAddress);
ServletContext otherContext = getServletContext().getContext("/webapp1");
otherContext.getRequestDispatcher(nextPage).forward(request, response);
}
webapp2jspファイルには
...
<p>Email(<%=((String)session.getAttribute("DATA"))%>)</p>
...
ただし、常にnullを表示します
アップデート2**
crossContext="true"が実際に何をするのか誤解しているのではないかと思います。異なるWebアプリケーションで同じHttpSessionを使用できるようにしますか、それとも、あるWebapから別のWebアプリへのServletContextを使用できるようにして、あるWebアプリケーションが別のWebアプリケーションのHttpSessionを表示できるようにしますか?
私は常にバニラサーブレットのセットアップを使用することに熱心であり、特定の実装に自分自身を結び付けたくないので、私がしていることは悪い考えだと考え始めています。そもそもなぜウェブアプリを分割する必要があるのかを説明しておけば助かると思います。
1つのウェブアプリ(webapp1)がありました。これは、Google Checkout(現在はGoogleウォレット)を使用して開発し、その商品を購入するためのコードを作成した商品に関するウェブサイトです。
次に、新しい製品(webapp2)用の新しいWebアプリケーションを作成しました。
次に、新製品のGoogle Checkoutをwebapp2に追加しようとしましたが、Google Checkoutでは、支払いを処理した後でユーザーに送信できるように、アプリケーションから呼び出すことができるURLを提供する必要があるため、これを簡単に行うことができないことに気付きました。ライセンス。URLはすでにwebapp1のサーブレットに設定されていますが、webapp1が製品2の支払いを処理することは意味がありません。
1つのオプションはwebpp1とwebapp2を1つのwebappにマージすることでしたが、これは物事をモジュール化するという私の一般的な見方に反します。つまり、1つの製品IDの変更を作成するたびに、すべてを再デプロイする必要があります。それはまた、webapp1に大きな変更を加えることを意味しましたが、それは機能していて安定しているため、実際には変更したくありませんでした。
別の方法は、webapp3を作成することでした。その後、google urlがこれをポイントし、これを使用して、製品1と製品2の購入を処理します。これは私が行ったことです。しかし、問題は、製品1を購入するときに開始ページがwebapp1にあり、購入が行われた後、webapp1のページに戻りたいのですが、webapp3だけが、購入したばかりのユーザーの詳細を持っています。 webapp1のページに表示します。