我在春季mvc / rest开发区已经很晚了,所以我试图了解这个概念。
我读了这篇stackoverflow帖子:Which is better, return "ModelAndView" or "String" on spring3 controller,它讨论了ModelAndView的优点,并在控制器上使用String返回(使用Model作为方法参数)。我正在重新发布代码
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ModelAndView list(
@UserAuth UserAuth user,
ModelAndView mav) {
if (!user.isAuthenticated()) {
mav.setViewName("redirect:http://www.test.com/login.jsp");
return mav;
}
mav.setViewName("list");
mav.addObject("articles", listService.getLists());
return mav;
}
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(
@UserAuth UserAuth user,
Model model) {
if (!user.isAuthenticated()) {
return "redirect:http://www.test.com/login.jsp";
}
model.addAttribute("articles", listService.getLists());
return "list";
}
此时,我发现了另一套spring mvc控制器代码:
控制器定义为:
@RestController
public class EmployeeRESTController
这有一个返回EmployeeListVO的方法。
@RequestMapping(value = "/employees")
public EmployeeListVO getAllEmployees()
{
EmployeeListVO employees = new EmployeeListVO();
EmployeeVO empOne = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
EmployeeVO empTwo = new EmployeeVO(2,"Amit","Singhal","asinghal@yahoo.com");
EmployeeVO empThree = new EmployeeVO(3,"Kirti","Mishra","kmishra@gmail.com");
employees.getEmployees().add(empOne);
employees.getEmployees().add(empTwo);
employees.getEmployees().add(empThree);
return employees;
}
这次的另一种方法
@RequestMapping(value = "/employees/{id}")
public ResponseEntity<EmployeeVO> getEmployeeById (@PathVariable("id") int id)
{
if (id <= 3) {
EmployeeVO employee = new EmployeeVO(1,"Lokesh","Gupta","howtodoinjava@gmail.com");
return new ResponseEntity<EmployeeVO>(employee, HttpStatus.OK);
}
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
我找了一些关于@ResponseBody和@ResponseEntity优点的stackoverflow帖子,发帖如下What is the difference between ResponseEntity<T> and @ResponseBody?
我现在的问题是,因为我在这个领域相当新,并且通过示例代码让我对采取什么方法感到困惑,我应该走向哪个方向?我相信返回String时的ModelAndView和Model可能是一种古老的方法吗?也许从ModelAndView到@ResponseBody / @ResponseEntity的历史或过渡可能会有所帮助?这是因为弹簧版本?
为了向我的问题添加上下文,在我目前的工作中,我们使用的是Spring 4,但在代码中我已经看到了代码库中所有这些方法的混合(不同的开发人员在已经x年的代码库。)
我希望mods不会关闭它并将其视为基于意见的。我想我可以向本网站的经验丰富的开发人员寻求指导。
答案 0 :(得分:1)
ModelAndView
以及返回字符串(模板名称)用于您拥有Web界面(例如网站)的情况,因此您使用的是Spring MVC,通常使用@Controller
注释
@ResponseBody
意味着无论你正在回归什么,都将成为回应的主体(响应还有其他部分,如标题等)。 Spring也会尝试将其自动转换为适当的形式,具体取决于给定方法“生成”(并且在@RequestMapping中定义,但不仅仅在那里定义)。例如,使用@RestController
表示无论您在方法中返回什么,都将转换为JSON,除非您另行指定(注意@ResponseBody附加到@RestController)。
ResponseEntity<T>
表示整个回复(正文为T
),不仅仅是@ResponseBody
中的正文。您可以指定标题,响应代码,响应内容(正文),如文件内容,纯文本等。所以基本上您可以为HTTP响应的每个部分建模。
您将使用的内容取决于您,并且仅取决于您的要求。