2011-12-21 12 views
18

パラメータデータを追加している間に別のコントローラに要求を転送する方法はありますか?私はModelMapに追加しようとしましたが、ハングアップしていないようです。私は次のようなことをしています:パラメータが追加されたSpring Forward?

return "forward:/my-other-controller"; 

私が考えることができる他の方法は、セッションにパラメータを置き、ターゲットコントローラでそれらをポップすることです。

答えて

39

最も簡単な方法は、要求にデータを追加することです。これは転送であるため、同じ要求がサーバー内の別のハンドラに渡されます。

例として、他に1つの転送、の2つのコントローラーの簡単なセットアップを始めましょう:データを追加する

@Controller 
public class TestController { 
    @RequestMapping(value="/test") 
    public String showTestPage() { 
     return "forward:/test2"; 
    } 
} 

@Controller 
public class TestController2 { 
    @RequestMapping(value="/test2") 
    public String showTestPage() { 
     return "testPageView"; 
    } 
} 

最初の方法は、リクエストの属性としてそれを設定することです。新しいコントローラは、この()のようになります。

forward prefix is basically an URLでビュー名ので

@Controller 
public class TestController { 
    @RequestMapping(value="/test") 
    public String showTestPage(HttpServletRequest request) { 
     request.setAttribute("param1", "foo"); 
     request.setAttribute("param2", "bar"); 
     return "forward:/test2"; 
    } 
} 

@Controller 
public class TestController2 { 
    @RequestMapping(value="/test2") 
    public String showTestPage(HttpServletRequest request) { 
     String param1 = (String) request.getAttribute("param1"); 
     String param2 = (String) request.getAttribute("param2"); 
     return "testPageView"; 
    } 
} 

、あなたはまた、次のバージョン(属性がパラメータに変更)(B)を持つことができます

@Controller 
public class TestController { 
    @RequestMapping(value="/test") 
    public String showTestPage() { 
     return "forward:/test2?param1=foo&param2=bar"; 
    } 
} 

@Controller 
public class TestController2 { 
    @RequestMapping(value="/test2") 
    public String showTestPage(HttpServletRequest request) { 
     String param1 = request.getParameter("param1"); 
     String param2 = request.getParameter("param2"); 
     return "testPageView"; 
    } 
} 

また、更なる代わりにアノテーションを使用することにより、第2のコントローラを簡素化することができます。

@Controller 
public class TestController2 { 
    @RequestMapping(value="/test2") 
    public String showTestPage(@RequestParam String param1, @RequestParam String param2) { 
     return "testPageView"; 
    } 
} 

そして、ちょうどそれの楽しみのために、そしてアクション春の結合挙動を示すために、あなたも、この(C)のようにそれを行うことができます:

@Controller 
public class TestController { 
    @RequestMapping(value="/test") 
    public String showTestPage() { 
     return "forward:/test2?param1=foo&param2=bar"; 
    } 
} 

@Controller 
public class TestController2 { 
    @RequestMapping(value="/test2") 
    public String showTestPage(@ModelAttribute DummyBinder params) { 
     String param1 = params.getParam1(); 
     String param2 = params.getParam2(); 
     return "testPageView"; 
    } 
} 

class DummyBinder { 
    private String param1; 
    private String param2; 

    public String getParam1() { 
     return param1; 
    } 

    public void setParam1(String param1) { 
     this.param1 = param1; 
    } 

    public String getParam2() { 
     return param2; 
    } 

    public void setParam2(String param2) { 
     this.param2 = param2; 
    } 
} 

私は個人的に多くのパラメータのための溶液AとなるだろういくつかはBのソリューションです。ソリューションCには「huh ...?!」という並べ替えがあります。私はそれを回避する(つまり、それはURLに追加されたパラメータで動作するので、それらのうちのいくつか、またはあなたは乱雑なURLを取得する)。

セッション内でデータを追加すると、データは無駄に長くなりますので、2番目のコントローラへの移行中にリクエストに追加するのが最適です。

HttpRequestWrapperを使用して、私は this postを見つけた
+1

偉大な答えをありがとう!これは私の混乱の核心になる。場所には「属性」と「パラメータ」があり、どちらがどのようなものか分かりません。私のPOSTリクエストには本体のバイナリデータがあるので、urlでエンコードされた "パラメータ"には使用できません。だから、request.setAttribute()は実際に何をしますか?これらはHttpServletRequestオブジェクトにある任意のキー/値のペアですか、またはクエリ文字列などのような実際のHTTPパラメータとして格納されていますか?そして、request.setAttributeとrequest.setParameterの違いは何ですか? –

+2

@トニーR:パラメータは、GET/POSTで送信するときにユーザーが送信するものです。ほとんどの場合、読み取り専用のデータです(request.setParameterはありません;サーバーは、取得するためのパラメータを含むリクエストオブジェクトを構築します)。属性は、サーバー上の特定のスコープに配置されたデータです。 request.setAttributeを使用してデータを「要求スコープ」に配置します(たとえば、セッションスコープまたはアプリケーションスコープを持つこともできます)。属性を追加したり、取得したり、削除することができます。ここに簡単な説明があります:http://www.xyzws.com/Servletfaq/what-is-the-difference-between-the-request-attribute-and-request-parameter/1 – Bogdan

+1

非常に説明のためにありがとう。私はパラメータが読み取り専用であることに気付きませんでした。実際には完全に意味があります。答えは些細なようだ...実際、この答えを得るのになぜ時間がかかったのか、今は他のものが**間違っているように見えるからね。 –

0

リダイレクトと同様に、この意味でコンテキストとホストは必要ありません(転送はサーバーによって内部的に処理されますが、リダイレクトはユーザーのブラウザに別のURLを要求するよう指示します)。

はい、セッション、Cookie、投稿、またはパラメータを取得してください。

+0

リクエストには既に独自のパラメータがあります...それらも一緒に行きたいと思います。しかし私はモデルも好きで、データを送るための他の方法もあるでしょうか? –

+0

あなたのコントローラにModelMapを追加して、転送されたコントローラのために新しい値を追加しようとしましたか? – Steven

+0

はい、私はそれを試みて、パラメータが見つかりませんでした –

0

フィルタについて考えましたか?委任フィルタプロキシを使用してフィルタを作成すると、リクエストパラメータとSpring Beanにアクセスできます。

+0

私は事例を詳しく述べることができますか?私はそれがどのようにぴったり合っているかわかりません。 –

+0

@トニー。リクエストをリダイレクトし、フィルタを使用してパラメータを変更しようとするオプションが与えられました。あなたがフォワードを使いたいなら、あなたはセッション属性を使いたいと思っています。 –

+0

それはどのように動作するかわかりません。トニーがこれまで述べてきたことから、彼が必要とする属性には何かが存在するのではないかと疑う。 – Steven

0

、:

まず:
、ポストのようgetParameterNamesgetParameterValuesHttpRequestWrapperを定義し、メソッドをオーバーライドするgetParametergetParameterMap

第二:私は、パラメータの削除のためにこれ試してみました

request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response); 

(もっとです:メソッドのパラメータのラップ要求を使用してURLに転送するRequestDispatcher経由
、難しい!)それは動作します!

関連する問題