隠されたパラメーターをどのように渡しますか?ページ(test.jsp)を呼び出したいが、投稿のような2つの非表示パラメーターも渡したい。
response.sendRedirect("/content/test.jsp");
TheNewIdiotの答え は、リダイレクトを通じてリクエストで属性を送信できない問題と理由を正常に説明します。可能な解決策:
転送を使用します。これにより、リクエスト属性をビューに渡すことができ、 ServletRequest#getAttribute
または Expression Language および [〜#〜] jstl [〜#〜] を使用します。短い例(TheNewIdiotの答えを再利用する)コード。
コントローラー(サーブレット)
request.setAttribute("message", "Hello world");
RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
dispatcher.forward(request, response);
View(JSP)
スクリプトレットの使用:
<%
out.println(request.getAttribute("message"));
%>
これは、情報目的のためだけです。スクリプトレットの使用は避ける必要があります: 回避方法Java JSPファイルのコード? 。以下に、ELとJSTLを使用した例を示します。
<c:out value="${message}" />
転送を使用できない場合(それが気に入らないか、そのように感じないか、リダイレクトを使用する必要があるため)、オプションはメッセージをセッション属性として保存し、ビューにリダイレクトします、ビューのセッション属性を回復し、セッションから削除します。関連するデータのみを使用してユーザーセッションを常に保持することを忘れないでください。コード例
コントローラー
//if request is not from HttpServletRequest, you should do a typecast before
HttpSession session = request.getSession(false);
//save message in session
session.setAttribute("helloWorld", "Hello world");
response.sendRedirect("/content/test.jsp");
表示
繰り返しますが、スクリプトレットを使用してこれを表示し、次にEL + JSTLを使用します。
<%
out.println(session.getAttribute("message"));
session.removeAttribute("message");
%>
<c:out value="${sessionScope.message}" />
<c:remove var="message" scope="session" />
通常、 sendRedirect() メソッドを使用してPOSTリクエストを送信することはできません。使用することができます RequestDispatcher to forward() リクエストは、同じWebアプリケーション、同じコンテキスト内にあります。
RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);
HTTP仕様では、すべてのリダイレクトはGET(またはHEAD)の形式である必要があると規定されています。セキュリティが問題になる場合は、クエリ文字列パラメーターの暗号化を検討できます。別の方法は、メソッドPOSTで非表示のフォームを作成し、ページがロードされたときにjavascriptで送信することにより、ターゲットに対してPOSTを実行できます。
session
を使用して、サーブレット#1で_response.sendRedirect
_を使用して、サーブレット#1からサーブレット#2にパラメータ(name
)を正常に渡しました。サーブレット#1コード:
_protected void doPost(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String password = request.getParameter("password");
...
request.getSession().setAttribute("name", name);
response.sendRedirect("/todo.do");
_
サーブレット#2では、name
を取得する必要はありません。すでにセッションに接続されています。 String name = (String) request.getSession().getAttribute("name");
を実行できますが、これは必要ありません。
サーブレット#2がJSPを呼び出す場合、JSP Webページでname
を次のように表示できます。
_<h1>Welcome ${name}</h1>
_