Spring MVC控制器返回类型

Gir*_*ane 30 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"
}
Run Code Online (Sandbox Code Playgroud)

我还看到了控制器返回"ModelAndView"对象类型的示例

public ModelAndView helloWorld() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("helloWorld");
    mav.addObject("message", "Hello World!");
    return mav;
}
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*mas 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";
}
Run Code Online (Sandbox Code Playgroud)

该模型可根据要求自动填充.

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

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

helloWorld视图将自动加载


Ada*_*zyk 16

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

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

通常,spring 3为参数和返回类型提供了更大的灵活性(请参阅Spring文档中的定义@RequestMapping处理程序方法部分).

  • 在较新的MVC 3方法(返回一个`String`)中,`Model`实例如何进入视图?在控制器中我们使用`model.addAttribute(..)`来添加属性,但最终只返回`String`,那么视图解析器如何知道`Model`对象?谢谢! (2认同)

dan*_*nik 6

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

例如:

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

当您点击/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;
    }
Run Code Online (Sandbox Code Playgroud)

在此示例中,您将返回List作为JSON,以防您启用Jackson序列化程序.为了使您能够将以下内容添加到Spring XML中:

<context:annotation-config/> 
Run Code Online (Sandbox Code Playgroud)

而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>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 没有必要直接创建和返回MAV.除此之外,如果你使用`context:annotation-config`你不必手动放置序列化器,如果`jackson`在类路径上,它会自动完成. (2认同)

kal*_*yan 6

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

看看这个问题

还有一堆答案指向@RequestBody.它与你的问题不完全相关.但是,请记住,它会根据使用可用的转换器和resuly将是文档正文的一部分内容,类型转换的对象.