@Controller 是 Spring MVC 中的核心注解,用于标识一个类作为控制器(Controller),负责处理客户端发送的 HTTP 请求并返回响应。它是用于标识类作为控制器,这类控制器中的方法默认情况下返回的是逻辑视图名(View ID),这些视图名会被 ViewResolver(视图解析器)解析为实际的视图资源(如 JSP、Thymeleaf 模板等)。

但现在很多时候都采用前后端分离的开发模式,此时仅使用 @Controller 就不适用了,需要和Spring MVC 提供的另一个注解 @ResponseBody 配合,@ResponseBody 注解的作用是控制器的处理方法不再返回视图名,并且不使用模板引擎,而是方法自己管理响应内容。可以返回字符串、对象或其他数据,根据需要把数据转换成 JSON 或 XML 格式。Spring Boot 默认使用 Jackson 把数据转成 JSON 格式。

package dev.xyz.hello_spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
@ResponseBody
public class HelloController {
  
  @RequestMapping("/hello")
  // 返回字符串
  public String getMethodName() {
      return "Hello";
  }
  
}

Spring Web MVC 中定义一个控制器_前后端分离

package dev.xyz.hello_spring.controller;

import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
@ResponseBody
public class HelloController {
  
  @RequestMapping("/hello")
  // 把数据序列化成 JSON 格式,并返回
  public Map<String, String> getMethodName() {
    return Map.of("method", "getMethodName");
  }
}

Spring Web MVC 中定义一个控制器_数据_02

@ResponseBody 除了可以用在类上,还可以用在方法上,这样在不使用前后端分离的开发模式时,可以使用一些方法返回视图,一些方法使用 @ResponseBody 注解仅返回数据,使用起来也是比较灵活的。

如果采用前后端分离的开发模式,可以使用 @RestController 注解来代替 @Controller 和 @ResponseBody,实际上 @RestController 就是 @Controller 和 @ResponseBody 的组合。

Spring Web MVC 中定义一个控制器_前后端分离_03

到现在控制器就定义好了,但是如何把请求和控制器关方法联起来呢,这就该 @RequestMapping 注解出场了。@RequestMapping 是 Spring MVC 中用于映射 HTTP 请求到控制器方法的核心注解,它可以标注在类或方法上,定义请求的 URL 路径、HTTP 方法、参数等匹配规则。