spring处理方法返回值的类型

spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void。下面将对具体的一一进行说明:

ModeAndView:

   
 @RequestMapping("/show1")
 public ModelAndView show1(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ModelAndView mav = new ModelAndView("/demo2/show");
        mav.addObject("account", "account -1");
        return mav;
    }

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

Model:

@RequestMapping("/demo2/show")
    public Map<String, String> getMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("key1", "value-1");
        map.put("key2", "value-2");
        return map;
    }

Map:

@RequestMapping("/demo2/show")
    public Map<String, String> getMap() {
        Map<String, String> map = new HashMap<String, String>();
        map.put("key1", "value-1");
        map.put("key2", "value-2");
        return map;
    }

在jsp页面中可直通过${key1}获得到值, map.put()相当于request.setAttribute方法。

String:

@RequestMapping(value = "/something", method = RequestMethod.GET)
@ResponseBody
public String helloWorld()  {
return "Hello World";
}

String 指定返回的视图页面名称,结合设置的返回地址路径加上页面名称后缀即可访问到。 
注意:如果方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。

Void:

@RequestMapping("/welcome")
public void welcomeHandler() {}

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

以上内容来自:http://flyer2010.iteye.com/blog/1294400


 

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),但如果两者之间有同名的,返回值中的模型数据会覆盖形式参数中的模型数据。

以上内容来自:http://jinnianshilongnian.iteye.com/blog/1698916

posted @ 2015-03-05 13:43  有事没事常回家看看  阅读(871)  评论(0编辑  收藏  举报