您的位置:首页 > 编程语言 > Java开发

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

2016-03-03 09:31 609 查看
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代码




public String xxxxmethod(String someparam,ModelMap model)

{

//省略方法处理逻辑若干

//将数据放置到ModelMap对象model中,第二个参数可以是任何java类型

model.addAttribute("key",someparam);

......

//返回跳转地址

return "path:handleok";

}

Java代码


public String xxxxmethod(String someparam,ModelMap model)

{

//省略方法处理逻辑若干

//将数据放置到ModelMap对象model中,第二个参数可以是任何java类型

model.addAttribute("key",someparam);

......

//返回跳转地址

return "path:handleok";

}

ModelAndView

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

Java代码




public ModelAndView xxxxmethod(String someparam)

{

//省略方法处理逻辑若干

//构建ModelAndView实例,并设置跳转地址

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

//将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型

view.addObject("key",someparam);

......

//返回ModelAndView对象view

return view;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: