阅读完需:约 3 分钟
在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型,作为模型数据的存储容器, 成为”隐含模型”。
也就是说在每一次的前后台请求的时候会随带这一个背包,不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值;关于这一点,spring里面有一个注解:
@ModelAttribute
:被该注解修饰的方法,会在每一次请求时优先执行,用于接收前台jsp页面传入的参数
例子:
@Controller
public class User1Controller{
private static final Log logger = LogFactory.getLog(User1Controller.class);
// @ModelAttribute修饰的方法会先于login调用,该方法用于接收前台jsp页面传入的参数
@ModelAttribute
public void userModel(String loginname,String password,
Model model){
logger.info("userModel");
// 创建User对象存储jsp页面传入的参数
User2 user = new User2();
user.setLoginname(loginname);
user.setPassword(password);
// 将User对象添加到Model当中
model.addAttribute("user", user);
}
@RequestMapping(value="/login1")
public String login(Model model){
logger.info("login");
// 从Model当中取出之前存入的名为user的对象
User2 user = (User2) model.asMap().get("user");
System.out.println(user);
// 设置user对象的username属性
user.setUsername("测试");
return "result1";
}
在前端向后台请求时,spring会自动创建Model
与ModelMap
实例,我们只需拿来使用即可;

无论是Mode
还是ModelMap
底层都是使用BindingAwareModelMap
,所以两者基本没什么区别;
Model
是每次请求中都存在的默认参数,利用其addAttribute()
方法即可将服务器的值传递到jsp
页面中;
ModelAndView
包含model
和view
两部分,使用时需要自己实例化,利用ModelMap
用来传值,也可以设置view
的名称
三者区别
1.Model是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类
public class ExtendedModelMap extends ModelMap implements Model
2.ModelMap
继承LinkedHashMap
,spring框架自动创建实例并作为controller
的入参,用户无需自己创建
public class ModelMap extends LinkedHashMap<String,Object>
3.ModelAndView
顾名思义,ModelAndView
指模型和视图的集合,既包含模型 又包含视图;ModelAndView
的实例是开发者自己手动创建的,这也是和ModelMap
主要不同点之一;
实例说明
Model的用法
spring自动为Model创建实例,并作为controller的入参

结果:

Model与model用法差不多

效果也和Model一样
ModelAndView的用法

设置view跳转地址
ModelAndView view = new ModelAndView("test");
当然还可以这样设置跳转地址
ModelAndView view = new ModelAndView();
view.setViewName("test");
其中的test表示templates中的test.html,springboot默认的模版文件一般都在resources/templates下

设置view的model
view.addObject("name","zhangxing,hello");
效果:
