在Spring MVC中,将请求参数绑定到处理请求的方法参数很容易。我只是用@RequestParameter("name")。但是我可以对request 属性做同样的事情吗?当前,当我要访问request 属性时,我必须执行以下操作:
@RequestParameter("name")
MyClass obj = (MyClass) request.getAttribute("attr_name");
但是我真的很想使用这样的东西:
@RequestAttribute("attr_name") MyClass obj
不幸的是,这种方式行不通。我可以以某种方式扩展Spring功能并添加自己的“绑定器”吗?
编辑 (我要实现的目标):我将当前登录的用户存储在request属性中。因此,每当我要访问当前登录的用户(几乎在每种方法中都需要访问)时,都必须编写此额外的行user = (User) request.getAttribute("user");。我想使其尽可能短,最好将其作为方法参数注入。或者,如果你知道另一种如何在拦截器和控制器之间传递内容的方法,我将很高兴听到。
user = (User) request.getAttribute("user");
好吧,我终于了解了模型的工作原理和@ModelAttribute用途。这是我的解决方案。
@ModelAttribute
@Controller class MyController { @ModelAttribute("user") public User getUser(HttpServletRequest request) { return (User) request.getAttribute("user"); } @RequestMapping(value = "someurl", method = RequestMethod.GET) public String HandleSomeUrl(@ModelAttribute("user") User user) { // ... do some stuff } }
getUser()标有@ModelAttribute注解的方法将自动填充User user标有的所有参数@ModelAttribute。因此,当调用HandleSomeUrl方法时,调用看起来像MyController.HandleSomeUrl(MyController.getUser(request))。至少这是我的想象。很棒的事情是,用户也可以从JSP视图进行访问,而无需任何进一步的努力。
getUser()
User user
MyController.HandleSomeUrl(MyController.getUser(request))
这确实解决了我的问题,但是我还有其他问题。我可以在这些地方放置这些@ModelAttribute方法,使它们对我所有的控制器都通用吗?我可以以某种方式从preHandle()拦截器的方法内部添加模型属性吗?
preHandle()