混淆以下内容:在Spring mvc / rest开发中创建控制器时的ModelAndView,Model,@ ResponseBody,@ ResponseEntity

时间:2017-10-11 20:46:36

标签: spring spring-mvc

我在春季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不会关闭它并将其视为基于意见的。我想我可以向本网站的经验丰富的开发人员寻求指导。

1 个答案:

答案 0 :(得分:1)

ModelAndView以及返回字符串(模板名称)用于您拥有Web界面(例如网站)的情况,因此您使用的是Spring MVC,通常使用@Controller注释

@ResponseBody意味着无论你正在回归什么,都将成为回应的主体(响应还有其他部分,如标题等)。 Spring也会尝试将其自动转换为适当的形式,具体取决于给定方法“生成”(并且在@RequestMapping中定义,但不仅仅在那里定义)。例如,使用@RestController表示无论您在方法中返回什么,都将转换为JSON,除非您另行指定(注意@ResponseBody附加到@RestController)。

ResponseEntity<T>表示整个回复(正文为T),不仅仅是@ResponseBody中的正文。您可以指定标题,响应代码,响应内容(正文),如文件内容,纯文本等。所以基本上您可以为HTTP响应的每个部分建模。

您将使用的内容取决于您,并且仅取决于您的要求。