2016-06-13 51 views
1

我不理解Spring MVC的流程,下面是我所面临的一些疑惑。谁在spring-mvc中执行请求参数绑定和类型转换?

@RequestMapping(value = "/addUser",method = RequestMethod.POST) 
public ModelAndView addUser(@RequestParam("name") String name, @RequestParam("age") Integer age) 
{ 
     // demo method 

} 
  • 如何在nameage领域具有约束力?我是谁做的(任何拦截器)?
  • 谁在解析age字段为Integer?
  • 谁约束User在下面的例子中标记为@ModelAttribute的对象?

模型属性结合

@RequestMapping(method = RequestMethod.POST, value = "doLogin") 
public ModelAndView doLogin(@ModelAttribute("user") User userModel, HttpSession httpSession) 
{ 

} 
  • 我们如何在上述方法中获得的HttpSession对象?我的意思是流动的。
  • 在春天组件的范围是Singleton,那么如果我有1000个用户访问我的web应用程序不是每个用户都会得到不同的对象吗?那么它怎么样singleton

回答

6
  1. 当你注释的方法与@RequestMapping,一个RequestMappingHandlerAdapterregister built-in argument resolvers

  2. 处理程序方法的参数将被扫描,并根据类型或注释,一个合适的参数解析器将会插入。例如,对于@RequestParam注释,RequestParamMethodArgumentResolver将被称为

  3. 参数解析器指导进一步转换和绑定(如果适用)。该转换通过适当实施ConverterPropertyEditor来处理。该绑定由DataBinder的适当实例处理。对于RequestParamMethodArgumentResolver和例如@RequestParam("age")NumberEditor指导转换,并且WebDataBinder指导该绑定。

你在你的例子中有不同的情况,都是上述流程的主题,但是不同的参数解析器在例如ModelAttributeMethodProcessor,在(你可以注册自定义类型的自定义的,或为User一个默认的构造函数将被调用等)

关于单身的窘境,它指的是组件的单个实例编辑踢不同的转换器,它只涉及组件的实例变量。方法和内部参数都可以作为新实例从单例角度看它没有任何作用

+0

我不明白Singleton部分,请详细说明它。考虑我有一个用户模型,对于每个请求我有不同的值的用户,那么它是怎么样的单身人士。 – piechuckerr

+0

'User'对象不是一个Spring组件,它不是一个生命周期被管理的bean,因为它是一个Spring组件,例如,控制器类,服务或其他用例如'@ Component','@ Repository','@ Service'。 所以'用户'类不是一个singleton –

+0

对不起,对于后面的回复,但'用户'类的类定义是用'@ Component'注释的。是不是那个意思请求映射'User'与Spring容器构造的那个相同? – piechuckerr