【问题标题】:How request parameter binding and type conversion works in spring-mvc?spring-mvc 中请求参数绑定和类型转换是如何工作的?
【发布时间】:2016-06-13 09:11:56
【问题描述】:

我不了解Spring MVC的流程,这里有一些我面临的疑问。

@RequestMapping(value = "/addUser",method = RequestMethod.POST)
public ModelAndView addUser(@RequestParam("name") String name, @RequestParam("age") Integer age)
{
   // business logic
}
  • nameage 字段是如何绑定的?我的意思是哪个 spring 模块在做它(任何拦截器)?
  • age 字段如何转换为Integer
  • 下面示例中标记为@ModelAttributeUser 对象如何获取分配的表单字段值?

模型属性绑定

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

}
  • 哪个拦截器正在注入HttpSession 对象?
  • 由于User 被标记为Singleton,那么如果我有1000 个用户访问我的Web 应用程序,不是每个用户都会得到不同的对象吗?那singleton怎么样?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:
    1. 当您使用@RequestMapping 注释方法时,RequestMappingHandlerAdapterregister built-in argument resolvers

    2. 将扫描处理程序方法的参数,并根据类型或注释启动适当的参数解析器。比如@RequestParam注解,会调用RequestParamMethodArgumentResolver

    3. 如果适用,参数解析器将进一步指导转换和绑定。转换由ConverterPropertyEditor 的适当实现处理。绑定由DataBinder 的适当实例处理。对于RequestParamMethodArgumentResolver 的情况,例如@RequestParam("age")NumberEditor 指导转换,WebDataBinder 指导绑定。

    您在示例中遇到的不同情况都是上述流程的主题,但不同的参数解析器会起作用,例如ModelAttributeMethodProcessor,不同的编辑器转换器启动(您可以为自定义类型注册自定义转换器,或者对于User,将调用默认构造函数等)

    关于单例困境,它指的是组件的单个实例,它只涉及组件的实例变量。方法和参数可以作为新实例,从单例的角度来看它没有任何作用

    【讨论】:

    • User 对象不是 Spring 组件,它不是一个 bean,其生命周期被管理为像例如 Spring 组件一样控制器类、服务或其他用例如注释的东西@Component@Repository@Service。所以User 类不是单例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多