如果Handler对象返回了ModelAndView对象,那么说明Handler需要传一个Model实例给View去渲染模板。除了渲染页面需要Model实例外,在业务逻辑层通常也有Model实例,但是这不是本文的重点,本文介绍的Model实例是针对模板渲染来说的。
ModelAndView对象是连接业务逻辑层与View展现层的桥梁,对SpringMVC来说他也是连接Handler与View的桥梁。ModelAndView对象顾名思义会持有一个ModelMap对象和一个View对象或者View的名称。ModelMap对象就是执行模板徐然时所需要的变量对应的实例,如JSP通过request.getAttribute(String)获取的JSTL标签名对应的对象,以及在Velocity中context.get(String)获取的$foo对应的变量实例。
ModelMap其实也是个Map,在Handler中将模板中需要的对象存在这个Map中,然后传递到View对应的ViewResolvers中,不同的ViewResolvers会对这个Map中的对象有不同的处理方式,如Velocity中将这个Map保存到org.apache.velocity.VelocityContext中,而对于freemarker模板引擎来说则将ModelMap包装成freemarker.template.TemplateHashModel。对于JSP来说,将每个ModelMap中的元素分别设置到request.setAttribute(modelName, modelValue)中。