いくつかのパラメーターデータを追加しながら、別のコントローラーに要求を転送する方法はありますか? ModelMapに追加しようとしましたが、ぶらぶらしているようには見えません。私は次のようなことをしています:
return "forward:/my-other-controller";
私が考えることができる他の方法は、セッションにパラメーターを配置し、ターゲットコントローラーでそれらをポップすることです。
最も簡単な方法は、リクエストにデータを追加することです。これはフォワードなので、同じリクエストがサーバー内の異なるハンドラーに渡されます。
例として、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";
}
}
データを追加する最初の方法は、リクエストの属性として設定することです。新しいコントローラーは次のようになります([〜#〜] a [〜#〜]):
@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";
}
}
フォワードプレフィックスは基本的にURL のビュー名なので、次のバージョン(属性をパラメーターに変更)([〜#〜] b [ 〜#〜]):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=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";
}
}
そして、それの楽しみのために、そしてSpringのバインディング動作を実際に示すために、あなたはこのようにすることもできます([〜#〜] c [〜#〜]):
@Controller
public class TestController {
@RequestMapping(value="/test")
public String showTestPage() {
return "forward:/test2?param1=foo¶m2=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には一種の「ハァッ...?!」があります。私はそれを避けます(また、URLに追加されたパラメータで動作するので、それらのいくつかまたはあなたが乱雑なURLを取得します)。
セッションにデータを追加することもコース外で機能しますが、データの寿命を不必要に延ばすため、2番目のコントローラーへの移行中に要求に追加するのが最適な場所です。
リダイレクトと同様に転送を検討しますが、この意味でコンテキストとホストは必要ありません(転送はサーバーによって内部的に処理されますが、リダイレクトはユーザーのブラウザに別のURLを要求するよう指示します)。
そのため、はい、セッション、Cookieを使用するか、パラメーターを投稿または取得します。
フィルターを検討しましたか?委任フィルタープロキシを使用してフィルターを作成できます。これにより、要求パラメーターとSpring Beanにアクセスできます。
this post を見つけました。これはHttpRequestWrapper
を使用しています:
最初:HttpRequestWrapper
を定義し、投稿のようにメソッドgetParameter
、getParameterMap
、getParameterNames
、getParameterValues
をオーバーライドします。
秒:
RequestDispatcherを介してURLに転送し、メソッドパラメーターでwrapped要求を使用します。
request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);
パラメータの削除のためにこれを試してみましたが(これはさらに難しい!)、うまくいきます!