@ResponseBody介绍
@ResponseBody
是一个Spring框架中的注解,主要用于Web开发,特别是在Spring MVC框架中。它的核心作用是改变Spring MVC处理HTTP请求响应的行为,使得从控制器方法返回的数据直接写入HTTP响应体(Response Body)中,而不是像默认行为那样去渲染一个视图模板(如JSP、Thymeleaf等)。这在构建RESTful API或者需要直接向客户端返回JSON、XML等数据格式时非常有用。
@ResponseBody源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
源代码截图
@ResponseBody属性介绍
没有属性,哈哈哈。
@ResponseBody注解使用场景
-
返回JSON或XML响应:当你需要从控制器方法返回JSON或XML格式的数据,而不是传统的HTML视图时,可以使用
@ResponseBody
来指示Spring MVC将返回值自动转换为JSON或XML格式。 -
RESTful Web服务:在构建RESTful Web服务时,通常需要返回JSON或XML格式的响应。使用
@ResponseBody
可以非常方便地实现这一点,而不需要编写额外的代码来进行数据转换。 -
简单文本响应:除了JSON和XML,
@ResponseBody
还可以用于返回纯文本响应,例如返回一个简单的字符串或数字。 -
避免视图解析:在某些情况下,你可能不希望Spring MVC进行视图解析,而是直接返回方法的返回值。使用
@ResponseBody
可以避免Spring MVC查找和解析视图。 -
自定义响应:如果你需要自定义响应头或者状态码,并且希望响应体包含特定的数据,
@ResponseBody
可以与@RequestMapping
或其他HTTP特定注解结合使用来实现这一需求。 -
异步请求处理:在处理异步请求时,可以使用
@ResponseBody
来返回异步处理的结果,例如使用DeferredResult
或Callable
返回一个异步的结果。 -
减少模板的使用:在某些情况下,可能不需要使用Spring的视图模板(如Thymeleaf、JSP等),而是直接返回业务数据。
@ResponseBody
可以帮助减少对模板引擎的依赖。 -
与
@RestController
结合使用:@RestController
是@Controller
和@ResponseBody
的快捷方式,用于指示该控制器类中的所有方法都返回响应体而不是视图。这在编写纯RESTful控制器时非常有用。 -
API开发:在开发API时,经常需要返回结构化数据,
@ResponseBody
使得返回JSON或XML格式的数据变得简单直接。 -
前端与后端分离:在现代Web开发中,前端和后端分离是一种常见的架构模式。
@ResponseBody
使得后端可以专注于提供数据,而前端则可以自由地选择如何展示这些数据。
@ResponseBody测试示例代码
示例代码 一
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController
public class MyController {
@GetMapping("/hello")
@ResponseBody
public String sayHello() {
return "Hello, World!";
}
@GetMapping("/user")
@ResponseBody
public User getUser() {
User user = new User();
user.setName("程序员食堂大叔");
user.setAge(25);
return user;
}
}
示例代码二(@ResponseBody注解返回XML)
配置中包含了处理XML的转换器
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new Jaxb2RootElementHttpMessageConverter());
}
}
创建支持XML序列化的Java类使用JAXB注解
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement
public class DemoData {
private String name;
private String description;
}
创建TestController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController
public class TestController {
@GetMapping(value = "/demo/xml/Data", produces = "application/xml")
@ResponseBody
public MyData getDemoXmlData() {
DemoData data = new DemoData ();
data.setName("demo");
data.setDescription("This is an example data.");
return data;
}
}