SpringMVC——處理數據模型
阿新 • • 發佈:2017-12-29
getclass 字符 訪問 int urn 開發者 入參 請求參數 pes
Spring MVC 提供了以下幾種途徑輸出模型數據:
- ModelAndView: 處理方法返回值類型為 ModelAndView時, 方法體即可通過該對象添加模型數據
- Map 及 Model: 入參為org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 時,處理方法返回時,Map中的數據會自動添加到模型中。
- @SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共享這個屬性
- @ModelAttribute: 方法入參標註該註解後, 入參的對象就會放到數據模型中
一、ModelAndVIew
1、添加模型數據:
- MoelAndView addObject(String attributeName, ObjectattributeValue)
- ModelAndView addAllObject(Map<String, ?> modelMap)
2、設置視圖:
- void setView(View view)
- void setViewName(String viewName)
控制器處理方法的返回值如果為 ModelAndView, 則其既包含視圖信息,也包含模型數據信息。
/** * 目標方法的返回值可以是 ModelAndView 類型。 * 其中可以包含視圖和模型信息 * SpringMVC 會把 ModelAndView 的 model 中數據放入到 request 域對象中. *@return */ @RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String viewName = SUCCESS; ModelAndView modelAndView = new ModelAndView(viewName); //添加模型數據到 ModelAndView 中. modelAndView.addObject("time", new Date());return modelAndView; }
二、Map及Model
1、Spring MVC 在內部使用了一個org.springframework.ui.Model 接口存儲模型數據
2、具體步驟
- Spring MVC 在調用方法前會創建一個隱含的模型對象作為模型數據的存儲容器。 如果方法的入參為 Map 或 Model 類型,Spring MVC 會將隱含模型的引用傳遞給這些入參。在方法體內,開發者可以通過這個入參對象訪問到模型中的所有數據,也可以向模型中添加新的屬性數據
/** * 目標方法可以添加 Map 類型(實際上也可以是 Model 類型或 ModelMap 類型)的參數. * @param map * @return */ @RequestMapping("/testMap") public String testMap(Map<String, Object> map){ System.out.println(map.getClass().getName()); map.put("names", Arrays.asList("Tom", "Jerry", "Mike")); return SUCCESS; }
三、@SessionAttributes
若希望在多個請求之間共用某個模型屬性數據,則可以在控制器類上標註一個 @SessionAttributes, Spring MVC將在模型中對應的屬性暫存到 HttpSession 中。
- @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中
- @SessionAttributes(types=User.class) 會將隱含模型中所有類型為 User.class 的屬性添加到會話中。
- @SessionAttributes(value={“user1”, “user2”})
- @SessionAttributes(types={User.class, Dept.class})
- @SessionAttributes(value={“user1”, “user2”},types={Dept.class})
/** * @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外(實際上使用的是 value 屬性值), * 還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中(實際上使用的是 types 屬性值) * * 註意: 該註解只能放在類的上面. 而不能修飾放方法. */ @RequestMapping("/testSessionAttributes") public String testSessionAttributes(Map<String, Object> map){ User user = new User("Tom", "123456", "[email protected]", 15); map.put("user", user); map.put("school", "atguigu"); return SUCCESS; }
四、@ModelAtrtribute
/** * 1. 有 @ModelAttribute 標記的方法, 會在每個目標方法執行之前被 SpringMVC 調用! * 2. @ModelAttribute 註解也可以來修飾目標方法 POJO 類型的入參, 其 value 屬性值有如下的作用: * 1). SpringMVC 會使用 value 屬性值在 implicitModel 中查找對應的對象, 若存在則會直接傳入到目標方法的入參中. * 2). SpringMVC 會以 value 為 key, POJO 類型的對象為 value, 存入到 request 中. */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Integer id, Map<String, Object> map){ System.out.println("modelAttribute method"); if(id != null){ //模擬從數據庫中獲取對象 User user = new User(1, "Tom", "123456", "[email protected]", 12); System.out.println("從數據庫中獲取一個對象: " + user); map.put("user", user); } } /** * 運行流程: * 1. 執行 @ModelAttribute 註解修飾的方法: 從數據庫中取出對象, 把對象放入到了 Map 中. 鍵為: user * 2. SpringMVC 從 Map 中取出 User 對象, 並把表單的請求參數賦給該 User 對象的對應屬性. * 3. SpringMVC 把上述對象傳入目標方法的參數. * * 註意: 在 @ModelAttribute 修飾的方法中, 放入到 Map 時的鍵需要和目標方法入參類型的第一個字母小寫的字符串一致! * * SpringMVC 確定目標方法 POJO 類型入參的過程 *1. 確定一個 key: *1). 若目標方法的 POJO 類型的參數木有使用 @ModelAttribute 作為修飾, 則 key 為 POJO 類名第一個字母的小寫 *2). 若使用了 @ModelAttribute 來修飾, 則 key 為 @ModelAttribute 註解的 value 屬性值. *2. 在 implicitModel 中查找 key 對應的對象, 若存在, 則作為入參傳入 *1). 若在 @ModelAttribute 標記的方法中在 Map 中保存過, 且 key 和 第一步確定的 key 一致, 則會獲取到. *3. 若 implicitModel 中不存在 key 對應的對象, 則檢查當前的 Handler 是否使用 @SessionAttributes 註解
*修飾,若使用了該註解, 且 @SessionAttributes 註解的 value 屬性值中包含了 key, 則會從 HttpSession 中來
*獲取 key 所對應的 value 值, 若存在則直接傳入到目標方法的入參中. 若不存在則將拋出異常. *4. 若 Handler 沒有標識 @SessionAttributes 註解或 @SessionAttributes 註解的 value 值中不包含 key,
*則會通過反射來創建 POJO 類型的參數, 傳入為目標方法的參數 *5. SpringMVC 會把 key 和 POJO 類型的對象保存到 implicitModel 中, 進而會保存到 request 中. */ @RequestMapping("/testModelAttribute") public String testModelAttribute(@ModelAttribute("user")User user){ System.out.println("修改: " + user); return SUCCESS; }
如果在處理類定義處標註了@SessionAttributes(“xxx”),則 嘗試從會話中獲取該屬性,並將其賦給該入參,然後再用 請求消息填充該入參對象。如果在會話中找不到對應的屬 性,則拋出 HttpSessionRequiredException 異常
SpringMVC——處理數據模型