11在SpringMVC中响应到浏览器的数据格式,@ResponseBody注解和@RestController复合注解的功能详解

响应数据/转发或重定向页面

参考文章数据交换的常见格式,如JSON格式和XML格式

服务器将接收到请求处理完以后需要将处理结果告知给浏览器即响应,通常有响应要转发/重定向到的页面响应数据(文本数据/json数据)两种方式

  • 如果控制器方法返回值类型为void并且没有通过response对象设置响应体,此时前端控制器会以请求映射的路径作为控制器方法返回的视图名称

响应字符串

在控制器方法中通过response对象的API响应数据到浏览器

html 复制代码
<a th:href="@{/testResponse}">通过servletAPI的response对象响应浏览器数据</a><br>
java 复制代码
@RequestMapping("/testResponse")
public void testResponse(HttpServletResponse response) throws IOException {
    // 将打印的信息作为响应报文的响应体响应到浏览器
    response.getWriter().print("hello,response");
}

@ResponseBody注解的作用是将控制器方法的返回值作为响应报文的响应体响应到浏览器, 此时控制器方法的返回值不再经过视图解析器解析也就不会发生页面跳转

  • @RequestMapping注解的produces属性: 设置控制器方法响应给浏览器数据的类型以及编码类型(解决中文乱码问题),即设置响应头Content-Type的值
html 复制代码
<a th:href="@{/testResponseBody}">通过@ResponseBody响应浏览器数据</a><br>
java 复制代码
// 响应英文
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
    // 浏览器页面显示success,不再跳转页面
    return "success";
}
// 响应中文会有乱码乱码问题,可以使用produces属性设置编码类型,也可以在SpringMVC的配置文件中设置编码过滤器
@RequestMapping(value = "/testResponseBody", produces = "text/html;charset=UTF-8")
@ResponseBody
public String testResponseBody(){
    return "成功";
}

在SpringMVC的配置文件中解决响应中文乱码的问题

xml 复制代码
<!-- 开启mvc注解驱动 -->
<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- 处理响应中文内容乱码 -->
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="defaultCharset" value="UTF-8" />
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html</value>
                    <value>application/json</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

响应对象/集合

需求: 因为服务器并不能直接响应一个Java对象给浏览器,我们可以先将Java对象转换为json对象格式的字符串,然后使用@ResponseBody注解响应到浏览器

第一步: 导入jackson的依赖

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
</dependency>

第二步: 在SpringMVC的核心配置文件中开启mvc的注解驱动

xml 复制代码
<mvc:annotation-driven />

第三步: 在控制器方法上使用@ResponseBody注解进行标识,然后就可以将Java对象直接作为控制器方法的返回值返回

  • HandlerAdaptor中会自动装配一个消息转换器
  • MappingJackson2HttpMessageConverter,可以将响应到浏览器的Java对象自动转换为json格式的对象
html 复制代码
<a th:href="@{/test/ResponseBody/json}">通过@ResponseBody响应浏览器User对象</a><br>
java 复制代码
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseUser(){
    return new User(1001,"admin","123456",23,"男");
}
//浏览器的页面中展示的结果: {"id":1001,"username":"admin","password":"123456","age":23,"sex":"男"}

响应List集合对象时会将list集合转换成json数组

java 复制代码
@RequestMapping("/test/ResponseBody/json")
@ResponseBody
public List<User> toJsonList(){
    List<User> users = new ArrayList<User>();
    User user1 = new User();
    user1.setName("马文");
    user1.setAge(27);
    users.add(user1);
    User user2 = new User();
    user2.setName("马武");
    user2.setAge(28);
    users.add(user2);
    return users;
    //浏览器的页面中展示的结果: [{"name":"马文","age":27,"address":null},{"name":"马武","age":28,"address":null}]
}

响应Map集合时会将map集合转换成json对象

java 复制代码
@RequestMapping("/test/ResponseBody/json")
@ResponseBody  
public Map<String, Object> testResponseBodyJson(){
    User user1 = new User(1001, "admin1", "123456", 20, "男");
    User user2 = new User(1002, "admin2", "123456", 20, "男");
    User user3 = new User(1003, "admin3", "123456", 20, "男");
    Map<String, Object> map = new HashMap<>();
    map.put("1001", user1);
    map.put("1002", user2);
    map.put("1003", user3);
    return map;
}

@RestController复合注解

@RestController注解是SpringMVC提供的标识在控制器类上的复合注解

  • @RestController注解作用是为该控制器类添加@Controller注解,同时为类中每个控制器方法上都添加@ResponseBody注解
java 复制代码
@RestController
// 自动添加@Controller
public class HttpController {
    @RequestMapping("/testRestController")
    // 自动添加@ResponseBody
    public String testRestController(String username, String password){
        // 响应success字符串到浏览器,不再跳转页面
        return "success";
    }
}
相关推荐
黎明晓月17 小时前
PostgreSQL提取JSON格式的数据(包含提取list指定索引数据)
postgresql·json·list
心死翼未伤1 天前
python从入门到精通:pyspark实战分析
开发语言·数据结构·python·spark·json
Mephisto.java1 天前
【大数据学习 | flume】flume Sink Processors与拦截器Interceptor
大数据·sql·oracle·sqlite·json·flume
ac-er88882 天前
ThinkPHP中使用ajax接收json数据的方法
前端·ajax·json·php
0x派大星2 天前
【Golang】——Gin 框架中的 API 请求处理与 JSON 数据绑定
开发语言·后端·golang·go·json·gin
不能只会打代码2 天前
支持用户注册和登录、发布动态、点赞、评论、私信等功能的社交媒体平台创建!!!
前端·css·后端·html·json·媒体·社交媒体平台
愚公码农2 天前
MySQL json字段索引添加及使用
数据库·mysql·json
楠寻寻3 天前
Spring、SpringMVC、SpringBoot、Mybatis小结
spring boot·spring·mybatis·springmvc
拧螺丝专业户3 天前
gin源码阅读(2)请求体中的JSON参数是如何解析的?
前端·json·gin
Mephisto.java3 天前
【大数据学习 | Spark】yarn-client与yarn-cluster的区别
大数据·sql·oracle·spark·json·database