2014年3月26日 星期三

SpringMVC 幾種返回形式(ModelAndView,@ModelAttribute,Model,@SessionAttribute)

在透過@RequestMapping,

將request導入到@Controller內的function後,

function運作完畢後有幾種返回的形式可以選擇:

1.ModelAndView

當返回為ModelAndView時,

其中已經包含了顯示(View)和模型(Model),

SpringMVC即可透過取得的Model去顯示在View上,

其中的Model可以視為一個Map<String,Object>對象,

有幾個常用的方法如下:
@Controller
@RequestMapping("/testR")
public class TestResponse {

 @RequestMapping("/mav")
 public ModelAndView mar() {
  ModelAndView mav = new ModelAndView();
  mav.addObject("model_name", model_object);
  //添加一個名為model_name的Object對象
  mav.addAllObjects(modelMap);
  //添加一個Map<String,Object>對象,包含多個Object
  mav.setView(view);
  //設定View對象
  mav.setViewName("/testR/mav");
  //設定返回的view名稱,對應InternalResourceViewResolver設定的路徑
  return mav;
 }
}

2.@ModelAttribute

如果希望在function中添加模型,

可以在function的參數中加入@ModelAttribute,

SpringMVC會將request的param對應到你指定的Object中,
@Controller
@RequestMapping("/testR")
public class TestResponse {

 @RequestMapping("/mav")
 public String mar(@ModelAttribute("user") User user) {
  user.setName("test");
  return "/testR/mar";
 }
}

如果是希望在執行每一個function前,

先去做參數對應Object的行為,

可以將@ModelAttribute添加在function前端,
@Controller
@RequestMapping("/testR")
public class TestResponse {

 @RequestMapping("/mav")
 public String mar(@ModelAttribute("user") User user) {
  user.setName("test");
  return "/testR/mar";
 }

 @ModelAttribute("user")
 public User setUser() {
  User user = new User();
  user.setId("test100");
  user.setName("guest");
  return user;
 }
}

這樣在執行mar()之前,

會先去執行setUser的操作,

並將一個名為user的User對象添加到模型中,

然後在執行mar()時,

會將request內有對應User的資料覆蓋在user上。

3.Map & Model

springMVC在執行方法前會先建立一個隱含的模型儲存容器,

如果request中有包含物件模型的話,

便會加入到這個容器中,

在function中也可以從這個容器取得物件,
 @RequestMapping("/model")
 public String model(ModelMap modelMap) {
  User user1 = new User();
  user1.setId("wd123");
  user1.setName("我的名字");
  modelMap.addAttribute("user1", user1);
  User defaultUser = (User) modelMap.get("user");
  defaultUser.setName("defaultName");
  return "/testR/model";
 }

則在返回的/testR/model頁面上,

便可以取得兩個USER物件,

一個是名為user的USER物件,

另一個是名為user1的USER物件。

4.@SessionAttributes

可以在@Controller中標註一個@SessionAttributes,

來將物件模型儲存在HttpSession中,

記得用完要進行setComplete()清除該次的會話資料。
@Controller
@RequestMapping("/testR")
@SessionAttributes("user")
public class TestResponse {

 @RequestMapping("/session")
 public String session(ModelMap modelMap, SessionStatus sessionStatus) {
  User defaultUser = (User) modelMap.get("user");
  if (defaultUser != null) {
   sessionStatus.setComplete();
  }
  return "/testR/session";
 }

2 則留言: