まず最初にrequest.getHeader("referer")
完全なURLを返しますが、http://server[:port]/
request.getRequestDispatcher()に渡すものが次のようにアプリケーションコンテキストに追加されるため、削除する必要があります。
/NameOfApp/http:/localhost:8084/NameOfApp/test.jsp
ディスパッチャメソッドに以下を渡す必要があるため、これは必要なことではありません。
test.jsp
最初から物事を取り上げる場合、最初のリクエストは次のURLから始まります。
http://localhost:8084/RequestDispatcher/test.jsp
転送は機能しますが、2回目にサーブレットにリクエストを送信すると、サーブレットはそれ自体に転送します。したがって、サーブレットがそれ自体を呼び出すループに入ります。なぜこれが起こるのでしょうか?フォームからサーブレットを呼び出すため、これは、ブラウザのアドレスボックスのURLアドレスが、最初のリクエスト後にサーブレットのURLアドレスに変更されることを意味します。
http://localhost:8084/RequestDispatcher/NewServlet
サーブレットはリクエストをJSPページに転送し、ブラウザはそれだけを表示しますが、ブラウザのアドレスボックスのURLは、JSPページではなくサーブレットを含むURLのままです。
http://localhost:8084/RequestDispatcher/NewServlet
したがって、次に送信を押すと、サーブレットはリクエストをそれ自体に転送しようとします。もし私があなたなら、リダイレクトを使用します。それはあなたの目的により適しているようです:
response.sendRedirect(request.getHeader("referer"));
これにより、ブラウザのアドレスボックスのURLが常に変更され、サーブレットがループするのを防ぎます。これはリクエストパラメータに影響を与えますが、リダイレクトURLにいつでも追加するか(機密情報でない場合)、リダイレクトによって行われる次の最初のリクエストで取得するまでセッションに保存できます。
JSFのようなフレームワークは、これらの問題からあなたを救うでしょう。
forwardを使用できる最も簡単な解決策は、request.getHeader( "referer")を使用する代わりに、サーブレットを呼び出したJSP(viewid)を保持するフォームの非表示パラメーターです。ただし、誰かが意図的に値を変更してサーブレットコンテナを強制的にループさせ、最終的にVMをクラッシュさせる可能性があるため、ループをチェックする必要があります。ただし、リクエスト属性を使用して、チェーン内の前のリクエストの記録を保持することができます。同じ場合は、エラーで応答します。したがって、サーブレットでは、転送先を決定するために非表示フィールドの値を使用します。
request.getRequestDispatcher(request.getParameter("viewid")).forward(request, response);
そしてあなたのJSPで:
<input type="hidden" name="viewid" value="test.jsp">
これであなたの要件をカバーできると思います。