在 Spring MVC 中,@Controller
和@RestController
注释都用于根据 MVC 设计模式定义 Web 控制器。控制器负责处理 HTTP 请求并将 HTTP 响应返回给客户端。
这两个注解的主要区别在于它们如何处理客户端的请求以及何时使用它们
例如,@Controller注释从第一天起就存在,它用于将类标记为 Web 控制器来处理 HTTP 请求并返回视图名称,然后由视图解析器解析以生成最终的 HTML 视图。
另一方面,@RestController
在 Spring 3.4 等后续版本中添加了注释,以增加对 REST API 开发的支持。对于 REST API,您可能不希望返回 HTML,而是返回 JSON 或 XML,因为您的客户端不再是人类,而是机器。
如果您想从 Spring MVC 控制器返回 JSON 或 XML,那么您需要向每个控制器方法添加 @ReseponseBody 注释,而在使用 Spring 和 Spring Boot 实现 REST API 时,这似乎有点过分了。
Spring框架的设计者和开发者认识到了这个缺点,于是在Spring 3.4版本中添加了一个名为@RestController的新注解。
注解是和注解@RestController
的组合,您可以使用它在 Java 和 Spring Boot 中实现 REST API。@Controller
@ResponseBody
@Controler
和注解之间的主要区别@RestController
是@ResponseBody注解,@
Controler
它不会自动将@ResponseBody
注解添加到控制器的所有方法中,这意味着如果要返回JSON或XML响应,则需要将其单独添加到每个方法中。@RestController
自动将@ResponseBody
注释添加到控制器的所有方法中。
现在让我们看看Spring框架中@Controller和@RestController注解的示例
Spring Boot 中的 @Controller 和 @RestController 示例
下面是一个简单的注释示例@Controller
,用于返回"/hello"
路径上简单 HTTP 请求的响应:
@Controller
public class MyController {
@Autowired
private MyService myService;
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", myService.getHelloMessage());
return "hello";
}
}
在此示例中,该类使用注释MyController
进行了@Controller
注释,并具有单个方法 ,sayHello()
该方法映射到/hello
URL。
该方法将一个Model
对象作为参数,并添加一个对其调用的属性"message"
。然后该方法返回一个字符串“hello”,它是要呈现的视图的名称。
现在,让我们看一个来自 Spring Framework 的注释示例@RestController
,我用它来响应 REST API
@RestController
public class MyRestController {
@Autowired
private MyService myService;
@RequestMapping("/greeting")
public Greeting getGreeting() {
return myService.getGreeting();
}
}
在此示例中,该类MyRestController
用 进行注释@RestController
并具有单个方法 ,getGreeting()
该方法映射到/greeting
URL。
该方法返回该类的一个对象Greeting
,该对象将自动转换为 JSON 或 XML 表示形式,并作为响应发送给客户端。
还值得注意的是,该类Greeting
应该具有getters
和setters
为您想要包含在响应中的数据,否则,它将无法正确序列化或转换为 JSON。
Spring Boot 中的 @Controller 和 @RestController 注解
@Controller
使用和注释时需要记住以下几点@RestController
:
- 使用@Controller注解时,需要使用@ResponseBody注解来返回JSON或XML数据,否则,响应将被视为视图名称,视图解析器将尝试解析它,而@ResponseBody注解不是必需的因为它已经包含在注释中。
- 使用@RestController注解时,还可以使用@ResponseStatus注解设置响应的HTTP状态码 ,使用@RequestBody注解将请求体绑定到方法参数。
- 在使用 @RestController 注释时,您可以使用@RequestMapping 注释来设置将方法映射到的 URL 路径。
- 另一件值得注意的事情是,如果您返回包含子对象的复杂对象,请确保所有子对象类都有 getter 和 setter,否则它们将无法正确序列化。
这就是Spring Boot中@Controller和@RestController注解的区别。请记住,@Controller 用于创建返回视图的 Web 控制器,并由视图解析器进一步解析,而@RestController
用于创建返回 JSON 或 XML 数据的 Web 服务。
部分文章内容可能来自互联网,如有侵权,请通过邮件联系
暂无评论内容