我有一个弹簧控制器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";
}
我最终得到三个“操作”(新建、创建和查看)。我要实现的是: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
withoutRedirectAttributes
并且该模型不可用。
另一种选择是在 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";
}
推荐我的方法吗?还是我完全看错了?