我见过控制器返回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;
}
两者之间有什么区别,我应该使用哪一种?无论哪种方式,我都可以解决我的观点。
答案 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
可以使用Jackson或JaxB等库分别创建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);
并根据视图解析器
返回到显示所有者jsppublic 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