1

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のページに表示します。

4

3 に答える 3

2

これはセキュリティ上の理由により、デフォルトでは使用できません。現在のWebアプリケーションを他のWebアプリケーションに公開できるようにするには、最初にTomcatを構成する必要がありますServletContext。これは、のcrossContext属性をcontext.xmlに設定することによって実行されますtrue

<Context ... crossContext="true">

それが完了するとServletContext#getContext()、コンテキストパスによって他のサーブレットコンテキストを取得し、最後に通常の方法RequestDispatcherで取得されたものを使用できます。ServletContext#getRequestDispatcher()

例えば

ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
于 2012-11-18T22:31:40.890 に答える
1

はい。

あなたがする必要がある最初のことServletContextは他のウェブアプリのためにを手に入れることです。他のWebアプリのコンテキストパスを渡して、ServletContext::getContext自分でそれを行います。ServletContext

次に、ServletContext::getRequestDispatcher外部コンテキストで通常どおりに実行します。

私は実際にこれを試していませんが、私はそれが機能することを100%保証します。

于 2012-11-17T23:20:22.997 に答える
1

別のサーブレットコンテナについてはよくわかりません。ただし、 getServletContext()。getContext()メソッドを使用すると、同じコンテナーで機能し ます。

まず、以下のファイルに変更を加える必要があります

(Windows)C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ conf \context.xmlcrossContextの値をtrueに設定します。

context.xml

<Context crossContext="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->

    <!-- Uncomment this to enable Comet connection tacking (provides events
         on session expiration as well as webapp lifecycle) -->
    <!--
    <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
    -->

</Context>

crossContext="true"であることに注意してください。

InterServletComm1InterServletComm2という名前の2つのWebアプリケーションがあり、各Webアプリケーションにそれぞれ サーブレットServlet1Servlet1があるとします。次に、各サーブレットのコードは次のようになります。

Servlet1.java

package interServletComm1;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet1
 */
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();

        request.setAttribute("name", "WebApp1");
        ServletContext context = getServletContext().getContext("/InterServletComm2");
        RequestDispatcher rd = context.getRequestDispatcher("/Servlet2");
        rd.forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

Servlet2.java

package interServletComm2;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Servlet2
 */
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public Servlet2() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        String name = (String) request.getAttribute("name");
        pw.println("This is web application 2.");
        pw.println("<br>The value received from web application one is: " + name);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

上記のコードは、 InterServletComm1から属性名を送信し、 InterServletComm2で受信されます。この答えが明確でない場合はお知らせください。

于 2013-10-09T13:18:25.617 に答える