SpringMVC處理模型數據
模型數據放到域對象裏面(一般指請求域)
Spring mvc裏面有四種方法:
ModelAndView: 處理方法返回值類型為 ModelAndView時, 方法體即可通過該對象添加模型數據
Map 及 Model: 入參為org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 時,處理方法返回時,Map中的數據會自動添加到模型中。
@SessionAttributes: 將模型中的某個屬性暫存到HttpSession 中,以便多個請求之間可以共享這個屬性
@ModelAttribute: 方法入參標註該註解後, 入參的對象就會放到數據模型中
1、控制器處理方法的返回值如果為 ModelAndView, 則其既包含視圖信息,也包含模型數據信息。
jsp:
index:
<a href="springmvc/testModelAndView">Test ModelAndView</a>
success:
<h4>Sucess Page</h4> time: ${requestScope.time } <br><br>
controller:
/** * 目標方法的返回值可以是 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; }
2、Spring MVC 在內部使用了一個org.springframework.ui.Model 接口存儲模型數據
步驟是這樣的:
Spring MVC 在調用方法前會創建一個隱含的模型對象作為模型數據的存儲容器。
如果方法的入參為 Map 或 Model 類型,Spring MVC 會將隱含模型的引用傳 遞給這些入參。在方法體內,開發者可以 通過這個入參對象訪問到模型中的所有數 據,也可以向模型中添加新的屬性數據
index.jsp:
<a href="springmvc/testMap">Test Map</a>
success.jsp:
names: ${requestScope.names }
controller:
/** * 目標方法可以添加 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; }
上面的參數把模型數據放在請求域裏
下面放在session域
若希望在多個請求之間共用某個模型屬性數據,則可以在控制器類上標註一個 @SessionAttributes, Spring MVC 將在模型中對應的屬性暫存到 HttpSession 中。
@SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外,還可以通過模型屬性的對象類型指定哪些 模型屬性需要放到會話中
index.jsp:
<a href="springmvc/testSessionAttributes">Test SessionAttributes</a>
success.jsp:
request user: ${requestScope.user } <br><br> session user: ${sessionScope.user } <br><br> request school: ${requestScope.school } <br><br> session school: ${sessionScope.school } <br><br>
controller中:
控制器上面加@SessionAttributes 有兩個屬性值 既放在請求域 又放在 Session域裏面 value裏面可以放多個key的名字 還可以放class類型的參數 這裏spring類型的也會有同樣的存放效果
/** * @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; }
SpringMVC處理模型數據