在 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<T>
表示整个响应(带有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 4 mvc REST XML 和 JSON 响应
如何在 Spring Boot Rest api 中创建安全登录控制器