27

パラメータデータを追加しながら、リクエストを別のコントローラに転送する方法はありますか?ModelMapに追加してみましたが、ぶらぶらしていないようです。私は次のようなことをしています:

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

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

4

4 に答える 4

52

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

例として、一方が他方に転送する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番目のコントローラーへの移行中にリクエストにデータを追加するのが最適です。

于 2011-12-28T15:51:22.307 に答える
0

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

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

于 2011-12-21T05:08:17.060 に答える
0

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

于 2011-12-21T05:13:51.147 に答える
0

私はこの投稿を見つけました、それは:を使用していHttpRequestWrapperます

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

2番目:メソッドパラメーターでラップされたリクエスト
を使用して、RequestDispatcherを介してURLに転送します。

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

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

于 2017-02-09T16:14:08.603 に答える