27

隠しパラメータを渡すにはどうすればよいですか? ページ (test.jsp) を呼び出したいだけでなく、投稿のような 2 つの隠しパラメーターも渡します。

response.sendRedirect("/content/test.jsp");
4

5 に答える 5

50

TheNewIdiot の答えは、問題と、リダイレクトを介してリクエストで属性を送信できない理由をうまく説明しています。可能な解決策:

  1. 転送を使用します。これにより、リクエスト属性をビューに渡すことができるようになり、それらを式言語およびJSTLServletRequest#getAttributeの形式で、または使用して使用できるようになります。短い例(TheNewIdiotの回答]コードを再利用)。

    コントローラー (サーブレット)

    request.setAttribute("message", "Hello world");
    RequestDispatcher dispatcher = servletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
    

    ビュー (あなたの JSP)

    スクリプトレットの使用:

    <%
        out.println(request.getAttribute("message"));
    %>
    

    これは情報提供のみを目的としています。スクリプトレットの使用は避ける必要があります: JSP ファイルで Java コードを回避するには? . 以下は、EL と JSTL を使用した例です。

    <c:out value="${message}" />
    
  2. 転送を使用できない場合 (気に入らないか、そう感じないため、またはリダイレクトを使用する必要があるため)、オプションはメッセージをセッション属性として保存してから、ビューにリダイレクトします、ビューでセッション属性を回復し、セッションから削除します。常に関連データのみを使用してユーザー セッションを行うことを忘れないでください。コード例

    コントローラ

    //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" />
    
于 2013-06-08T16:22:58.830 に答える
5

通常、 sendRedirect()メソッドを使用して POST リクエストを送信することはできません。RequestDispatcherを使用して、同じ Web アプリケーション、同じコンテキスト内のパラメータでリクエストをforward()できます。

RequestDispatcher dispatcher = servletContext().getRequestDispatcher("test.jsp");
dispatcher.forward(request, response);

HTTP 仕様では、すべてのリダイレクトは GET (または HEAD) の形式でなければならないと規定されています。セキュリティが問題になる場合は、クエリ文字列パラメーターを暗号化することを検討できます。もう 1 つの方法は、メソッド POST を使用して非表示のフォームを作成し、ページのロード時に JavaScript を使用して送信することで、ターゲットに POST することです。

于 2013-06-08T15:49:47.123 に答える