2013-06-08 15 views
19

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

response.sendRedirect("/content/test.jsp"); 
+0

は、あなたがあなたでカバー何を取り上げます。サーブレット#2は、JSPを呼び出す場合

、あなたはnameにJSPのWebページ上でこの道を示すことができますJSTLを使用したセッション属性。 –

+0

@LuiggiMendoza申し訳ありませんが、私はあなたがOKであることを確認するために私のコメントを削除します。ところで、その回答は約5ヶ月前に投稿されました) – informatik01

+1

@ informatik01はあなたの投稿を知らなかったが、私たちはこの問題をどのように処理するか(世界の他の人々の間でも)知っているようだ。 –

答えて

36

TheNewIdiot's answerは、リダイレクトによってリクエストで属性を送信できないという問題とその理由をうまく説明しています。考えられる解決策:

  1. 転送を使用する。これにより、要求属性をビューに渡すことができ、ServletRequest#getAttributeの形式で、またはExpression LanguageJSTLを使用して使用できます。簡単な例(The NewIdiotの答えを再利用する)コード。

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

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

    ビュー(あなたのJSP)

    スクリプトレットを使用して:

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

    これは単なる情報提供を目的とのためです。スクリプトレットの使用は避ける必要がありますHow to avoid Java code in JSP files?。以下に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示す:sessionを使用して

    <% 
        out.println(session.getAttribute("message")); 
        session.removeAttribute("message"); 
    %> 
    
    <c:out value="${sessionScope.message}" /> 
    <c:remove var="message" scope="session" /> 
    
3

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

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

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

+0

代わりに他の機能を使用することはできますか? –

+0

@AshishAnand私の編集した答えを見て、同じWebアプリケーション内で 'RequestDispatcher'を使うことができます。 – NINCOMPOOP

1

を、Iサーブレット#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");を実行できますが、これは必要ありません。その鉱山は除去するビューの部分が追加されます以外

informatik01私の答え@

<h1>Welcome ${name}</h1>

関連する問題