2016-06-13 33 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