私はスプリングコントローラー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
ユーザーが正常に作成されたら、ユーザーをに転送し、入力データを編集不可能なページに表示したいと思います。view
URLが残っているので、戻ることはできません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";
}
私のアプローチは推奨されますか?それとも私はこれを完全に間違って見ていますか?