返回处理结果
ModelAndView类包含了逻辑单元返回的结果数据集和表现层信息。ModelAndView本身起到关系保存的作用。它将被传递给Dispatcher,由Dispatcher 根据其中保存的结果数据集和表现层设定合成最后的界面。
这里我们用到了两种签名版本的ModelAndView构造方法:
public ModelAndView(String viewname)
返回界面无需通过结果数据集进行填充。
public ModelAndView(String viewname, Map model)
返回界面由指定的结果数据集加以填充。可以看到,结果数据集采用了Map接口实现的数据类型。其中包含了返回结果中的各个数据单元。
上面这两个版本的构造子中,通过viewname指定了表示层资源。
new ModelAndView(this.getSuccessView(),"loginInfo", loginInfo);上例中的ModelAndView的对象,将loginInfo对象一起传递到SuccessView的视图,我们在视图中通过${loginInfo.username}来得到loginInfo对象的内容。
另外,我们也可以通过传递View对象指定表示层资源。
public ModelAndView(View view)
public ModelAndView(View view, Map model)
我们可以结合RedirectView完成转向功能,如:
return new ModelAndView(new RedirectView("/redirected.jsp"));
当然,我们也可以在带有HttpServletRequest参数的onSubmit方法实现中,通过HttpServletRequest/HttpServletResponse完成forward/redirect功能,这两种途径可以达到同样的效果。
3ModelAndView
通常,Controller在将Web请求处理完成后,会返回一个ModelAndView实例。该ModelAndView实例将包含两部分内容,一部分为视图相关内容,可以是逻辑视图名称,也可以是具体的View实例;另一部分则是模型数据,视图渲染过程中将会把这些模型数据合并入最终的视图输出。
为了方便实例化ModelAndView,该类定义了两组参数各异的构造方法,一组使用逻辑视图名称(logic named view)标志视图,一组直接使用View实例标志视图,如下所示:
public ModelAndView(String viewName)
public ModelAndView(String viewName,Map model)
public ModelAndView(String viewName,String modelName,Object modelObject)
public ModelAndView(View view)
public ModelAndView(View view,Map model)
public ModelAndView(View view,String modelName,Object modelObject)
每组的第一个构造方法只接受视图信息,所以构造完成后,我们通过addAllObject(..)或者addObject(..)实例方法,向构造完成的ModelAndView实例添加模型数据;每组第二个构造方法则可以同时指定视图信息和模型数据信息,如果要添加到模型的只有一个数据对象,那么可以使用每组的第三个构造方法,该构造方法属于第二个构造方法的简化版。
虽然通过ModelAndView可以保存视图的逻辑名称或者具体的View实现类,但是我们更倾向于使用逻辑视图名来标志视图。这样可以给我们的视图选择带来很大的灵活性。
4可用的ViewResolver实现类
Spring MVC提供的ViewResolver划分为两类,一类称为"面向单一视图类型的ViewResolver,另一个类称为面向多视图类型的ViewResolver。
面向单一视图类型的ViewResolver有如下几个:
InternalResourceViewResolver。它是我们使用最多的ViewResolver实现类型,是用来处理JSP模板类型的视图映射。它作为默认的ViewResolver被使用。