栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC ModelAndView的用法使用详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC ModelAndView的用法使用详解

(一)使用ModelAndView类用来存储处理完后的结果数据,以及显示该数据的视图。从名字上看ModelAndView中的Model代表模型,View代表视图,这个名字就很好地解释了该类的作用。业务处理器调用模型层处理完用户请求后,把结果数据存储在该类的model属性中,把要返回的视图信息存储在该类的view属性中,然后让该ModelAndView返回该Spring MVC框架。框架通过调用配置文件中定义的视图解析器,对该对象进行解析,最后把结果数据显示在指定的页面上。

具体作用:

1、返回指定页面

ModelAndView构造方法可以指定返回的页面名称,

也可以通过setViewName()方法跳转到指定的页面 ,

2、返回所需数值

使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。

1、【其源码】:熟悉一个类的用法,最好从其源码入手。

public class ModelAndView { 
 
   
  private Object view //该属性用来存储返回的视图信息
 
private ModelMap model;//该属性用来存储处理后的结果数据 
 
 
private boolean cleared = false; 
 
 
 
public ModelAndView() { 
} 
 
 
public ModelAndView(String viewName) { 
  this.view = viewName; 
} 
 
 
public ModelAndView(View view) { 
  this.view = view; 
} 
 
 
public ModelAndView(String viewName, Map model) { 
  this.view = viewName; 
  if (model != null) { 
    getModelMap().addAllAttributes(model); 
  } 
} 
 
 
public ModelAndView(View view, Map model) { 
  this.view = view; 
  if (model != null) { 
    getModelMap().addAllAttributes(model); 
  } 
} 
 
 
public ModelAndView(String viewName, String modelName, Object modelObject) { 
  this.view = viewName; 
  addObject(modelName, modelObject); 
} 
 
 
public ModelAndView(View view, String modelName, Object modelObject) { 
  this.view = view; 
  addObject(modelName, modelObject); 
} 
 
 
 
public void setViewName(String viewName) { 
  this.view = viewName; 
} 
 
 
public String getViewName() { 
  return (this.view instanceof String ? (String) this.view : null); 
} 
 
 
public void setView(View view) { 
  this.view = view; 
} 
 
 
public View getView() { 
  return (this.view instanceof View ? (View) this.view : null); 
} 
 
 
public boolean hasView() { 
  return (this.view != null); 
} 
 
 
public boolean isReference() { 
  return (this.view instanceof String); 
} 
 
 
protected Map getModelInternal() { 
  return this.model; 
} 
 
 
public ModelMap getModelMap() { 
  if (this.model == null) { 
    this.model = new ModelMap(); 
  } 
  return this.model; 
} 
 
 
public Map getModel() { 
  return getModelMap(); 
} 
 
 
 
public ModelAndView addObject(String attributeName, Object attributevalue) { 
  getModelMap().addAttribute(attributeName, attributevalue); 
  return this; 
} 
 
 
public ModelAndView addObject(Object attributevalue) { 
  getModelMap().addAttribute(attributevalue); 
  return this; 
} 
 
 
public ModelAndView addAllObjects(Map modelMap) { 
  getModelMap().addAllAttributes(modelMap); 
  return this; 
} 
 
 
 
public void clear() { 
  this.view = null; 
  this.model = null; 
  this.cleared = true; 
} 
 
 
public boolean isEmpty() { 
  return (this.view == null && CollectionUtils.isEmpty(this.model)); 
} 
 
 
public boolean wasCleared() { 
  return (this.cleared && isEmpty()); 
} 
 
 
 
@Override 
public String toString() { 
  StringBuilder sb = new StringBuilder("ModelAndView: "); 
  if (isReference()) { 
    sb.append("reference to view with name '").append(this.view).append("'"); 
  } 
  else { 
    sb.append("materialized View is [").append(this.view).append(']'); 
  } 
  sb.append("; model is ").append(this.model); 
  return sb.toString(); 
} 

在源码中有7个构造函数,如何用?是一个重点。

构造ModelAndView对象当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。

因此,经常需要在控制器中构造ModelAndView对象。

ModelAndView类提供了几个重载的构造器和一些方便的方法,让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。

通过ModelAndView构造方法可以指定返回的页面名称,也可以通过setViewName()方法跳转到指定的页面 , 使用addObject()设置需要返回的值,addObject()有几个不同参数的方法,可以默认和指定返回对象的名字。

(1)当你只有一个模型属性要返回时,可以在构造器中指定该属性来构造ModelAndView对象:

package com.apress.springrecipes.court.web; 
... 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.AbstractController; 
public class WelcomeController extends AbstractController{ 
  public ModelAndView handleRequestInternal(HttpServletRequest request, 
    HttpServletResponse response)throws Exception{ 
    Date today = new Date(); 
    return new ModelAndView("welcome","today",today); 
  } 
}

(2)如果有不止一个属性要返回,可以先将它们传递到一个Map中再来构造ModelAndView对象。

package com.apress.springrecipes.court.web; 
... 
import org.springframework.web.servlet.ModelAndView; 
import org. springframework.web.servlet.mvc.AbstractController; 
public class ReservationQueryController extends AbstractController{ 
  ... 
  public ModelAndView handleRequestInternal(HttpServletRequest request, 
    HttpServletResponse response)throws Exception{ 
    ... 
    Map model = new HashMap(); 
    if(courtName != null){ 
      model.put("courtName",courtName); 
      model.put("reservations",reservationService.query(courtName)); 
    } 
    return new ModelAndView("reservationQuery",model); 
  } 
} 

Spring也提供了ModelMap,这是java.util.Map实现,可以根据模型属性的具体类型自动生成模型属性的名称。

package com.apress.springrecipes.court.web; 
... 
import org.springframework.ui.ModelMap; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.AbstractController; 
public class ReservationQueryController extends AbstractController{ 
  ... 
  public ModelAndView handleRequestInternal(HttpServletRequest request, 
    HttpServletResponse response)throws Exception{ 
    ... 
    ModelMap model = new ModelMap(); 
    if(courtName != null){ 
      model.addAttribute("courtName",courtName); 
      model.addAttribute("reservations",reservationService.query(courtName)); 
    } 
    return new ModelAndView("reservationQuery",model); 
  } 
} 

这里,我又想多说一句:ModelMap对象主要用于传递控制方法处理数据到结果页面,

也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。

通过以下方法向页面传递参数:

addAttribute(String key,Object value); //modelMap的方法

在页面上可以通过el变量方式${key}或者bboss的一系列数据展示标签获取并展示modelmap中的数据。

modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址,那么我们可以通过控制器方法的返回值来设置跳转url地址别名或者物理跳转地址。 比如:

public String xxxxmethod(String someparam,ModelMap model) 
{ 
   //省略方法处理逻辑若干 
   //将数据放置到ModelMap对象model中,第二个参数可以是任何java类型 
   model.addAttribute("key",someparam); 
   ...... 
   //返回跳转地址 
   return "path:handleok"; 
} 

在这些构造函数中最简单的ModelAndView是持有View的名称返回,之后View名称被view resolver,也就是实作org.springframework.web.servlet.View接口的实例解析,

例如: InternalResourceView或JstlView等等:ModelAndView(String viewName);

如果您要返回Model对象,则可以使用Map来收集这些Model对象,然后设定给ModelAndView,使用下面这个版本:

ModelAndView:ModelAndView(String viewName, Map model),Map对象中设定好key与value值,之后可以在视图中取出
如果您只是要返回一个Model对象,则可以使用下面这个 ModelAndView版本:

ModelAndView(String viewName, String modelName, Object modelObject),其中modelName,您可以在视图中取出Model并显示 

ModelAndView类别提供实作View接口的对象来作View的参数:

ModelAndView(View view)

ModelAndView(View view, Map model)

ModelAndView(View view, String modelName, Object modelObject)

2【方法使用】:给ModelAndView实例设置view的方法有两个:setViewName(String viewName) 和 setView(View view)。

前者是使用viewName,后者是使用预先构造好的View对象。其中前者比较常用。事实上View是一个接口,而不是一个可以构造的具体类,我们只能通过其他途径来获取View的实例。对于viewName,它既可以是jsp的名字,也可以是tiles定义的名字,取决于使用的ViewNameResolver如何理解这个view name。如何获取View的实例以后再研究。

而对应如何给ModelAndView实例设置model则比较复杂。有三个方法可以使用:

addObject(Object modelObject);
addObject(String modelName, Object modelObject);
addAllObjects(Map modelMap);

3【作用简介】:

ModelAndView对象有两个作用:

作用一: 设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别)

ModelAndView view = new ModelAndView("path:ok"); 

作用二 :用于传递控制方法处理结果数据到结果页面,也就是说我们把需要在结果页面上需要的数据放到ModelAndView对象中即可,

他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数:

addObject(String key,Object value); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/135936.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号