在 Spring mvc/rest 开发中创建控制器时对以下内容感到困惑:ModelAndView、Model、@ResponseBody、@ResponseEntity

Posted

技术标签:

【中文标题】在 Spring mvc/rest 开发中创建控制器时对以下内容感到困惑:ModelAndView、Model、@ResponseBody、@ResponseEntity【英文标题】:Confusion over the following: ModelAndView, Model, @ResponseBody, @ResponseEntity when creating a controller in spring mvc/rest development 【发布时间】:2018-03-23 15:54:35 【问题描述】:

我在春季 mvc/rest 开发领域迟到了,所以我正在努力理解这个概念。

我阅读了这篇 *** 帖子:Which is better, return "ModelAndView" or "String" on spring3 controller,其中讨论了 ModelAndView 的优点并在控制器上使用字符串返回(使用 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 优点的*** 帖子,像这样的帖子What is the difference between ResponseEntity<T> and @ResponseBody?

我现在的问题是,由于我在这个领域还很陌生,并且通过示例代码让我对采用哪种方法感到困惑,我应该朝哪个方向发展?我相信返回 String 时的 ModelAndView 和 Model 可能是一种旧方法?也许从 ModelAndView 到 @ResponseBody / @ResponseEntity 的历史或过渡可能会有所帮助?这是因为春季版本吗?

为了给我的问题添加上下文,在我目前的工作中,我们使用的是 Spring 4,但在代码中,我在代码库中看到了所有这些方法的混合(不同的开发人员在代码库上工作已经有 x 年了)。

我希望模组不会关闭它并将其视为基于意见的。我想我可以在这个网站上向经验丰富的开发人员寻求指导。

【问题讨论】:

对不起,现在不想写一个完整的答案,但我很确定你必须阅读文档 docs.spring.io/spring/docs/4.3.12.RELEASE/… 和 docs.spring.io/spring/docs/4.3.12.RELEASE/… 和 docs.spring.io/spring/docs/4.3.12.RELEASE/… 和 docs.spring.io/spring/docs/4.3.12.RELEASE/… 【参考方案1】:

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

@ResponseBody 意味着无论您要返回什么都将是响应的主体(响应具有其他部分以及标头等)。 Spring 还将尝试根据给定方法“产生”的内容(在 @RequestMapping 中定义但不仅在此处定义),将其自动转换为适当的形式。例如,使用@RestController 意味着您在方法中返回的任何内容都将转换为 JSON,除非您另有说明(注意 @ResponseBody 附加到 @RestController)。

ResponseEntity&lt;T&gt; 表示整个响应(带有T 的正文),而不仅仅是@ResponseBody 中的正文。您可以指定标头、响应代码、响应内容(正文),如文件内容、纯文本等,因此基本上您可以对 HTTP 响应的每个部分进行建模。

您将使用什么取决于您,并且仅取决于您的要求。

【讨论】:

只是为了确保我得到你发布的内容,当专门做rest api工作并期望通过json(通常不是json而不是xml)完成通信时,建议使用@ResponseBody /@ ResponseEntity,但是当开发一个 web 应用程序时,比如说一个使用 thymeleaf 或 jsp 作为视图技术的 webapp,那么使用 spring MVC Model/ModelAndView 更好? 这就是这些工具的用途。只是你没有义务使用一个或另一个。

以上是关于在 Spring mvc/rest 开发中创建控制器时对以下内容感到困惑:ModelAndView、Model、@ResponseBody、@ResponseEntity的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Spring MVC REST 控制器中的 HTTP 标头信息?

Spring MVC 中创建的模型对象到底在哪里?

Spring 4 mvc REST XML 和 JSON 响应

如何在 Spring Boot Rest api 中创建安全登录控制器

Spring MVC REST + Spring Security + 基本身份验证

如何在 Spring Junit 中创建会话