2

私はスプリングコントローラーUserControllerを持っており、次の方法があります(ビジネスロジックは含まれていません)。

    @RequestMapping(value = "new", method = RequestMethod.GET)
public String getNewUserForm(Model model) {
    model.addAttribute("action", "Create");
    model.addAttribute(new User());
    return "users/edit";
}

@RequestMapping(value = "create", method = RequestMethod.POST)
public String getCreateUser(@ModelAttribute("user") User user, BindingResult result, RedirectAttributes attr) {
    attr.addFlashAttribute("user", user);
    return "redirect:view";
}

@RequestMapping(value = "view", method = RequestMethod.GET)
public String getViewUser(Model model) {
    return "users/view";
}

最終的に3つの「アクション」(新規、作成、表示)になります。私が達成したいのは次のとおりapp.com/users/newです。ブラウザに入力します。ユーザー作成フォームusers/editが表示されます。フォームが送信されると、が呼び出されますusers/create (POST)users/viewユーザーが正常に作成されたら、ユーザーをに転送し、入力データを編集不可能なページに表示したいと思います。viewURLが残っているので、戻ることはできませんapp.com/users/create。読んでもらいたいのですがapp.com/users/view

現在、私はRedirectAttributesオブジェクトを使用しており、リターンと組み合わせてredirect:view機能しています。しかし、これを達成するためのより良い方法があるはずだと感じています。redirect:viewなしで使ってみRedirectAttributesましたが、モデルがありませんでした。

もう1つの方法は、URLでユーザーIDを渡し(例:) app.com/users/view/1、データベースからデータをロードすることです。しかし、私がすでに最新バージョンのオブジェクトを持っていることを考えると、それはデータベースへの不必要なラウンドトリップのように思えます。これを「きれいなURL」に実装しますが、ユーザーオブジェクトが利用可能な場合は、ロードしないオプションはありません。

このようなもの:

    @RequestMapping(value = "view", method = RequestMethod.GET)
public String getViewUser(Model model, @RequestParam(required = false) String id) {

    if(!model.containsAttribute("user")){
        //get it from the db with the optional request parameter
    }

    return "users/view";
}

私のアプローチは推奨されますか?それとも私はこれを完全に間違って見ていますか?

4

1 に答える 1

5

より良い方法は、にリダイレクトすることapp.com/users/view/1です。

まず、モデルに加えた最新の変更がありますが、別の同時ユーザーが同時に行った可能性のある変更はないためです。

2つ目は、アプリをステートレスにするため、同時によりスケーラブルでシンプルになるためです。

3つ目は、表示ページには編集ページよりもユーザーに関する詳細情報が必要な場合があるためです。ユーザーの多くの関連付けを示す大きな詳細ページが表示されることはかなり頻繁にありますが、編集ページには変更可能な情報がいくつかあります。したがって、編集ページのモデルを保存して表示ページで使用できるようにするだけでは不十分です。

第4に、このように、ユーザーの詳細を表示するロジックは1つの場所にあり、それを実行できるURLは1つだけです。

第5に、この方法では、ユーザーはURLをブックマークするか、電子メールで誰かに送信することができ、後でこのURLに戻った場合に機能します。一方、現在のソリューションでは、URLは、直前にユーザーを編集した場合にのみ機能します。

于 2012-05-31T06:10:38.160 に答える