23.3 Spring MVC视图 Spring MVC框架主要以控制器和视图为核心,业务控制器调用模型层完成请求处理后,试图层负责把处理完后的数据显示出来。Spring MVC的试图层有其自己的特点,如下 所述。 使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图。 支持多种视图层技术,如JSP/Servlet、Jstl、Velocity等,通过配置相应的视图解析器来实现。 下面对这些特点进行分析。 23.3.1 模型视图类ModelAndView 从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定的页面上。 【示例23-7】下面看ModelAndView.Java的代码,如下所示。 package org.springframework.web.servlet; import Java.util.HashMap; import Java.util.Map; public class ModelAndView { private Object view; //该属性用来存储返回的视图信息 private Map model; //该属性用来存储处理后的结果数据 //下面是一些参数不同的构造函数,用来创建ModelAndView实例 public ModelAndView() { } public ModelAndView(View view) { this.view = view; } public ModelAndView(String viewName) { this.view = viewName; } public ModelAndView(View view, Map model) { this.view = view; this.model = model; } public ModelAndView(String viewName, Map model) { this.view = viewName; this.model = model; } public ModelAndView(View view, String modelName,Object modelObject) { this.view = view; addObject(modelName, modelObject); } public ModelAndView(String viewName, String modelName,Object modelObject) { this.view = viewName; addObject(modelName, modelObject); } //view属性的getter、setter方法,可以看出view属性可以是一个View类的实例,也可 以是一个String public void setView(View view) { this.view = view; } public View getView() { return (this.view instanceof View ? (View) this.view : null); } public void setViewName(String viewName) { this.view = viewName; } public String getViewName() { return (this.view instanceof String ? (String) this.view : null); } public boolean isReference() { return (this.view instanceof String); } //下面的方法用来给model属性赋值、或者获取该属性的值,model是一个Map类型的属性 protected Map getModelInternal() { return this.model; } public Map getModel() { if (this.model == null) { this.model = new HashMap(1); } return this.model; } public ModelAndView addObject(String modelName, Object modelObject) { getModel().put(modelName, modelObject); return this; } public ModelAndView addAllObjects(Map modelMap) { getModel().putAll(modelMap); return this; } ... } 通过上面的代码可以看出,ModelAndView创建了两个属性view和model,并且创建了获取这两个属性以及给这两个属性赋值的一些方法。view属性可以是View接口的一个实例,也可以是一个String类型的值,所有的视图类都必须实现View接口,在后面的内容中将会讲到;model属性是一个Map类型的值,所以其每一个元素都是一个Key-Value对。 说明:回忆Struts2框架,当该框架的业务处理器处理完用户请求后,将数据存储在ActionContext的实例中,在试图层通过OGNL表达式获取该实例中的结果数据。而Spring MVC框架是将结果数据存在ModelAndView类实例的model属性中。