web-dev-qa-db-ja.com

パラメーターが追加された春先?

いくつかのパラメーターデータを追加しながら、別のコントローラーに要求を転送する方法はありますか? ModelMapに追加しようとしましたが、ぶらぶらしているようには見えません。私は次のようなことをしています:

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

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

25
Tony R

最も簡単な方法は、リクエストにデータを追加することです。これはフォワードなので、同じリクエストがサーバー内の異なるハンドラーに渡されます。

例として、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&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";
    }
}

そして、それの楽しみのために、そしてSpringのバインディング動作を実際に示すために、あなたはこのようにすることもできます([〜#〜] 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には一種の「ハァッ...?!」があります。私はそれを避けます(また、URLに追加されたパラメータで動作するので、それらのいくつかまたはあなたが乱雑なURLを取得します)。

セッションにデータを追加することもコース外で機能しますが、データの寿命を不必要に延ばすため、2番目のコントローラーへの移行中に要求に追加するのが最適な場所です。

49
Bogdan

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

そのため、はい、セッション、Cookieを使用するか、パラメーターを投稿または取得します。

0
Steven

フィルターを検討しましたか?委任フィルタープロキシを使用してフィルターを作成できます。これにより、要求パラメーターとSpring Beanにアクセスできます。

0
Aravind A

this post を見つけました。これはHttpRequestWrapperを使用しています:

最初:
HttpRequestWrapperを定義し、投稿のようにメソッドgetParametergetParameterMapgetParameterNamesgetParameterValuesをオーバーライドします。

秒:
RequestDispatcherを介してURLに転送し、メソッドパラメーターでwrapped要求を使用します。

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

パラメータの削除のためにこれを試してみましたが(これはさらに難しい!)、うまくいきます!

0
olivmir