Spring MVC控制器返回类型

时间:2011-09-12 05:23:51

标签: spring spring-mvc

我见过控制器返回String(表示视图)的例子

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"
}

我还看到控制器返回“ModelAndView”对象类型

的示例
public ModelAndView helloWorld() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("helloWorld");
    mav.addObject("message", "Hello World!");
    return mav;
}

两者之间有什么区别,我应该使用哪一种?无论哪种方式,我都可以解决我的观点。

6 个答案:

答案 0 :(得分:18)

这是相同的逻辑,但它不是春天的版本。

ModelAndView对象是处理模型和视图的spring 2.x方式。 在您给出的示例中,modelandview对象将加载“helloWorld”视图(取决于您的模板引擎可能是helloWorld.jsp,或helloWorld.html,...),模型中包含一个数据“消息”。

另一种方式是spring 3.x方式。您可以编写与helloworld完全相同的示例。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET)
public String helloWorld(Model model) {
    model.addAttribute("message", "Hello World!");
    return "helloWorld";
}

根据要求自动填充模型。

我们可以简化这种表示法,因为url映射“helloWorld”直接是视图名称。

@RequestMapping(value="/helloWorld", method=RequestMethod.GET)
public void helloWorld(Model model) {
     model.addAttribute("message", "Hello World!");
}

将自动加载helloWorld视图

答案 1 :(得分:15)

如果我们谈论的是MVC 3,那么两者都是正确的。但是直接返回ModelAndView是旧的方式,而且更加口头。

如果你只返回一个字符串(没有@ResponseBody,这是其他的东西),这个字符串被视为视图名称,spring将它推送到视图解析器 - 所以,你不必担心(至少,当你是写控制器),你将使用什么类型的视图渲染器(让它成为jsp或速度,它并不重要)。您只传播Model实例,然后提示如何处理它。适当的ModelAndView对象稍后在内部由字符串生成。

通常,spring 3为您提供了更多的参数和返回类型的灵活性(请参阅Spring文档中的Defining @RequestMapping handler methods部分)。

答案 2 :(得分:6)

在Spring MVC中,如果要渲染jsp页面,则应返回ModelAndView

例如:

@RequestMapping(value="/index.html", method=RequestMethod.GET)
    public ModelAndView indexView(){
        ModelAndView mv = new ModelAndView("index");
        return mv;
    }    

当您点击/index.html

时,此函数将返回index.jsp

此外,您可以使用@ResponseBody注释和序列化程序返回任何JSON或XML对象。

例如:

@RequestMapping(value="/getStudent.do",method=RequestMethod.POST)
    @ResponseBody
    public List<Student> getStudent(@RequestParam("studentId") String id){
        List<Student> students = daoService.getStudent(id);
        return students;
    }

在此示例中,您将返回List作为JSON,以防您启用Jackson序列化程序。为了实现这一点,您需要将以下内容添加到Spring XML中:

<context:annotation-config/> 

和Serializer本身:

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
  <list>
    <ref bean="jacksonMessageConverter"/>
  </list>
</property>
</bean>

希望它有所帮助。

答案 3 :(得分:6)

返回ModelAndView或字符串执行相同的工作。它解析为视图(jsp页面)并提供要在视图中呈现的模型对象。如果返回一个字符串,spring会使用viewResolver在内部解析为一个视图,创建一个ModelAndView对象并返回它。 ModelAndView对象的返回来自旧版本。你可以根据自己的方便做到这一点。

看看这个question

一堆答案也指向@RequestBody。它与你的问题不完全相关。但请记住,它将使用可用的转换器基于内容类型转换您的对象,并且resuly将成为文档正文的一部分。

答案 4 :(得分:1)

如果您使用freemarker或velocity等模板语言来创建回复,则可以返回ModelAndView

如果要返回json / xml或某些字符串作为响应(例如:ajax请求),则可以使用第一种方法。我认为它应该是public @ResponseBody String findOwner(@PathVariable String ownerId, Model model),你需要添加一个名为@ResponseBody的注释来指示返回的值应该转换为响应文本。使用@ResponseBody可以使用JacksonJaxB等库分别创建json / xml响应。

这些返回的值将使用messageConverters注册的AnnotationMethodHandlerAdapter进行转换。

参考:http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/

答案 5 :(得分:1)

public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);  
  model.addAttribute("owner", owner);  
  return "displayOwner"
}                       

在这个方法中,返回类型是String,我们将Model作为参数添加,所以要添加一个我们将添加的模型值,如

 modelparam.addAttribute("obj",value);  

并根据视图解析器

返回到显示所有者jsp
public ModelAndView helloWorld() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("helloWorld");
    mav.addObject("message", "Hello World!");
    return mav;
}

在这个方法中,返回类型是ModelAndView,所以我们将返回模型 这里mav是ModelAndView的对象,所以在这里我们应该添加像

model.addObject("object","value");

这里viewname根据viewResolver

返回到helloworld.jsp