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


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

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

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

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

    响应字符串

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

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

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

    • @RequestMapping注解的produces属性: 设置控制器方法响应给浏览器数据的类型以及编码类型(解决中文乱码问题),即设置响应头Content-Type的值
    <a th:href="@{/testResponseBody}">通过@ResponseBody响应浏览器数据a><br>
    
    • 1
    // 响应英文
    @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 "成功";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

    
    <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/htmlvalue>
                        <value>application/jsonvalue>
                    list>
                property>
            bean>
        mvc:message-converters>
    mvc:annotation-driven>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    响应对象/集合

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

    第一步: 导入jackson的依赖

    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.12.1version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    <mvc:annotation-driven />
    
    • 1

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

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

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

    @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}]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    @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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    @RestController复合注解

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

    • @RestController注解作用是为该控制器类添加@Controller注解,同时为类中每个控制器方法上都添加@ResponseBody注解
    @RestController
    // 自动添加@Controller
    public class HttpController {
        @RequestMapping("/testRestController")
        // 自动添加@ResponseBody
        public String testRestController(String username, String password){
            // 响应success字符串到浏览器,不再跳转页面
            return "success";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Nginx基本概念和ububtu环境上安装步骤
    JavaScript基础(详细总结)
    瑞芯微 RK1126 平台编译zlib gpac 使用GPAC将H264 H265保存为MP4文件 录像
    Java 内部类
    物联网应用技术专业是属于什么类
    asp.net core MVC 上传单文件与多文件
    从零开始—【Mac系统】MacOS配置Java环境变量
    Mark Word结构详解
    设计模式——行为型——责任链模式Chain Of Responsibility
    【附源码】计算机毕业设计SSM天气预报APP
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/133791133