spring mvc 返回方式:ModelAndView, Model, ModelMap, Map,View, String, void

来源:互联网 发布:sougou输入法windows版 编辑:程序博客网 时间:2024/05/01 16:01

Spring Web MVC 提供Model、Map或ModelMap让我们能去暴露渲染视图需要的模型数据。

@RequestMapping(value = "/model")public String createUser(Model model, Map model2, ModelMap model3) {    model.addAttribute("a", "a");    model2.put("b", "b");    model3.put("c", "c");    System.out.println(model == model2);    System.out.println(model2 == model3);    return "success";}

 虽然此处注入的是三个不同的类型(Model model, Map model2, ModelMap model3),但三者是同一个对象

如图所示:


AnnotationMethodHandlerAdapter和RequestMappingHandlerAdapter将使用BindingAwareModelMap作为模型对象的实现,即此处我们的形参(Model model, Map model2, ModelMap model3)都是同一个BindingAwareModelMap实例。


此处还有一点需要我们注意:

 

@RequestMapping(value = "/mergeModel")public ModelAndView mergeModel(Model model) {    model.addAttribute("a", "a");//①添加模型数据    ModelAndView mv = new ModelAndView("success");    mv.addObject("a", "update");//②在视图渲染之前更新③处同名模型数据    model.addAttribute("a", "new");//③修改①处同名模型数据    //视图页面的a将显示为"update" 而不是"new"    return mv;}

 从代码中我们可以总结出功能处理方法的返回值中的模型数据(如ModelAndView)会 合并 功能处理方法形式参数中的模型数据(如Model),但如果两者之间有同名的,返回值中的模型数据会覆盖形式参数中的模型数据。


对应的逻辑视图名为“success”,URL= prefix前缀+视图名称 +suffix后缀组成。

void  如果返回值为空,则响应的视图页面对应为访问地址。

小结:
1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。


Model model, HttpServletRequest request,  ModelMap map 声明变量
request.getSession().setAttribute("test", "haiwei2Session");
request.setAttribute("test", "haiwei1request"); 
map.addAttribute("test", "haiweiModelMap");
model.addAttribute("test", "haiweiModel");

我通过${test}这个方式取值,优先取Model和ModelMap的,Model和ModelMap是同一个东西,谁最后赋值的就取谁的,然后是request,最后是从session中获取


ModelMap和ModelAndView的作用 
ModelMap 
ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数: 
addAttribute(String key,Object value); 
在页面上可以通过el变量方式$key或者bboss的一系列数据展示标签获取并展示modelmap中的数据。 modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址,我们可以通过控制器方法的返回值来设置跳转url地址别名或者物理跳转地址。 

ModelAndView 
ModelAndView对象有两个作用: 
作用一 设置转向地址,如下所示(这也是ModelAndView和ModelMap的主要区别) 
ModelAndView view = new ModelAndView("path:ok"); 

作用二 用于传递控制方法处理结果数据到结果页面,也就是说我们把需要在结果页面上需要的数据放到ModelAndView对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数: 
addObject(String key,Object value); 

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

作用介绍完了后,接下来介绍使用方法 

ModelMap 
ModelMap的实例是由bboss mvc框架自动创建并作为控制器方法参数传入,用户无需自己创建。

Java代码 复制代码 收藏代码
  1. public String xxxxmethod(String someparam,ModelMap model)   
  2. {   
  3.      //省略方法处理逻辑若干   
  4.       //将数据放置到ModelMap对象model中,第二个参数可以是任何java类型   
  5.       model.addAttribute("key",someparam);   
  6.      ......   
  7.      //返回跳转地址   
  8.       return "path:handleok";   
  9. }  
Java代码  收藏代码
  1. public String xxxxmethod(String someparam,ModelMap model)  
  2. {  
  3.      //省略方法处理逻辑若干  
  4.       //将数据放置到ModelMap对象model中,第二个参数可以是任何java类型  
  5.       model.addAttribute("key",someparam);  
  6.      ......  
  7.      //返回跳转地址  
  8.       return "path:handleok";  
  9. }  



ModelAndView 
ModelAndView的实例是由用户手动创建的,这也是和ModelMap的一个区别。

Java代码 复制代码 收藏代码
  1. public ModelAndView xxxxmethod(String someparam)   
  2. {   
  3.      //省略方法处理逻辑若干   
  4.       //构建ModelAndView实例,并设置跳转地址   
  5.       ModelAndView view = new ModelAndView("path:handleok");   
  6.       //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型   
  7.       view.addObject("key",someparam);   
  8.      ......   
  9.      //返回ModelAndView对象view   
  10.       return view;   
  11. }  





0 1
原创粉丝点击