Model
Model是org.springframework.ui包中一个接口,定义的方法如下:
其实现类为ExtendedModelMap,继承了ModelMap类,实现了Model接口
public class ExtendedModelMap extends ModelMap implements Model
ModelMap
ModelMap是org.springframework.ui包下的一个类,继承了LinkedHashMap<String, Object>,其方法如下:
Model和ModelMap均用于向页面传递数据,两者通过addAttribute()和addAllAttribute()方法加入需要传递的值,Model和ModelMap传入的值是以key-value形式传入的,前端页面如果要使用数据则使用el表达式语言(${key}),其本质都是使用Request对象向jsp传递数据(request.setAttribute(key,value))。
Model和ModelMap是由SpringMVC自己创建的,如果需要在控制器方法中使用Model和ModelMap只需要在参数中加入Model或ModelMap即可。
Model和ModelView只用于向页面传递数据,不能指定需要跳转的页面,所以引入了Model或ModelView的方法需要返回String,用来表示视图的位置。
ModelAndView
ModelAndView是org.springframework.web.servlet包下的类,它定义了三个属性,分别为:
其中view是需要跳转的视图名,model用于保存需要向页面传递的数据。
ModelAndView需要自己手动创建(即自己new),通过addObject()、addAllObjects()方法添加需要传入的数据,使用setViewName()或setView()来定义视图名称。
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("goodsList",list);
modelAndView.setViewName("show");
ModelAndView可以直接作为控制器方法的返回值:
public class MyExceptionResolver implements HandlerExceptionResolver{
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o, Exception e) {
MyException ex = null;
//对异常进行处理
if(e instanceof MyException){
ex = (MyException) e;
}else {
ex = new MyException("系统正在维护...");
}
//设定返回页面和数据
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMsg",ex.getErrorMsg());
modelAndView.setViewName("error");
return modelAndView;
}
}
总结
ModelAndView和Model/ModelMap的区别:
- Model/ModelMap由SpringMVC自动创建,而ModelAndView需要手动创建
- Model/ModelMap不能指定需要跳转的视图地址,需要在控制器的返回值中设定;而ModelAndView可以指定视图名,直接返回ModelAndView实例即可。