在Spring MVC中,@Controller
和@RestController
注释都用于根据MVC设计模式定义Web控制器。控制器负责处理HTTP请求并向客户端返回HTTP响应。
这两个注释之间的主要区别在于它们如何处理客户端的请求以及何时使用它们
例如,@Controller,它用于将类标记为Web控制器以处理HTTP请求并返回视图名称,然后由视图解析器解析以生成最终的HTML视图。
另一方面,@RestController
在Spring 3.4等更高版本中添加,以增加对REST API开发的支持。在REST API的情况下,您可能会喜欢返回JSON或XML,而不是返回HTML。
如果你想从Spring MVC控制器返回JSON或XML,那么你需要将@ReseponseBody 添加到每个Controller方法中,在使用Spring和SpringBoot实现REST API时,这似乎有些过头了。
Spring Framework的设计人员和开发人员认识到了这个缺点,然后在Spring 3.4版本中添加了一个名为@RestController的新注释。
@RestController
是@Controller
和@ResponseBody
的组合,您可以使用它在Java和SpringBoot中实现REST API。
@Controler
和@RestController
之间的主要区别是@ResponseBody,@
Controler
不会自动将@ResponseBody
添加到控制器的所有方法中,这意味着如果您想要返回JSON或XML响应,则需要将其单独添加到每个方法中。@RestController
将自动添加到所有控制器的方法中。
Spring框架中@Controller和@RestController 的示例:
@Controller
public class TestController {
@Autowired
private TestService testService;
@RequestMapping("/hello")
public String sayHello(Model model) {
model.addAttribute("message", testService.getHelloMessage());
return "hello";
}
}
在上例中,MyController
类使用@Controller
注释进行注释,并具有单个方法sayHello()
,该方法映射到/hello
URL。
该方法接受一个Model
对象作为参数,并向其添加一个名为"message"
的属性。然后该方法返回一个字符串“hello”,这是要呈现的视图的名称。
@RestController
annotation的示例
@RestController
public class TestRestController {
@Autowired
private TestService testService;
@RequestMapping("/greeting")
public Greeting getGreeting() {
return testService.getGreeting();
}
}
在本例中,TestRestController
类使用@RestController
进行注释,并且有一个映射到getGreeting()
URL的方法/greeting
。
该方法返回一个Greeting
类的对象,该对象将自动转换为JSON或XML表示,并作为响应发送给客户端。
同样值得注意的是,对于您希望包含在响应中的数据,Greeting
类应该具有getters
和setters
,否则,它将无法正确序列化或转换为JSON。