Spring MVC 提供了以下幾種途徑輸出模型數據
一、ModelAndView
處理方法返回值類型爲ModelAndView時。方法體即可通過該對象添加模型數據。即包含視圖信息,有包含模型數據信息
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
private static final String SUCCESS = "success";
/**
* 目標方法的返回值可以是 ModelAndView 類型。
* 其中可以包含視圖和模型信息
* SpringMVC 會把 ModelAndView 的 model 中數據放入到 request 域對象中.
* @return
*/
@RequestMapping(value="/testModelAndView")
public ModelAndView testModelAndView(){
String viewName = SUCCESS;
ModelAndView modelAndView = new ModelAndView(viewName);
//添加模型數據到 modelAndView 中。
modelAndView.addObject("time", new Date());
return modelAndView;
}
}
index.jsp
<a href="springmvc/testModelAndView">test ModelAndView </a>
success.jsp
time: ${requestScope.time }
顯示結果
time: Thu Sep 07 09:30:27 CST 2017
二、Map及Model
入參爲Model、ModelMap或Map 。處理方法返回時,Map中的數據會自動添加到模型中
@RequestMapping("/test")
public String test(Map<String,Object> map,Model model,ModelMap modelMap){
map.put("names", Arrays.asList("caoyc","zhh","cjx"));
model.addAttribute("time", new Date());
modelMap.addAttribute("city", "ChengDu");
modelMap.put("gender", "male");
return "hello";
}
jsp
names:${requestScope.names }
<br/>time:${requestScope.time}
<br/>city:${requestScope.city }
<br/>gender:${requestScope.gender }
三、@SessionAttributes
將模型中的某個屬性暫存到HttpSession中,以便多個請求之間可以共享這個屬性。此註解在類上標註。
1、names:這是一個字符串數組。裏面應寫需要存儲到session中數據的名稱。
2、types:根據指定參數的類型,將模型中對應類型的參數存儲到session中
3、value:其實和names是一樣的。
@SessionAttributes(value={"user"},types={String.class})
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
private static final String SUCCESS = "success";
/**
* @SessionAttributes 除了可以通過屬性名指定需要放到會話中的屬性外(實際上使用的是 value 屬性值),
* 還可以通過模型屬性的對象類型指定哪些模型屬性需要放到會話中(實際上使用的是 types 屬性值)
* 注意: 該註解只能放在類的上面. 而不能修飾放方法.
*/
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object>map){
User user = new User("Tom","123123","上海",12);
map.put("user", user);
map.put("school", "school");
return SUCCESS;
}
}
jsp
request user: ${requestScope.user }
<br>
session user: ${sessionScope.user }
<br>
request school: ${requestScope.school }
<br>
session school: ${sessionScope.school }
結果
request user: User [username=Tom, password=123123, email=上海, age=12]
session user: User [username=Tom, password=123123, email=上海, age=12]
request school: school
session school: school
四、@ModelAttributes
方法入參標註該註解。入參的對想就會放到數據模型中。
有此註解標記得方法會在每個目標方法之前被springmvc 調用。
@RequestMapping("/springmvc")
@Controller
public class SpringMVCTest {
private static final String SUCCESS = "success";
/**
* 1. 有 @ModelAttribute 標記的方法, 會在每個目標方法執行之前被 SpringMVC 調用!
*/
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,
Map<String, Object>map){
if (id!=null) {
User user = new User(1, "Tom", "123123", "[email protected]", 12);
System.out.println("模擬數據庫查詢:"+user);
map.put("user", user);
}
}
/**
* 運行流程:
* 1. 執行 @ModelAttribute 註解修飾的方法: 從數據庫中取出對象, 把對象放入到了 Map 中. 鍵爲: user
* 2. SpringMVC 從 Map 中取出 User 對象, 並把表單的請求參數賦給該 User 對象的對應屬性.
* 3. SpringMVC 把上述對象傳入目標方法的參數.
*/
@RequestMapping("/testModelArrtibutes")
public String testModelArrtibutes(User user){
System.out.println("修改: " + user);
return SUCCESS;
}
}
inde.jsp
<form action="springmvc/testModelArrtibutes" method="post">
<input type="hidden" name="id" value="1"/>
username: <input type="text" name="username" value="Tom"/>
<br>
email: <input type="text" name="email" value="[email protected]"/>
<br>
age: <input type="text" name="age" value="12"/>
<br>
<input type="submit" value="Submit"/>
</form>
結果
模擬數據庫查詢:User [id=1, username=Tom, password=123123, email=tom@atguigu.com, age=12]
修改: User [id=1, username=Tom, password=123123, email=tom@atguigu.com, age=20]