SpringMVC確定目標方法POJO類型入參的過程 訪問方法 @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } 1,首先確定一個key值 ①如果目標方法的POJO類型的參數沒有使用@ModelAttribute作為入參修飾,則key為POJO類名的第一個字母小寫 例test(User user){}這樣的方法key就是user ②如果使用了@ModelAttribute來修飾入參,則key為@ModelAttribute注解的value屬性值 例test(@ModelAttribute(value="users") User user){} 這樣的方法key就是users 2,在Model中查找key對應的對象,若果存在,則作為入參傳入 如果在@ModelAttribute標記的方法在Map中保存過這個key的對象,則會獲取到 3,若果不存在,則檢查這個類是否被@SessionAttributes注解修飾,如果使用該注解,這個注解中value包含了key, 則會從HttpSession中獲取key對應的對象,如果存在,則直接傳入目標方法的入參中,若不存在,則拋出異常 4,如果這個類沒有被@SessionAttributes注解,或者注解的value中不包含key,則會通過反射創建POJO類型的參數,傳入為目標方法的參數 5,SpringMVC會把key和POJO類型的對象保存到Model中,進入保存到request中
拋出異常的情況:(導包部分省略)
/** * Model中查詢不到user,而且存在@SessionAttributes(value="user"),存在value=user,但是session域中不存在user對象,會拋出異常 */ @SessionAttributes(value="user") @Controller public class ModelAndViewAction { @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } }
拋出的異常:
org.springframework.web.HttpSessionRequiredException: Session attribute 'user' required - not found in session
利用@ModelAttribute()注解標記方法,將User對象提前放入Model當中
@SessionAttributes(value="user") @Controller public class ModelAndViewAction { @ModelAttribute("user") public User getUser(){ Family family=new Family(); family.setCity("上海"); User user=new User(1, "張三啊", 12,family); return user; } @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } }
這樣則不會有異常,session域和request域中都存在User對象,key為“user”
@ModelAttribute()注解的方法會在每個目標方法執行前被SpringMVC調用