Spring MVC中用于定义控制器的注解有@Controller和@RestController,两者都用于声明某个类为Web层的控制器,但它们在功能上有明显差异。
当使用@Controller注解时,控制器类中的方法通常返回一个字符串,代表逻辑视图的名称。这个视图名将被解析为一个实际的视图,如一个JSP、Thymeleaf或FreeMarker模板。
如果想从@Controller注解的类中的方法返回数据,而不是视图,则可以在该方法上使用@ResponseBody注解。这样,返回的数据会被直接写入HTTP响应体,通常用于返回JSON或XML格式的数据。
@Controller示例代码如下。
@Controller public class WebController { @GetMapping("/page") public String getPage() { // 返回index视图(例如: index.jsp 或 index.html) return "index"; } @GetMapping("/data") @ResponseBody public List<String> getData() { // 直接返回书籍列表 return Arrays.asList("The Great Gatsby", "Moby Dick", "War and Peace"); } }
这段代码定义了名为WebController的控制器类,该控制器有两个处理方法,分别处理两种不同的HTTP GET请求。
@GetMapping("/page"):此注解将getPage方法与/page路径的HTTP GET请求相关联。该方法返回一个字符串,代表视图名称。在这个示例中,它返回index,这意味着请求将被解析并展示为名为index的视图。
@GetMapping("/data"):此注解将getData方法与/data路径的HTTP GET请求相关联。由于该方法上额外添加了@ResponseBody注解,其返回值将直接写入HTTP响应体中,而不是被解析为视图名称。因此,它将返回一个包含三本书名的JSON数组。
@RestController是@Controller和@ResponseBody注解的结合体。它标记一个类为控制器,且类中的每个方法默认返回数据而非视图。使用@RestController的控制器方法直接将返回值写入HTTP响应体,无须在每个方法上单独添加@ResponseBody。
@RestController示例代码如下。
@RestController public class ApiController { @GetMapping("/data") public List<String> getData() { // 直接返回书籍列表 return Arrays.asList("The Great Gatsby", "Moby Dick", "War and Peace"); } }
需要注意的是,当@Controller用于返回视图(如JSP、Thymeleaf、FreeMarker等)时,通常表示前端和后端逻辑在同一个项目或应用中。这种架构常被称为“单体应用”或“传统的Web应用”。在这种情况下,前后端并不是完全分离的。
在前后端分离的架构中,后端通常只提供数据接口,如RESTful API,使用@RestController来返回数据而不是视图;前端则是一个独立的应用,如使用Vue.js、React、Angular等框架构建的SPA(单页应用)。