パラメータデータを追加している間に別のコントローラに要求を転送する方法はありますか?私はModelMapに追加しようとしましたが、ハングアップしていないようです。私は次のようなことをしています:パラメータが追加されたSpring Forward?
return "forward:/my-other-controller";
私が考えることができる他の方法は、セッションにパラメータを置き、ターゲットコントローラでそれらをポップすることです。
パラメータデータを追加している間に別のコントローラに要求を転送する方法はありますか?私はModelMapに追加しようとしましたが、ハングアップしていないようです。私は次のようなことをしています:パラメータが追加されたSpring Forward?
return "forward:/my-other-controller";
私が考えることができる他の方法は、セッションにパラメータを置き、ターゲットコントローラでそれらをポップすることです。
最も簡単な方法は、要求にデータを追加することです。これは転送であるため、同じ要求がサーバー内の別のハンドラに渡されます。
例として、他に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¶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";
}
}
そして、ちょうどそれの楽しみのために、そしてアクション春の結合挙動を示すために、あなたも、この(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には「huh ...?!」という並べ替えがあります。私はそれを回避する(つまり、それはURLに追加されたパラメータで動作するので、それらのうちのいくつか、またはあなたは乱雑なURLを取得する)。
セッション内でデータを追加すると、データは無駄に長くなりますので、2番目のコントローラへの移行中にリクエストに追加するのが最適です。
HttpRequestWrapper
を使用して、私は
this postを見つけた
リダイレクトと同様に、この意味でコンテキストとホストは必要ありません(転送はサーバーによって内部的に処理されますが、リダイレクトはユーザーのブラウザに別のURLを要求するよう指示します)。
はい、セッション、Cookie、投稿、またはパラメータを取得してください。
リクエストには既に独自のパラメータがあります...それらも一緒に行きたいと思います。しかし私はモデルも好きで、データを送るための他の方法もあるでしょうか? –
あなたのコントローラにModelMapを追加して、転送されたコントローラのために新しい値を追加しようとしましたか? – Steven
はい、私はそれを試みて、パラメータが見つかりませんでした –
フィルタについて考えましたか?委任フィルタプロキシを使用してフィルタを作成すると、リクエストパラメータとSpring Beanにアクセスできます。
私は事例を詳しく述べることができますか?私はそれがどのようにぴったり合っているかわかりません。 –
@トニー。リクエストをリダイレクトし、フィルタを使用してパラメータを変更しようとするオプションが与えられました。あなたがフォワードを使いたいなら、あなたはセッション属性を使いたいと思っています。 –
それはどのように動作するかわかりません。トニーがこれまで述べてきたことから、彼が必要とする属性には何かが存在するのではないかと疑う。 – Steven
、:
まず:
、ポストのようgetParameterNames
とgetParameterValues
をHttpRequestWrapper
を定義し、メソッドをオーバーライドするgetParameter
、getParameterMap
。
第二:私は、パラメータの削除のためにこれ試してみました
request.getRequestDispatcher("myForwardUrl").forward(new MyRequestWrapper(request), response);
(もっとです:メソッドのパラメータのラップ要求を使用してURLに転送するRequestDispatcher経由
、難しい!)それは動作します!
偉大な答えをありがとう!これは私の混乱の核心になる。場所には「属性」と「パラメータ」があり、どちらがどのようなものか分かりません。私のPOSTリクエストには本体のバイナリデータがあるので、urlでエンコードされた "パラメータ"には使用できません。だから、request.setAttribute()は実際に何をしますか?これらはHttpServletRequestオブジェクトにある任意のキー/値のペアですか、またはクエリ文字列などのような実際のHTTPパラメータとして格納されていますか?そして、request.setAttributeとrequest.setParameterの違いは何ですか? –
@トニー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
非常に説明のためにありがとう。私はパラメータが読み取り専用であることに気付きませんでした。実際には完全に意味があります。答えは些細なようだ...実際、この答えを得るのになぜ時間がかかったのか、今は他のものが**間違っているように見えるからね。 –