java可以在@RequestMapping之后调用@ModelAttribute吗?
我有一个这样的控制器:
@Controller
public class HomeController {
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(@RequestParam("user") User user, ModelMap model){
SaveUserToDatabase(user);
return "index";
}
@ModelAttribute("user")
String getUser() {
return LoadCurrentUserFromDataBase();
}
}
简而言之,我的观点会在几乎所有的动作中呈现user
,
但我不想编码:
model.addAttribute("user", LoadCurrentUserFromDataBase())
相反,在每一个动作中,我都在寻找一种像@ModelAttribute
这样的方式来向我所有的观点公开user
然而,根据文档,在同一个控制器中,在@RequestMapping
方法之前调用控制器中的@ModelAttribute
方法
至于我的代码,getUser
在update
之前被调用,但我想得到更新的用户
有没有一种方法可以在操作之后公开user
属性,而不在每个操作中显式调用model.addAttribute
# 1 楼答案
每次执行
POST
时,都要进行重定向。这样,您的POST
方法将只负责更新数据,更新后的数据将由目标控制器加载因此在这种情况下,
update()
方法将重定向到另一个控制器,该控制器将在其GET
方法之前调用getUser()
方法# 2 楼答案
如果Post/redirect/GET解决方案对您有效,那么它就是有效的
然而,我有一个类似的情况,在请求处理(主要是跟踪信息)之后,我的所有控制器都需要编写模型属性。我所做的是注册一个自定义接口(例如^{),我将其应用于所有需要提供额外数据的控制器。接口将有如下方法:
现在,我编写了一个拦截器,它在
postHandle
方法中检查控制器bean的这个接口,并调用这个方法:(上面提到的
ForwardingModel
类创建起来很简单,它只是将所有内容委托给ModelMap
)