0

これであなたの一日を台無しにして申し訳ありませんが、私は答えを求めてウェブをトロールするのに何年も費やしましたが、完全に立ち往生しています!

Web アプリでは、RequestDispatcher を使用して、servlet_A から servlet_B にリクエストを送信しています。servlet_B で、servlet_A への応答として返される単純な文字列値を生成するコードを実行します。

サーブレット A のコード:

ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/servlet_B");
dispatcher.forward(request, response);

/*
How do I catch the response from servlet_B and convert it to a String?
*/

サーブレット B のコード:

/*
Some other code which creates a String
*/

String result = "someValue";

// Send the response to servlet_A.
response.setContentType("text/plain");
response.setContentLength(result.length());
PrintWriter out = response.getWriter();
out.println(result);

servlet_A では、servlet_B からの応答を単純な String 値に変換する必要があります。servlet_B からの応答を servlet_A の単純な文字列として処理するにはどうすればよいですか?

PrintWriter を使用して応答を解析する必要があると思います。Web でこの例を検索しましたが、PrintWriter を使用して応答を送信する方法、またはデータを画面に出力する方法を示す例しか見つかりません。

誰かがこれで私を助けることができれば、私は非常に感謝しています.

4

3 に答える 3

1

技術的には、問題の解決に関して間違った方向に進んでいます。転送先の他のサーブレットは明らかに密結合であり、そのコードをスタンドアロン クラスにリファクタリングして、必要なデータをすぐに文字列として返す必要があります。これにより、他のサーブレットがそれを応答に書き込めるようになり、現在のサーブレットができるようになります。最初に他のサーブレット全体を呼び出す代わりに、スタンドアロン クラスを直接使用します。

HttpServletResponseWrapper悪臭を放つ悪い設計を無視して、現在の応答を、実際の応答本文の代わりに内部文字列バッファーに書き込む実装に置き換えることで解決できます。特定の機能要件に合った具体的なキックオフの例を次に示します (実際の実装はこれよりもはるかに複雑になる可能性があることに注意してください。同様に考慮する必要があります) getOutputStream()getCharacterEncoding()

final StringWriter buffer = new StringWriter();
request.getRequestDispatcher("/servlet_B").include(request, new HttpServletResponseWrapper(response) {
    private PrintWriter writer = new PrintWriter(buffer);
    @Override
    public PrintWriter getWriter() throws IOException {
        return writer;
    }
});

String writtenByServletB = buffer.toString();
// ...
于 2013-02-01T18:19:25.650 に答える
0

必要なのは、前のサーブレットから次のサーブレットに String を運ぶことだけだと思います。その後は、リクエスト オブジェクトに属性を追加するだけです。したがって、リクエストを次のサーブレットに渡すと、リクエストオブジェクトは属性として設定された値を運びます

したがって、最初のサーブレットで書くことができます

String sendThisValue = "some Important value to be sent";
request.setAttribute("sendThisValue",sendThisValue);
RequestDispatcher dispatcher = context.getRequestDispatcher(“/servlet_B”);
dispatcher.forward(request, response);

コントロールが次のサーブレットに渡されると、前のサーブレットで設定した値にリクエスト オブジェクトでアクセスできます。

String gotTheValue = request.getAttribute("sendThisValue");
于 2013-02-01T18:09:16.690 に答える
0

サーブレット BI では、再びディスパッチャを使用してサーブレット A に戻ることができると思います

ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher(“/servlet_A”);
request.setAttribute("result",result);//the String you want to pass
dispatcher.forward(request, response);
于 2013-02-01T17:52:42.227 に答える