tob*_*bik 21 java spring spring-mvc
在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数.我只是用@RequestParameter("name")
.但是我可以对请求属性执行相同的操作吗?目前,当我想访问请求属性时,我必须执行以下操作:
MyClass obj = (MyClass) request.getAttribute("attr_name");
Run Code Online (Sandbox Code Playgroud)
但我真的想用这样的东西代替:
@RequestAttribute("attr_name") MyClass obj
Run Code Online (Sandbox Code Playgroud)
不幸的是,它没有这种方式.我可以以某种方式扩展Spring功能并添加我自己的"绑定器"吗?
编辑 (我想要实现的目标):我将当前登录的用户存储在请求属性中.因此,每当我想访问当前登录的用户(这几乎都在每个方法中)时,我必须编写这个额外的行user = (User) request.getAttribute("user");
.我想尽量缩短它,最好将它作为方法参数注入.或者,如果您知道如何通过拦截器和控制器传递某些东西,我会很高兴听到它.
tob*_*bik 33
好吧,我终于明白了模型的工作原理和@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
}
}
Run Code Online (Sandbox Code Playgroud)
getUser()
标有@ModelAttribute
注释的方法将自动填充User user
标记为的所有参数@ModelAttribute
.因此,当调用HandleSomeUrl方法时,调用看起来像MyController.HandleSomeUrl(MyController.getUser(request))
.至少这是我的想象.很酷的是,用户也可以从JSP视图访问而无需任何进一步的努力.
这解决了我的问题,但我还有其他问题.有一个共同的地方,我可以把这些@ModelAttribute
方法,所以他们是我的所有控制器共同的?我可以以某种方式从preHandle()
拦截器的方法内部添加模型属性吗?
Bri*_*ace 10
使用(截至Spring 4.3)@RequestAttribute:
@RequestMapping(value = "someurl", method = RequestMethod.GET)
public String handleSomeUrl(@RequestAttribute User user) {
// ... do some stuff
}
Run Code Online (Sandbox Code Playgroud)
或者如果请求属性名称与方法参数名称不匹配:
@RequestMapping(value = "someurl", method = RequestMethod.GET)
public String handleSomeUrl(@RequestAttribute(name="userAttributeName") User user) {
// ... do some stuff
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
67989 次 |
最近记录: |