- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 spring Controller 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
并且它有效。但感觉应该有更好的方法来实现这一点。我尝试在不使用 RedirectAttributes
的情况下使用 redirect:view
,但模型不可用。
另一种方法是在 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";
}
我的方法值得推荐吗?还是我完全看错了?
最佳答案
更好的方法是重定向到 app.com/users/view/1
。
首先是因为您对模型进行了最新更改,但没有其他并发用户可能同时进行的更改。
其次,因为它使您的应用程序无状态,因此同时更具可扩展性和更简单。
第三,因为查看页面可能需要比编辑页面更多的用户信息。经常有一个很大的详细信息页面显示用户的许多关联,但在编辑页面中只有一些可修改的信息。因此,保存编辑页面的模型以使其可用于 View 页面是不够的。
第四,因为这样,显示用户详细信息的逻辑就在一个地方,而且只有一个可能的 URL 可以做到这一点。
第五,因为这样,用户可以将 URL 加入书签,或通过电子邮件将其发送给某人,如果他稍后返回到该 URL,它就会起作用。而在您当前的解决方案中,该 URL 仅在您之前编辑过用户时才有效。
关于java - Spring Controller : How to properly redirect to action and include model parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10824966/
我是一名优秀的程序员,十分优秀!