spring MVC之構造ModelAndView對象
博客分類: spring
spring MVC之構造ModelAndView對象
----------
構造ModelAndView對象
當控制器處理完請求時,通常會將包含視圖名稱或視圖對象以及一些模型屬性的ModelAndView對象返回到DispatcherServlet。因此,經常需要在控制器中構造ModelAndView對象。ModelAndView類提供了幾個重載的構造器和一些方便的方法,讓你可以根據自己的喜好來構造ModelAndView對象。這些構造器和方法以類似的方式支持視圖名稱和視圖對象。
當你只有一個模型屬性要返回時,可以在構造器中指定該屬性來構造ModelAndView對象:
package com.apress.springrecipes.court.web;
...
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class WelcomeController extends AbstractController{
public ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)throws Exception{
Date today = new Date();
return new ModelAndView("welcome","today",today);
}
}
如果有不止一個屬性要返回,可以先將它們傳遞到一個Map中再來構造ModelAndView對象。
package com.apress.springrecipes.court.web;
...
import org.springframework.web.servlet.ModelAndView;
import org. springframework.web.servlet.mvc.AbstractController;
public class ReservationQueryController extends AbstractController{
...
public ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)throws Exception{
...
Map<String,Object> model = new HashMap<String,Object>();
if(courtName != null){
model.put("courtName",courtName);
model.put("reservations",reservationService.query(courtName));
}
return new ModelAndView("reservationQuery",model);
}
}
Spring也提供了ModelMap,這是java.util.Map實現,可以根據模型屬性的具體類型自動生成模型屬性的名稱。
package com.apress.springrecipes.court.web;
...
import org.springframework.ui.ModelMap;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class ReservationQueryController extends AbstractController{
...
public ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)throws Exception{
...
ModelMap model = new ModelMap();
if(courtName != null){
model.addAttribute("courtName",courtName);
model.addAttribute("reservations",reservationService.query(courtName));
}
return new ModelAndView("reservationQuery",model);
}
}
由於這兩個模型屬性的類型爲String和List<Reservation>,ModelMap會爲它們生成默認的名稱----string和reservationList。如果你不喜歡這些名稱,可以顯式地指定它們。
構造完ModelAndView對象之後,仍然可以利用addobject()方法爲它添加模型屬性。這個方法返回ModelAndView對象
本身,因此可以在一個語句中構造ModelAndView對象。請注意,你也可以省略addObject()方法的屬性名稱。在這種情況下,這個方法會與ModeMap生成相同的屬性名稱。
package com.apress.springrecipes.court.web;
...
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class ReservationQueryController extends AbstractController{
...
public ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response)throws Exception{
....
List<Reservation> reservations = null;
if(courtName != null){
reservations = reservationService.query(courtName);
}
return new ModelAndView("reservationQuery","courtName",courtName)
.addObject("reservations",reservations);
}
}
事實上,返回的模型和視圖都是可選的。在有些情況下,你只返回視圖,模型中沒有任何屬性。或者只返回模型,讓Spring MVC根據請求URL來決定視圖。有時候,如果讓控制器直接處理HttpServletResponse對象,甚至可以返回null,例如在將二進制文件返回給用戶的時候。